javaweb实训第五天下午——SpringMVC基础(2)https://developer.aliyun.com/article/1415104
7.控制器常用操作
控制器除了处理请求并返回视图以外,还需要一些事情,比如接收页面请求参数、绑定数据到页面、返回json数据、文件上传、文件下载等;
7.1.接收请求参数
7.1.1.处理中文参数乱码问题
- 参数接收,首先要考虑乱码问题,以前的处理方式是:
(1)Get请求:tomcat6.x,7.x/conf/server.xml中配置(tomcat8.X不需要配置):
<Connector port="80" protocol="HTTP/1.1" URIEncoding="UTF-8" connectionTimeout="20000" redirectPort="8443" />
(2)Post请求:需要再获取请求参数之前设置编码格式:
req.setCharacterEncoding("utf-8");
- 对于Post请求而言,通过上述的方式就需要在每一个控制器都要去处理乱码,有没有更加简洁的办法,只写一次就可以作用在所以在其他控制器呢?
7.1.1.1.过滤器
7.1.1.1.1.过滤器介绍
生活中的过滤器: 净水器、空气净化器、渔网、烟嘴、塞子;
- Filter过滤器是一个对访问的请求和响应进行拦截的web组件;
- Filter过滤器可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理;
7.1.1.1.2.过滤器编写
写一个类去实现Filter接口,并实现接口中的所有方法;
在web.xml中配置或者使用注解配置【@WebFilter(“过滤器路径”)不推荐】
Java代码:
public class FirstFilter implements Filter { public FirstFilter() { } public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("utf-8"); chain.doFilter(request,response);//放行 } public void init(FilterConfig fConfig) throws ServletException { } }
web.xml配置:
<filter> <filter-name>first</filter-name> <filter-class>cn.itsource.filter.FirstFilter</filter-class> </filter> <filter-mapping> <filter-name>first</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
7.1.1.2.配置字符编码过滤器
- springmvc框架本身没有处理请求编码,但是spring框架为我们提供了一个编码过滤器。开发者只需要配置一个spring内置请求编码过滤器即可。在web.xml配置一个请求编码过滤器:
<!-- 支持UTF-8编码 --> <filter> <filter-name>characterEncoding</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>characterEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
7.1.2.参数接收方式
通过传统的HttpServletRequest接收;
通过控制器的执行方法的参数接收;
通过对象来接收;
通过url中的参数接收(restfull风格) @PathVariable(“id”)转换;7.1.2.1.通过传统的HttpServletRequest接收
7.1.2.1.通过传统的HttpServletRequest接收
SpringMVC想要使用HttpServletRequest、HttpSession、HttpServletResponse对象可以直接在方法参数中写即可,很强大,需要什么就写什么(只限于普通类加注解的实现方式);
//使用HttpServletRequest接收(不建议使用) /** * http://localhost/params04?name=admin&age=24 */ @RequestMapping("/params04") public ModelAndView params04(HttpServletRequest request){ System.out.println(request.getParameter("name")); System.out.println(request.getParameter("age")); return null; }
7.1.2.2.通过参数接收
名称与传递参数一致:
//普通数据接收 /** * http://localhost/params01?name=admin&age=24 */ @RequestMapping("/params01") public ModelAndView params01(String name,Integer age){ System.out.println("name:"+name); System.out.println("age:"+age); System.out.println("xx:"+xx); return null; }
名称与传递参数不一致:使用@RequestParam(“xxx”)注解
/** * 如果传过来的名称与接收的名称不一致 * http://localhost/params02?name=admin&age=24 */ @RequestMapping("/params02") public ModelAndView params02(@RequestParam("name") String username,Integer age){ System.out.println("username:"+username); System.out.println("age:"+age); return null; }
7.1.2.3.通过对象接收
/* * http://localhost/params03?name=admin&age=24&date=2017-05-14 * 注意:接收日期必需在 set时间前配置:@DateTimeFormat(pattern="yyyy-MM-dd") */ @RequestMapping("/params03") public ModelAndView params03(User user){ System.out.println("name:"+user.getName()); System.out.println("age:"+user.getAge()); System.out.println("date:"+user.getDate()); return null; }
特别注意:在对象部分咱们加了一个日期,而日期格式的数据接收需要加相应的注解:
public class User { private Long id; private String name; private Integer age; private Date date; //其它的getter,setter省略... @DateTimeFormat(pattern="yyyy-MM-dd") public void setDate(Date date) { this.date = date; } }
7.1.2.4.URL地址提取数据
使用@PathVariable("id") /** * 接收url中参数的请求,接收用户请求参数值 * http://localhost/params05/delete/100/tom * 注:这种方式为RESTful风格,参数不易过多 */ @RequestMapping("/params05/delete/{id}/{username}") public ModelAndView params05(@PathVariable("id")Long id,@PathVariable("username")String name){ System.out.println(id); System.out.println(name); return null; }
7.2.视图解析器
- SpringMvc提供了InternalResourceViewResolver,用于统一管理响应视图的匹配;
- 使用之后,响应的数据就会交给这个视图解析器进行解析,然后转向响应的页面,控制器中响应视图写法就比较简单了;
<!-- 设置视图路径的前后缀,该配置可以让我们写视图路径的时候更简单 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsps/" /> <property name="suffix" value=".jsp" /> </bean>
路径简写:
javaweb实训第五天下午——SpringMVC基础(4)https://developer.aliyun.com/article/1415114?spm=a2c6h.13148508.setting.15.6e1a4f0eQzpjQW