一、SpringMVC入门
1.1 SpringMVC简介
MVC模型
MVC全称Model View Controller,是一种设计创建Web应用程序的模式。这三个单词分别代表Web应用程序的三个部分:
- Model(模型):指数据模型。用于存储数据以及处理用户请求的业务逻辑。在Web应用中,JavaBean对象,业务模型等都属于Model。
- View(视图):用于展示模型中的数据的,一般为jsp或html文件。
- Controller(控制器):是应用程序中处理用户交互的部分。接受视图提出的请求,将数据交给模型处理,并将处理后的结果交给视图显示。
SpringMVC
SpringMVC是一个基于MVC模式的轻量级Web框架,是Spring框架的一个模块,和Spring可以直接整合使用。SpringMVC代替了Servlet技术,它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无须实现任何接口。
1.2 SpringMVC入门案例
- 使用maven创建web项目,补全结构。
2、入相关依赖和tomcat插件
<dependencies> <!--Spring核心模块--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.13</version> </dependency> <!--SpringWeb模块--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.3.13</version> </dependency> <!--SpringMVC模块(底层是servlet)--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.13</version> </dependency> <!--Servlet,只在编译阶段使用,真正运行的时候用的是tomcat自带的--> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <!--JSP,只在编译阶段使用,真正运行的时候用的是tomcat自带的--> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <!-- tomcat插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <port>8080</port> <path>/</path> <uriEncoding>UTF-8</uriEncoding> <server>tomcat7</server> <systemProperties> <java.util.logging.SimpleFormatter.format>%1$tH:%1$tM:%1$tS %2$s%n%4$s: %5$s%6$s%n </java.util.logging.SimpleFormatter.format> </systemProperties> </configuration> </plugin> </plugins> </build>
3、在web.xml中配置前端控制器DispatcherServlet。
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <!--SpringMVC前端控制器,本质是一个Servlet,接收所有请求,在容器启动时就会加载--> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
4、springmvc.xml文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 扫描包 --> <context:component-scan base-package="com.zj"/> <!-- 开启SpringMVC注解的支持 --> <mvc:annotation-driven/> </beans>
5、编写控制器
@Controller public class MyController { /*该控制器的访问路径为localhost:8080/hello*/ @RequestMapping("/hello") public void HelloMVC(){ System.out.println("Hello MVC"); } }
6、配置tomcat
7、运行并访问即可。
1.3 SpringMVC执行流程
SpringMVC的组件
- DispatcherServlet:前端控制器,接受所有请求,调用其他组件。
- HandlerMapping:处理器映射器,根据配置找到方法的执行链。
- HandlerAdapter:处理器适配器,根据方法类型找到对应的处理器。
- ViewResolver:视图解析器,找到指定视图。
组件的工作流程
- 客户端将请求发送给前端控制器dispatcherServlet。
- 前端控制器将请求发送给处理器映射器,处理器映射器根据路径找到方法的执行链,返回给前端控制器。
- 前端控制器将方法的执行链发送给处理器适配器,处理器适配器根据方法类型找到对应的处理器(拦截器或者是控制器)。
- 处理器执行方法,将结果返回给前端控制器。
- 前端控制器将结果发送给视图解析器,视图解析器找到视图文件位置。
- 视图渲染数据并将结果显示到客户端。
二、SpringMVC参数获取
2.1 封装为简单数据类型(String和基本数据类型)
在Servlet中我们通过request.getParameter(name)获取请求参数。该方式存在两个问题:
- 请求参数较多时会出现代码冗余,参数要一个一个获取。
- 与容器紧耦合。
而SpringMVC支持参数注入的方式用于获取请求数据,即接受简单参数类型时直接将参数封装到方法的参数中。用法如下:
1、前端控制器
/*获取简单类型参数*/ @RequestMapping("/getSimpleParam") public void simpleParam(String userName,int age){ System.out.println(userName); System.out.println(age); }
2、访问
http://localhost:8080/getSimpleParam?userName=zhangsan&age=23
3、运行
2.2 封装为对象类型
SpringMVC支持将参数直接封装为对象,请求参数名和方法参数的属性名相同,即可完成自动封装。写法如下:
1、编写实体类
public class User { private String username; private int age; //get/set/构造方法省略 }
2、控制器
/*获取对象类型*/ @RequestMapping("/getUser") public void getUser(User user){ System.out.println(user); }
3、访问
http://localhost:8080/getUser?username=zhangsan&age=23
4、运行结果
2.3 封装为关联对象
所谓关联对象就是一个对象中还有其他对象。
1、pojo
public class Address { private String addressName; private String postCode; //set/get/构造省略 }
public class User { private String username; private int age; private Address address; //get/set/构造省略 }
2、控制器
/*获取关联对象类型*/ @RequestMapping("/getUser2") public void getUser2(User user){ System.out.println(user); }
3、访问
http://localhost:8080/getUser2?username=zhangsan&age=13&address.addressName=beijing&address.postCode=030000
4、结果
我们也可以使用表单发送带有参数的请求:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>表单提交</title> </head> <body> <form action="/getUser2" method="post"> 姓名:<input name="username"> 年龄:<input name="age"> 住址:<input name="address.addressName"> 邮编:<input name="address.postCode"> <input type="submit"> </form> </body> </html>
2.4 封装集合类型
封装为简单数据类型的List集合
1、控制器
/*封装简单类型的List集合*/ @RequestMapping("/simpleListParam") public void simpleListParam(@RequestParam List<String> list){ for (String s : list) { System.out.println(s); } }
2、访问路径
http://localhost:8080/simpleListParam?list=zhangsan&list=lisi
3、运行结果
该方式也可以绑定数组
@RequestMapping("/listParam2") public void listParam2(@RequestParam String[] users){ System.out.println(users[0]); System.out.println(users[1]); }
封装为对象类型集合
SpringMVC不支持将参数封装为对象类型的List集合,但可以封装到有List属性的对象中。
1、pojo
public class User { private String username; private int age; private List<Address> addressList; //get/set/构造省略 }
2、编写控制器方法
/*对象中包含集合属性*/ @RequestMapping("/pojoList") public void pojoList(User user){ System.out.println(user); }
3、访问
http://localhost:8080/getUser2?username=zhangsan&age=13&addressList[0].addressName=beijing&addressList[0].postCode=030000&addressList[1].addressName=shanghai&addressList[1].postCode=123123
4、结果












