SpringMVC请求与响应处理要点有哪些?
- 内容介绍
- 相关推荐
本文共计1794个文字,预计阅读时间需要8分钟。
一、处理器方法响应+ Controller方法返回- Controller数据共享+ 返回类型:void/ModelAndView/String
1.Controller方法返回void
// 返回void类型,适用于不需要返回数据的操作public void someMethod() { // 处理逻辑}2. Controller方法返回void类型(返回类型说明)// 返回void类型,适用于不需要返回数据的操作,可视为Servlet使用public void someMethod() { // 处理逻辑}
一、处理器方法响应处理
▷ Controller方法该怎么返回、Controller数据该怎么进行共享
- 返回void/ModelAndView/String
1、Controller方法返回void
//返回void类型,此时可以把Controller方法当做Servlet使用
@RequestMapping("/test1")
public void test(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//请求转发
request.getRequestDispatcher("/WEB-INF/views/welcome.jsp").forward(request, response);
//设置共享数据
request.setAttribute("msg", "hello");
//输出json格式
response.setContentType("text/json;charset=utf-8");
response.getWriter().println();
}
2、返回ModelAndView
//返回ModelAndView
@RequestMapping("/test3")
public ModelAndView test3() {
ModelAndView mv = new ModelAndView();
//设置视图名称
// mv.setViewName("/WEB-INF/views/welcome.jsp");
mv.setViewName("welcome");
mv.addObject("msg", "返回ModelNAndView");//设置共享数据的key和value
mv.addObject("叩丁狼教育");//设置共享数据的value,此时会把value类型的首字母作为key:string
return mv;
}
3、返回String类型(是逻辑视图名称),参数是Model类型(是共享数据)
//返回string,逻辑视图名称,此时需要结合参数Model类型 一起使用
@RequestMapping("/test4")
public String test4(Model model) {
//设置共享数据
model.addAttribute("叩丁狼");
model.addAttribute("msg", "教育");
return "welcome";//设置跳转的视图
}
- 请求转发、URL重定向、URL重定向共享数据
1、请求转发
//请求转发,浏览器地址栏不变,可以共享请求中的数据
//原理:request.getRequestDispatcher("").forward(request, response);
@RequestMapping("/test5")
public String test5(Model model) {
return "forward:/hello.jsp";//设置跳转的视图
}
2、URL重定向
//重定向,浏览器地址栏改变,不能共享请求中的数据
//原理:request.sendRedirect("");
@RequestMapping("/test6")
public String test6(Model model) {
return "redirect:/hello.jsp";//设置跳转的视图
}
■ 请求资源的路径问题:[总结:访问资源的时候,都使用/开头]
- 访问资源的时候前面带上/,表示绝对路径,从
根路径开始去寻找资源 - 访问资源的时候签名不加/,表示相对路径,从
上一级上下文路径中去寻找资源
✿ 请求转发和URL重定向的选择:
-
传统的方式,在url重定向的时候,因为是两次不同的请求,所以不能共享请求中的数据。
在开发中,有时候真的需要重定向跳转后共享数据------------spring3.1开始,提供了Flash属性。
★
只能是从Controller 重定向到 Controller,不能到jsp
//重定向:从a跳转到b
@RequestMapping("/a")
public String a(RedirectAttributes ra) {
ra.addAttribute("msg1", "a传递的数据");
ra.addFlashAttribute("msg2", "msg2");
return "redirect:/response/b";//设置跳转的视图
}
@RequestMapping("/b")
public ModelAndView b(String msg1, @ModelAttribute("msg2") String msg2) {
System.out.println("msg1:" + msg1);
System.out.println("msg2:" + msg2);
return null;
}
- 重定向共享数据的原理:更大的作用域--session
接收请求参数的处理)
- 处理器方法的请求参数该怎么携带、请求参数该怎么获取
1、request 和 response 参数 ■ 情况一:为了操作Servlet API 对象,此时可以直接以参数形式传递,也可以直接使用DI注入。
@Controller
@RequestMapping("/request")
public class HandlerRequestController {
@Autowired
private ServletContext context;
@RequestMapping("/test1")
public void test(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws ServletException, IOException {
System.out.println("request:" + request);
System.out.println("response:" + response);
System.out.println("session:" + session);
System.out.println("ServletContext:" + this.context);
}
}
- request、response、session:建议使用参数
- context 上下文:单例,建议使用属性,注入
▷ 因为Controller(Servlet) 是单例的,线程不安全,一般不用成员变量,除非要共享的数据,才作为成员变量。
- 处理简单类型的请求参数
■ 获取请求参数:
//获取请求参数:通过保证请求参数名称和Controller方法定义的形参(入参)同名即可
@RequestMapping("/test2")
public void test2(String username, int age) {
System.out.println(username);
System.out.println(age);
}
■ 获取请求参数:----注解
@RequestParam
//获取请求参数:若请求参数和请求参数名称和形参不同----注解@RequestParam
@RequestMapping("/test3")
public void test3(@RequestParam("name") String username, @RequestParam(value="age",required=false) Integer age) {
System.out.println("username:" +username);
System.out.println("age:" + age);
}
3、中文乱码处理
■ 在"全局配置",添加上编码过滤器:
<!-- (针对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>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4、restfull风格传参
- restfull 风格:软件架构风格,严格讲是一种编码风格,充分利用java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
(3) 使用jstl:
<% pageContext.setAttribute("myDate", new java.util.Date()); %> 北京时间: <fmt:formatDate value="${myDate}" pattern="yyyy=MM-dd HH:mm:ss"/>
3、后台往前台响应JSON时---Date类型(1)方法1:在springmvc框架配置中添加json类型转化相关的配置[配置全局解析器]:
<!-- MVC注解解析器 --> <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" /> </bean> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
(2)方式2:使用注解@JsonFormat@Data public class User { private Long id; private String username; private Integer age; //@DateTimeFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date hireDate; }
★ 注意:
@DateTimeFormat是前台往后台传参★ 注意: 是后台响应给前台,响应为json格式(对时间Date类型的处理)
如果本文对你有帮助的话记得给一乐点个赞哦,感谢!
本文共计1794个文字,预计阅读时间需要8分钟。
一、处理器方法响应+ Controller方法返回- Controller数据共享+ 返回类型:void/ModelAndView/String
1.Controller方法返回void
// 返回void类型,适用于不需要返回数据的操作public void someMethod() { // 处理逻辑}2. Controller方法返回void类型(返回类型说明)// 返回void类型,适用于不需要返回数据的操作,可视为Servlet使用public void someMethod() { // 处理逻辑}
一、处理器方法响应处理
▷ Controller方法该怎么返回、Controller数据该怎么进行共享
- 返回void/ModelAndView/String
1、Controller方法返回void
//返回void类型,此时可以把Controller方法当做Servlet使用
@RequestMapping("/test1")
public void test(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//请求转发
request.getRequestDispatcher("/WEB-INF/views/welcome.jsp").forward(request, response);
//设置共享数据
request.setAttribute("msg", "hello");
//输出json格式
response.setContentType("text/json;charset=utf-8");
response.getWriter().println();
}
2、返回ModelAndView
//返回ModelAndView
@RequestMapping("/test3")
public ModelAndView test3() {
ModelAndView mv = new ModelAndView();
//设置视图名称
// mv.setViewName("/WEB-INF/views/welcome.jsp");
mv.setViewName("welcome");
mv.addObject("msg", "返回ModelNAndView");//设置共享数据的key和value
mv.addObject("叩丁狼教育");//设置共享数据的value,此时会把value类型的首字母作为key:string
return mv;
}
3、返回String类型(是逻辑视图名称),参数是Model类型(是共享数据)
//返回string,逻辑视图名称,此时需要结合参数Model类型 一起使用
@RequestMapping("/test4")
public String test4(Model model) {
//设置共享数据
model.addAttribute("叩丁狼");
model.addAttribute("msg", "教育");
return "welcome";//设置跳转的视图
}
- 请求转发、URL重定向、URL重定向共享数据
1、请求转发
//请求转发,浏览器地址栏不变,可以共享请求中的数据
//原理:request.getRequestDispatcher("").forward(request, response);
@RequestMapping("/test5")
public String test5(Model model) {
return "forward:/hello.jsp";//设置跳转的视图
}
2、URL重定向
//重定向,浏览器地址栏改变,不能共享请求中的数据
//原理:request.sendRedirect("");
@RequestMapping("/test6")
public String test6(Model model) {
return "redirect:/hello.jsp";//设置跳转的视图
}
■ 请求资源的路径问题:[总结:访问资源的时候,都使用/开头]
- 访问资源的时候前面带上/,表示绝对路径,从
根路径开始去寻找资源 - 访问资源的时候签名不加/,表示相对路径,从
上一级上下文路径中去寻找资源
✿ 请求转发和URL重定向的选择:
-
传统的方式,在url重定向的时候,因为是两次不同的请求,所以不能共享请求中的数据。
在开发中,有时候真的需要重定向跳转后共享数据------------spring3.1开始,提供了Flash属性。
★
只能是从Controller 重定向到 Controller,不能到jsp
//重定向:从a跳转到b
@RequestMapping("/a")
public String a(RedirectAttributes ra) {
ra.addAttribute("msg1", "a传递的数据");
ra.addFlashAttribute("msg2", "msg2");
return "redirect:/response/b";//设置跳转的视图
}
@RequestMapping("/b")
public ModelAndView b(String msg1, @ModelAttribute("msg2") String msg2) {
System.out.println("msg1:" + msg1);
System.out.println("msg2:" + msg2);
return null;
}
- 重定向共享数据的原理:更大的作用域--session
接收请求参数的处理)
- 处理器方法的请求参数该怎么携带、请求参数该怎么获取
1、request 和 response 参数 ■ 情况一:为了操作Servlet API 对象,此时可以直接以参数形式传递,也可以直接使用DI注入。
@Controller
@RequestMapping("/request")
public class HandlerRequestController {
@Autowired
private ServletContext context;
@RequestMapping("/test1")
public void test(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws ServletException, IOException {
System.out.println("request:" + request);
System.out.println("response:" + response);
System.out.println("session:" + session);
System.out.println("ServletContext:" + this.context);
}
}
- request、response、session:建议使用参数
- context 上下文:单例,建议使用属性,注入
▷ 因为Controller(Servlet) 是单例的,线程不安全,一般不用成员变量,除非要共享的数据,才作为成员变量。
- 处理简单类型的请求参数
■ 获取请求参数:
//获取请求参数:通过保证请求参数名称和Controller方法定义的形参(入参)同名即可
@RequestMapping("/test2")
public void test2(String username, int age) {
System.out.println(username);
System.out.println(age);
}
■ 获取请求参数:----注解
@RequestParam
//获取请求参数:若请求参数和请求参数名称和形参不同----注解@RequestParam
@RequestMapping("/test3")
public void test3(@RequestParam("name") String username, @RequestParam(value="age",required=false) Integer age) {
System.out.println("username:" +username);
System.out.println("age:" + age);
}
3、中文乱码处理
■ 在"全局配置",添加上编码过滤器:
<!-- (针对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>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4、restfull风格传参
- restfull 风格:软件架构风格,严格讲是一种编码风格,充分利用java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
(3) 使用jstl:
<% pageContext.setAttribute("myDate", new java.util.Date()); %> 北京时间: <fmt:formatDate value="${myDate}" pattern="yyyy=MM-dd HH:mm:ss"/>
3、后台往前台响应JSON时---Date类型(1)方法1:在springmvc框架配置中添加json类型转化相关的配置[配置全局解析器]:
<!-- MVC注解解析器 --> <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" /> </bean> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
(2)方式2:使用注解@JsonFormat@Data public class User { private Long id; private String username; private Integer age; //@DateTimeFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date hireDate; }
★ 注意:
@DateTimeFormat是前台往后台传参★ 注意: 是后台响应给前台,响应为json格式(对时间Date类型的处理)
如果本文对你有帮助的话记得给一乐点个赞哦,感谢!

