SpringMVC
开发步骤
-
导入SpringMVC包
-
配置Servlet
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <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:spring-mvc.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>
-
编写Controller
-
将Controller使用注解配置到Spring容器中(@Controller)
package com.ego.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class UserController { @RequestMapping("/quick") public String save(){ System.out.println("controller ruuning..."); return "success.jsp"; } }
-
配置spring-mvc.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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <context:component-scan base-package="com.ego.controller"></context:component-scan> </beans>
-
客户端发起请求(测试)
SpringMVC组件解析
相关组件
- 前端控制器:DispatcherServlet
- 处理器映射器:HandlerMapping
- 处理器适配器:HandlerAdapter
- 处理器:Handler
- 视图解析器:View Resolver
- 视图:View
注解解析
@RequestMapping
- 作用:用于建立请求URL和处理请求方法之间的对应关系
- 位置:
- 类上,请求URL的第一级访问目录
- 方法上,请求URL的第二级访问目录
- 属性:
- value:用于指定请求的URL
- method:用于指定请求的方式
- params:用于指定限制请求参数的条件
SpringMVC的数据响应
数据响应方式
-
页面跳转
-
直接返回字符串
此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转
@RequestMapping("/quick") public String quickMethod(){ return "index"; }
<property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" />
则转发资源地址:/WEB-INF/views/index.jsp
转发:forward:WEB-INF/views/index.jsp
重定向:redirect:/index.jsp
-
通过ModelAndView对象返回
package com.ego.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class UserController { @RequestMapping("/quick") public ModelAndView save(){ ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("username", "ego"); modelAndView.setViewName("src/main/webapp/WEB-INF/success.jsp"); return modelAndView; } }
-
-
回写数据
-
直接返回字符串
package com.ego.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Controller public class UserController { @RequestMapping("/quick") public void save(HttpServletResponse response) throws IOException { response.getWriter().write("hello"); } @RequestMapping("/quick1") @ResponseBody //告知SpringMVC框架 不进行视图跳转 直接进行数据响应 public String save1(){ return "hello"; } }
-
返回对象或集合
mvc注册驱动
<mvc:annotation-driven/ >
-
SpringMVC获得请求数据
获得请求参数
- 基本类型
- POJO类型
- 数组类型
- 集合类型
获得基本类型参数
Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配
获得POJO类型参数
Controller中的业务方法的POJO参数的属性名要与请求参数的name一致,参数值会自动映射匹配
获得数组类型参数
Controller中的业务方法的数组名称要与请求参数的name一致,参数值会自动映射匹配
获得集合类型参数
将集合参数包装到一个POJO中
请求数据乱码问题
<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>
@RequestParam注解
@RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)
语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)
value:参数名
required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。
defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值
自定义类型转换器
开发步骤:
- 定义转换器类实现Converter接口
- 在配置文件中声明转换器
- 在中引用转换器
获得请求头
-
@RequestHeader
属性:
- value:请求头的名称
- required:是否必须携带此请求头
-
@CookieValue
获得指定Cookie的值
属性:
- value:指定Cookie的名称
- required:是否必须携带此Cookie
SpringMVC拦截器
拦截器(interceptor)的作用
类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理
将拦截器按一定的顺序联结成一条链,称为拦截器链
拦截器和过滤器的区别
使用范围:过滤器是Servlet规范中的一部分,任何Java Web工程都可以使用;拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
拦截范围:过滤器在url-pattern中配置了/*之后,可以对所有要访问的资源拦截;拦截器只会拦截访问的控制器方法,如果访问的是jsp,html,css,image或者js是不会进行拦截的
步骤
- 创建拦截器类实现HandlerInterceptor接口
- 配置拦截器
- 测试拦截器的拦截效果
preHandle(): 这个方法在业务处理器处理请求之前被调用,SpringMVC 中的Interceptor 是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor 。每个Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor 中的preHandle 方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值Boolean 类型的,当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方法。
postHandle():这个方法在当前请求进行处理之后,也就是Controller 方法调用之后执行,但是它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。postHandle 方法被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor 的postHandle 方法反而会后执行。
afterCompletion():该方法也是需要当前对应的Interceptor 的preHandle 方法的返回值为true 时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。
SpringMVC异常处理
异常处理思路
系统的Dao、Service、Controller出现异常都向上抛出,最后由SpringMVC前端控制器交给异常处理器进行异常处理
异常处理的两种方式
-
使用SpringMVC提供的简单异常处理器SimpleMappingExceptionResolver
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="defaultErrorView" value="error"/> 默认错误视图 <property name="exceptionMappings"> <map> <entry key="java.lang.ClassCastException" value="error"></entry> <entry key="org.springframework.beans.factory.NoSuchBeanDefinitionException" value="error"></entry> </map> </property> </bean>
-
实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器
步骤:
-
创建异常处理器类实现HandlerExceptionResolver
-
配置异常处理器
-
编写异常页面
-
测试异常跳转
import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyExceptionResolver implements HandlerExceptionResolver { public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { ModelAndView modelAndView = new ModelAndView(); if(e instanceof MyException){ modelAndView.addObject("info", "自定义异常"); }else if(e instanceof ClassCastException){ modelAndView.addObject("info", "转换异常"); } modelAndView.setViewName("error"); return modelAndView; } }
-