二、SpringMVC的案例分析
文章目录
1、入门程序
1.1创建web工程,引入开发的jar包
- 在pom文件中引入坐标
<dependencies>
<!--创建的是web工程-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<!--引入事务-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<!--引入上下文,IOC-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<!--引入mvc框架-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<!--引入servlet,在编译期间有效,运行期间无效-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!--引入jsp-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
1.2配置核心控制器(DispatcherServlet)
<!--配置servlet的核心控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置servlet的初始化参数,读取springMVC的配置文件,创建spring容器-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--配置springMVC启动时加载对象-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!--“/”代表任何路径均可-->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--配置过滤器,解决中文乱码问题-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!--指定字符集-->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
1.3编写SpringMVC.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--配置spring容器扫描时要创建的包-->
<context:component-scan base-package="com.simon"></context:component-scan>
<!--配置视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--配置spring开启注解mvc的支持-->
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
1.4编写index.jsp和HelloController
-
index.jsp
<html> <body> <h2>Hello World!</h2><br> <!--查找路径--> <a href="user/hello">Simon,你将会成功</a> </body> </html>
-
HelloController
@Controller @RequestMapping(path = "/user")//一级路径 public class HelloController { @RequestMapping(path = "/hello")//二级路径 public String sayHello(){ System.out.println("Hello,SpringMVC"); return "success";//根据视图解析器查找succes.jsp } }
-
success.jsp(在WEB-INF目录下创建pages文件夹,在文件下创建jsp文件)
<html> <body> <h2>Hello Simon!</h2><br> <h2>success</h2> </body> </html>
-
启动tonmcat进行测试
2、执行过程分析
- 入门案例执行流程
- 当启动Tomcat服务器的时候,读取到 web.xml 中的配置创建 spring 容器并且初始化容器中的对象。 从入门案例中可以看到的是:HelloController 和 InternalResourceViewResolver,但是远不 止这些
- 浏览器发送请求(案例中的index.jsp),被 DispatherServlet 捕获,该 Servlet 并不处理请求,而是把请求转发出去。转发 的路径是根据请求 URL,匹配@RequestMapping 中的内容。
- 匹配到了后,执行对应方法。该方法有一个返回值(案例中的success)。
- 根据方法的返回值,借助 InternalResourceViewResolver (视图解析器)找到对应的结果视图
- 渲染结果视图,响应浏览器。
- 组件分析
DispatcherServlet:前端(核心)控制器
用户请求到达前端控制器,它就相当于 mvc 模式中的 c,dispatcherServlet 是整个流程控制的中心,由 它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性
HandlerMapping:处理器映射器
HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的 映射方式,例如:配置文件方式,实现接口方式,注解方式等。
Handler:处理器
它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由 Handler 对具体的用户请求进行处理。 (如Contoller进行具体的处理)
HandlAdapter:处理适配器
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理 器进行执行。
View Resolver:视图解析器
View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名 即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户
View:视图
如常见的.jsp,一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
mvc:annotation-driven
在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。使用mvc:annotation-driven 可以自动加载 RequestMappingHandlerMapping (处理映射器)和 RequestMappingHandlerAdapter ( 处 理 适 配 器 )
3、RequestMapping注解
- RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系
- RequestMapping注解可以作用在方法和类上
作用在类上:第一级的访问目录
作用在方法上:第二级的访问目录
路径可以不编写 / 表示应用的根目录开始
- RequestMapping的属性
path:指定请求路径的url
value:value属性和path属性是一样的
method:指定该方法的请求方式
method=RequestMethod.POST/GET/PUT等
params:指定限制请求参数的条件
@RequestMapping(value="/removeAccount",params= {“accountName”,“money>100”})
NOTE:jsp中的参数必须在url路径上,若是方法上需要有参数,需要在视图的表单内,必须用POST来发送请求体。
headers:发送的请求中必须包含请求头
三、请求参数绑定
1、请求参数的绑定说明
1.1绑定机制
- 表单提交的数据都是k=v格式的 username=haha&password=123
- SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
- 要求:提交表单的name和参数的名称是相同
1.2支持的数据类型
基本数据类型和字符串类型
实体类型(javaBean)
集合数据类型(List、map集合等)
2、基本数据类型和字符串类型
- 提交表单的name和参数的名称是相同的
- 区分大小写
<!-- 基本类型示例 --> <a href="account/findAccount?accountId=10&accountName=zhangsan">查询账户</a>
@RequestMapping("/findAccount") public String findAccount(Integer accountId,String accountName) { }
3、实体类型(JavaBean)
- 提交表单的name和JavaBean中的属性名称需要一致
- 如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如: address.name
<form action="account/saveAccount" method="post"> 账户名称:<input type="text" name="name" ><br/> 账户金额:<input type="text" name="money" ><br/> <!--address是引用类型,包含了provinceName和CityName属性--> 账户省份:<input type="text" name="address.provinceName" ><br/> 账户城市:<input type="text" name="address.cityName" ><br/> <input type="submit" value=" 保存 "> </form>
@RequestMapping("/saveAccount") public String saveAccount(Account account) { }
4、集合属性数据封装
<form action="account/updateAccount" method="post">
用户名称:<input type="text" name="username" ><br/>
用户密码:<input type="password" name="password" ><br/>
用户年龄:<input type="text" name="age" ><br/>
账户 1 名称:<input type="text" name="accounts[0].name" ><br/>
账户 1 金额:<input type="text" name="accounts[0].money" ><br/>
账户 2 名称:<input type="text" name="accounts[1].name" ><br/>
账户 2 金额:<input type="text" name="accounts[1].money" ><br/>
账户 3 名称:<input type="text" name="accountMap['one'].name" ><br/>
账户 3 金额:<input type="text" name="accountMap['one'].money" ><br/>
账户 4 名称:<input type="text" name="accountMap['two'].name" ><br/>
账户 4 金额:<input type="text" name="accountMap['two'].money" ><br/>
<input type="submit" value=" 保存 "> </form>
@RequestMapping("/updateAccount")
public String updateAccount(User user) {
}
5、使用ServletAPI对象作为方法参数
SpringMVC 还支持使用原始 ServletAPI 对象作为控制器方法的参数。支持原始 ServletAPI 对象有:
HttpServletRequest
HttpServletResponse
HttpSession