Spring入门配置(三) - MVC
一、开发中的主要配置
-
导入相关jar包坐标
spring-context、spring-webmvc、spring-jdbc、spring-tx、servlet-api、jsp-api、jstl、jackson-core、jackson-databind、jackson-annotations等,视需求而定
-
web.xml文件中配置SpringMVC相关
web.xml中filter、listener、servlet配置有先后顺序要求,否则会产生异常
- CharacterEncodingFilter 过滤器,主要用于解决post请求时的乱码问题
<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> <!--使用该编码类型--> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- ContextLoaderListener 监听器,详情请看:Spring入门配置(一) - IOC中第六部分
<!--Spring的监听器--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--全局参数,指定spring配置文件路径--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>
- DispatcherServlet 核心控制器
<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>
- CharacterEncodingFilter 过滤器,主要用于解决post请求时的乱码问题
-
配置spring-mvc.xml
- 配置SpringMVC命名空间
命名空间: xmlns:mvc="http://www.springframework.org/schema/mvc" 约束路径: http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
- 配置MVC注解驱动
<!--mvc的注解驱动,配置处理器映射器HandlerMapping,处理器适配器HandlerAdaptor--> <mvc:annotation-driven/>
- 配置组件扫描
<context:component-scan back-package="包全限定名(controller层)"/>
- 访问静态资源
<mvc:default-servlet-handler/>
- 配置文件配置视图解析器 ViewResolver
视图解析器的默认设置
REDIRECT_URL_PREFIX = "redirect:" --重定向前缀 FORWARD_URL_PREFIX = "forward:" --转发前缀(默认值) prefix = ""; --视图名称前缀 suffix = ""; --视图名称后缀
配置访问jsp页面时的返回数据
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"></property> <property name="suffix" value=".jsp"></property> </bean>
- 拦截器配置
<mvc:interceptors><!--该标签内配置多个拦截器--> <mvc:interceptor> <!--对哪些路径进行拦截,本例中拦截所有--> <mvc:mapping path="/**"/> <mvc:exclude-mapping path=""/> <bean class="MyInterceptor全类名"/> </mvc:interceptor> </mvc:interceptor>
- 异常配置
<bean class="SimpleMappingExceptionResolver全类名"> <property name="defaultErroeView" value="error"/><!--默认错误视图--> <property name="exceptionMappings"> <map> <entry key="MyException全类名" value="error"/> <entry key="其他异常全类名" value="error"/> </map> </property> </bean>
- 其他需要注入的bean等配置
- 配置SpringMVC命名空间
-
常见所需注解
- @RequestMapping("/访问地址")
- 作用:用于建立请求 URL 和处理请求方法之间的对应关系
- 位置:
- 类上,请求URL 的第一级访问目录。此处不写的话,就相当于应用的根目录
- 方法上,请求URL的第二级访问目录,与类上的使用@ReqquestMapping标注的一级目录一起组成访问虚拟路径
- 属性:
- value:用于指定请求的URL。它和path属性的作用是一样的
- method:用于指定请求的方式
- params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样
- 举例:
- params = {"accountName"},表示请求参数必须有accountName
- params = {"moeny!100"},表示请求参数中money不能是100
- @ResponseBody
告知SpringMVC框架,方法返回的字符串不是跳转是直接在http响应体中返回。
- @RequestBody
当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装。
@RequestMapping("/quick13") @ResponseBody public void quickMethod13(@RequestBody List<User> userList)
- @RequestParam
当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定。有以下参数可以使用:
- value:与请求参数名称
- required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错
- defaultValue:当没有指定请求参数时,则使用指定的默认值赋值
<!--form表单代码--> <form action="${pageContext.request.contextPath}/quick14" method="post"> <input type="text" name="name"><br> <input type="submit" value="提交"><br> </form>
//获取请求数据时的注解配置
public void quickMethod14(@RequestParam("name") String username) - @PathVariable(value="name" method=...)
获取Restful风格参数时的配置,Restful风格的请求是使用“url+请求方式”表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:
- GET:用于获取资源
- POST:用于新建资源
- PUT:用于更新资源
- DELETE:用于删除资源
在SpringMVC中可以使用占位符进行参数绑定。地址/user/zhangsan可以写成/user/{name},占位符{name}对应的就是zhangsan的值。在业务方法中我们可以使用@PathVariable注解进行占位符的匹配获取工作。
@RequestMapping("/quick19/{name}") @ResponseBody public void quickMethod19(@PathVariable(value = "name",required = true) String name){ System.out.println(name); }
- @RequestHeader
属性如下:
- value:请求头的名称
- required:是否必须携带此请求头
- @CookieValue
属性如下:
- value:指定cookie的名称
- required:是否必须携带此cookie
- @RequestMapping("/访问地址")
二、获取请求响应数据
- 请求
获取数据方法前需加注解 @ResponseBody
获取集合类型数据:请求数据为json类型时,@RequestBody 注释直接获取
<form action="${pageContext.request.contextPath}/quick12" method="post"> <input type="text" name="userList[0].username"><br> <input type="text" name="userList[0].age"><br> <input type="text" name="userList[1].username"><br> <input type="text" name="userList[1].age"><br> <input type="submit" value="提交"><br> </form>
@RequestMapping("/quick12") @ResponseBody public void quickMethod12(Vo vo) throws IOException { System.out.println(vo.getUserList()); }
- 响应
<!--配置处理器适配器指定类型转换器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean> </list> </property> </bean>
三、拦截器
Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。
将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。
-
拦截器和过滤器的区别
-
自定义拦截器
- 创建拦截器类实现HandlerInterceptor接口
- 配置拦截器
- 测试拦截器的拦截效果
- 创建拦截器类实现HandlerInterceptor接口