java框架之SpringMVC(2)-补充及拦截器
高级参数绑定
package com.zze.springmvc.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import java.util.Arrays; @Controller public class TestController { /** * 数组参数绑定 */ @RequestMapping("test") public void test(Integer[] ids) { System.out.println(Arrays.toString(ids)); /* [1, 2] */ } }
例:数组参数绑定
package com.zze.springmvc.pojo; import java.util.List; public class QueryVo { private List<User> users; public List<User> getUsers() { return users; } public void setUsers(List<User> users) { this.users = users; } } package com.zze.springmvc.web.controller; import com.zze.springmvc.pojo.QueryVo; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import java.util.Arrays; @Controller public class TestController { /** * 集合参数绑定 */ @RequestMapping("test") public void test(QueryVo queryVo) { System.out.println(Arrays.toString(queryVo.getUsers().toArray())); /* [User{id=1, name='zhangsan'}, User{id=2, name='lisi'}] */ } }
例:集合参数绑定
参数转换器
如果要进行日期类型参数绑定,SpringMVC 默认是不支持的,需要我们手动定义一个转换器来告知 SpringMVC 如何转换,如下:
package com.zze.springmvc.web.converter; import org.springframework.core.convert.converter.Converter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * String : 源类型 * Date : 目标类型 */ public class DateConverter implements Converter<String,Date> { public Date convert(String source) { Date date = null; try { date = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(source); } catch (ParseException e) { e.printStackTrace(); } return date; } }
com.zze.springmvc.web.converter.DateConverter : 自定义的日期转换器
<!--自定义转换器工厂--> <bean id="myConverters" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <!--注册自己定义的日期转换器--> <bean class="com.zze.springmvc.web.converter.DateConverter"/> </property> </bean> <!--使用上自定义的转换器工厂--> <mvc:annotation-driven conversion-service="myConverters"/>
config/spring/springmvc.xml : 注册自定义转换器
相关注解
@RequestMapping
package com.zze.springmvc.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class TestController { /** * 请求 /test1 和 /test2 都会指向 test 方法 */ @RequestMapping(value = {"test1", "test2"}) public void test() { } }
例:多路由
package com.zze.springmvc.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("test") public class TestController { /** * 因为类上使用了 RequestMapping 注解,此时 test 方法的访问路径就为: * /test/test1 和 /test/test2 */ @RequestMapping(value = {"test1", "test2"}) public void test() { } }
例:配置在类上
package com.zze.springmvc.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class TestController { /** * 限定请求方法只能为 GET 和 POST */ @RequestMapping(value = "test",method = {RequestMethod.POST,RequestMethod.GET}) public void test() { } }
例:限定请求方式
@RequestParam
package com.zze.springmvc.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller public class TestController { /** * @RequestParam * name 指定所修饰参数对应请求参数名 * required 指定所修饰参数是否必须 * defaultValue 指定所修饰参数的默认值 */ @RequestMapping(value = "test") public void test(@RequestParam(name = "pid",required = false,defaultValue = "1") Integer id) { } }
例:自定义请求参数映射
请求方法的返回值
在 SpringMVC 中,请求方法的返回值除了 ModelAndView,还可以有如下几种方式:
package com.zze.springmvc.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class TestController { /** * 转发到 jsp */ @RequestMapping(value = "test") public String test() { // 因为配置了视图解析器,这里的 userlist 实际指向 /WEB-INF/jsp/userlist.jsp return "userlist"; } }
返回 String,转发到 JSP
package com.zze.springmvc.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class TestController { /** * 转发到 Action */ @RequestMapping(value = "test") public String test() { return "forward:/user/list"; } }
返回 String,转发到 Action
package com.zze.springmvc.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class TestController { /** * 重定向到 Action */ @RequestMapping(value = "test") public String test() { return "redirect:/user/list"; } }
返回 String,重定向到 Action
package com.zze.springmvc.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Controller public class TestController { /** * 访问原生 request 和 response API */ @RequestMapping(value = "test") public void test(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/plain;charset=utf-8"); // request.getRequestDispatcher("/user/list").forward(request,response); 转发 // response.sendRedirect("/user/list"); // 重定向 response.getWriter().write("你好世界"); } }
无返回值,访问原生 Servlet API
请求乱码问题解决
<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-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
WEB-INF/web.xml : 解决 POST 请求乱码
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
tomcat - server.xml : 解决 GET 请求乱码
全局异常处理
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>消息页</title> </head> <body> ${msg} </body> </html>
WEB-INF/jsp/msg.jsp : 1、创建一个消息通知页
package com.zze.springmvc.web.util; 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 request, HttpServletResponse response, Object handler, Exception ex) { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("msg"); modelAndView.addObject("msg", "服务器异常!"); return modelAndView; } }
com.zze.springmvc.web.util.MyExceptionResolver : 2、编写自定义的异常处理器
<!--注册全局异常处理器--> <bean class="com.zze.springmvc.web.util.MyExceptionResolver"/>
config/spring/springmvc.xml : 3、直接注册到 Spring 容器中就可以生效
文件上传
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
pom.xml : 1、添加文件上传依赖
<!-- 配置多媒体处理器 注意:这里的 id 必须使用 multipartResolver --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--限制单次文件上传大小不超过 8m--> <property name="maxUploadSize" value="8388608"/> </bean>
config/spring/springmvc.xml : 2、配置多媒体处理器
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>图片上传</title> </head> <body> <form action="/fileupload" method="post" enctype="multipart/form-data"> <input type="file" name="picFile"> <input type="submit" value="上传"> </form> </body> </html>
WEB-INF/jsp/fileupload.jsp : 3、编写文件上传页面
package com.zze.springmvc.web.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; @Controller public class TestController { @RequestMapping(value = "fileupload", method = RequestMethod.GET) public String upload() { return "fileupload"; } @RequestMapping(value = "fileupload", method = RequestMethod.POST) public String upload(Model model, MultipartFile picFile) throws IOException { File file = new File("D:/upload/" + picFile.getOriginalFilename()); picFile.transferTo(file); model.addAttribute("msg", "上传成功"); return "fileupload"; } }
com.zze.springmvc.web.controller.TestController : 4、编写文件上传服务端代码
// 新建目录 D:/upload // 浏览器访问 localhost:8080/fileupload
5、测试:
JSON交互
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.4.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.4.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.4.2</version>
pom.xml : 加入 json 支持依赖
package com.zze.springmvc.web.controller; import com.zze.springmvc.pojo.User; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import java.text.ParseException; import java.text.SimpleDateFormat; @Controller public class TestController { /** * 返回 JSON 格式数据 * 返回值设为要序列化的类型,并在方法上添加上 @ResponseBody 注解 */ @RequestMapping("getUser") @ResponseBody public User getUser() throws ParseException { User user = new User(); user.setId(1); user.setName("张三"); user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("1998-1-1")); user.setGender("男"); user.setAddress("河北"); return user; } }
返回 JSON 格式数据
package com.zze.springmvc.web.controller; import com.zze.springmvc.pojo.User; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class TestController { /** * 1、使用 @RequestBody 修饰入参 * 2、请求方式为 POST,content-type 为 application/json * 3、json 中字段名与 pojo 属性一致 */ @RequestMapping("addUser") @ResponseBody public User addUser(@RequestBody User user){ System.out.println(user); user.setGender("女"); return user; } }
接收 JSON 格式数据
要使用该方式进行 JSON 交互,必须配置注解驱动。
<!--配置注解驱动,相当于同时使用最新处理器映射器和处理器适配器,同时对 JSON 数据响应提供支持--> <mvc:annotation-driven/>
Restful风格
package com.zze.springmvc.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class TestController { @RequestMapping("user/{id}") @ResponseBody public void getUser(@PathVariable Integer id){ System.out.println(id); /* 请求 localhost:8080/user/1 控制台输出: 1 */ } }
com.zze.springmvc.web.controller.TestController
拦截器
SpringMVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。
package com.zze.springmvc.web.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyInterceptor1 implements HandlerInterceptor { /** * 处理器执行前执行 */ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor.preHandle"); return true; // true:放行 false:拦截 } /** * 处理器执行后, modelAndView 返回前执行 */ public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor.postHandle"); } /** * 处理器执行后执行 */ public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("MyInterceptor.afterCompletion"); } }
com.zze.springmvc.web.interceptor.MyInterceptor1 : 1、定义拦截器 1
package com.zze.springmvc.web.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyInterceptor2 implements HandlerInterceptor { /** * 处理器执行前执行 */ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor.preHandle"); return true; // true:放行 false:拦截 } /** * 处理器执行后, modelAndView 返回前执行 */ public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor.postHandle"); } /** * 处理器执行后执行 */ public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("MyInterceptor.afterCompletion"); } }
com.zze.springmvc.web.interceptor.MyInterceptor2 : 2、定义拦截器 2
<!--注册拦截器--> <mvc:interceptors> <mvc:interceptor> <!--拦截所有请求,包括二级以上目录--> <mvc:mapping path="/**"/> <!--指定路径不拦截--> <mvc:exclude-mapping path="/login"/> <bean class="com.zze.springmvc.web.interceptor.MyInterceptor1"/> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.zze.springmvc.web.interceptor.MyInterceptor2"/> </mvc:interceptor> </mvc:interceptors>
config/spring/springmvc.xml : 3、注册拦截器
package com.zze.springmvc.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class TestController { @RequestMapping("test") public void test() { System.out.println("from TestController.test"); } }
com.zze.springmvc.web.controller.TestController : 4、编写测试 Controller
5、测试,请求 localhost:8080/test ,控制台输出如下:
java框架之SpringMVC(2)-补充及拦截器的更多相关文章
- SpringMVC中的Interceptor拦截器及与Filter区别
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...
- SpringMVC中session使用&&拦截器&&乱码处理&&异常处理
### 1. 使用Session 通常,会在Session中存放: 1. 客户端(用户)的身份标识,通常是用户的id:2. 使用频率非常高的数据,例如显示在页面中的用户名.头像等:3. 其它的不便于使 ...
- 【SpringMVC】 4.3 拦截器
SpringMVC学习记录 注意:以下内容是学习 北京动力节点 的SpringMVC视频后所记录的笔记.源码以及个人的理解等,记录下来仅供学习 第4章 SpringMVC 核心技术 4.3 拦截器 ...
- SpringMVC中使用Interceptor拦截器
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...
- SpringMVC 中的Interceptor 拦截器
1.配置拦截器 在springMVC.xml配置文件增加: <mvc:interceptors> <!-- 日志拦截器 --> <mvc:interceptor> ...
- springMVC之mvc:interceptors拦截器的用法
1.配置拦截器 在springMVC.xml配置文件增加: <mvc:interceptors> <!-- 日志拦截器 --> <mvc:interceptor> ...
- springmvc实现简单的拦截器
SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的.在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,第一种方 ...
- SpringMVC学习记录(七)--拦截器的使用
SpringMVC的请求如以下这样的图所看到的: 能够看出全部的请求都要通过Dispatherservlet来接收,然后通过Handlermapping来决定使用哪个控制器,再依据ViewResolv ...
- SpringMVC之七:SpringMVC中使用Interceptor拦截器
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...
随机推荐
- 【OpenFOAM案例】02 自己动手
前言:很多人说OpenFOAM很难,要啃上很多的理论书籍,什么流体力学.计算流体力学.矩阵理论.线性代数.数值计算.C++程序设计神马的,看看光这一堆书就能吓倒绝大多数的人.其实我们并不一定要从这些基 ...
- 【Nginx】Nginx在Linux下的入门介绍
Nginx的安装 下载.解压 从Nginx下载安装包,我下的是nginx-1.8.0.tar.gz.解压后的目录为: [root@blog third_package]# tar -zxf nginx ...
- SparkStreaming+Kafka 处理实时WIFI数据
业务背景 技术选型 Kafka Producer SparkStreaming 接收Kafka数据流 基于Receiver接收数据 直连方式读取kafka数据 Direct连接示例 使用Zookeep ...
- springboot-async
在项目中,当访问其他人的接口较慢或者做耗时任务时,不想程序一直卡在耗时任务上,想程序能够并行执行, 我们可以使用多线程来并行的处理任务,也可以使用spring提供的异步处理方式@Async. Spri ...
- struts表单域模型注入
表单使用struts标签,表单中每一个字段都可以这样来赋值 类(action).成员变量 这个叫域模型注入 <s:form action="orders" method=&q ...
- 导出jqgrid表格数据为EXCEL文件,通过tableExport.js插件。
今天公司项目需要做个导出功能,将jqgrid查询出的数据导出为EXCEL表格文件,期间遇到两个问题: 1.导出报错 uncaught exception: INVALID_CHARACTER_ERR: ...
- POI导出复杂的excel;excel公共样式类;excel拼接定制类;数据科学计数法转为普通值
一.excel公共样式类(包含数据科学计数法转为普通值) package com.thinkgem.jeesite.common.utils.excel; import org.apache.poi. ...
- 怎么才能使服务器Nginx(或者Apache)支持字体文件
为了在前端正确地显示字体,浏览器必须使用正确的http header来接受字体文件.如果服务器没有设置要求的头信息,那么有些浏览器就会在控制台报错或者直接不能显示. 可能你的服务器已经配置好了,你无须 ...
- 使用redis接管session
class RedisSession { // 默认配置名称(使用load_config加载) private $_default_config_path = 'package/cache/redis ...
- Eclipse的设置、调优、使用(解决启动卡顿等问题)----转
eclipse调优 一般在不对eclipse进行相关设置的时候,使用eclipse总是会觉得启动好慢,用起来好卡,其实只要对eclipse的相关参数进行一些配置,就会有很大的改善. 加快启动速度 1. ...