SpringMvc_响应处理
当服务器向客户端响应数据时,SpringMVC框架会使用“转换器”(Converter)将方法的返回值进行转换,及处理响应时的响应头(Response Headers)等内容,针对返回值类型不同,SpringMVC框架还会自动使用不同的转换器。
1.使用默认内置视图解析器
jsp文件应该放在web文件中WEB-INF下,而不是放在/目录下,所以为了找到对应的jsp,使用视图解析器来找到对应文件,在xml文件中加入:
<!-- 配置默认视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"></property> <property name="suffix" value=".jsp"></property> </bean>
2.使用视图控制器
因为默认启动服务器,开始默认页面是/目录下的jsp,而之前/目录下的jsp移动到了WEB-INF下,所以启动服务器后会找不到页面,此时需要用到视图控制器,来给默认启动后的服务器添加一个默认页面;
<!-- 视图控制器--> <mvc:view-controller path="/" view-name="index"/>
3.使用Model,Map,ModelMap传输数据到页面
在刚开始的helloworld项目中,我们传递了参数回到我们页面,但是后 续的操作都只是接受用户的请求,那么在SpringMVC中除了可以使用原生 servlet的对象传递数据之外,还有什么其他的方式呢?
可以在方法的参数上传入Model,ModelMap,Map类型,此时都能够 将数据传送回页面,
这几种类型引用都非常简单
Model类型:
@RequestMapping("/model") public String model(Model model){ System.out.println(model.getClass()); model.addAttribute("type","model"); return "main"; }
Modelmap类型:
@RequestMapping("/modelmap") public String modelmap(ModelMap modelMap){ System.out.println(modelMap.getClass()); modelMap.addAttribute("type","modelmap"); return "main"; }
map类型:
@RequestMapping("/map") public String map(Map map){ System.out.println(map.getClass()); map.put("type","map"); return "main"; }
这三种类型之间十分相似,所以书写时也比较类似
4.使用ModelAndView对象传输数据到页面
当使用modelAndView对象的时候,返回值的类型也是此对象, 可以将要跳转的页面设置成view的名称,来完成跳转的功能,同时数据也是放到 request作用中。建议使用此类型进行数据传输
@RequestMapping("/modelview") public ModelAndView modelAndView(){ ModelAndView my = new ModelAndView("main"); my.addObject("type","modelview"); return my; }
5.使用session传输数据到页面
1.通过servlet api的方式去读写session
- 通过参数绑定的方式去获取servlet ap
@RequestMapping("/servletapi/session") public String session01(HttpSession session){ session.setAttribute("type","servletapi-session"); return "main"; }`
- 通过自动注入的方式去获取servlet api(推荐使用这种方式)
@Autowired private HttpSession session; /** * 通过自动注入的方式去获取servlet api */ @RequestMapping("/autowired/session") public String session02(){ session.setAttribute("type","autowired-session"); return "main"; }
2.通过springmvc提供的注解方式去读写session
* @SessionAttribute 获取session * required 用来设置session中某个属性必须存在 , 不存在则会报错:HTTP Status 400 - Missing session attribute 'type' of type String * model和session是互通的:session可以通过model中去获取写入指定的属性, model也会从session中自动写入指定的属性 * @param type * @return */ @RequestMapping("/annotation/session") public String session03(@SessionAttribute(value="type",required = false) String type,Model model ){ System.out.println(type); // model.addAttribute("type",type); 相当于隐式往model也写入了type return "main"; }
使用@ModelAttribute来获取请求中的数据(不推荐)
这种方法相对于前两种来说线程不安全所以这里不再说明了,想要了解的可以自行学习
3种方式的获取servletapi的线程安全问题:
1. 通过参数绑定的方式
是线程安全的,因为参数绑定变量时方法级别,所以每次请求方法都会创建一个新的私 有变量。
2.通过自动注入的方式@AutoWired
是线程安全的,spring底层通过自动注入 将 servlet api 封装到ThreadLocal(是绑定 在线程上面的)里面.
3.通过@ModelAttribute的方式 不是线程安全的,控制器是单例的,并且变量声明在类的级别中(共享变量)
6.使用forward实现页面转发
在发送请求的时候,可以通过forward:来实现转发的功能:
/** * 转发请求处理 * forward:转发,它不会经过视图解析器的解析 * 适用于当访问的视图不在我们指定的前缀下 */ @RequestMapping("/forward") public String forward(Model model){ model.addAttribute("type","转发"); return "forward:/login.jsp"; }
7.使用redirect来实现重定向
/** * 重定向请求处理 * redirect:它不会经过视图解析器的解析,需要写上完整的逻辑视图名称 * 重定向不能将地址重定向到WEB-INF中 * springmvc转发和重定向的“/” 都定位到项目名这一级 * response.sendRedirect("/") */ @RequestMapping("/redirect") public String redirect(Model model){ model.addAttribute("type","转发"); return "redirect:/login.jsp"; }