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 api
@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";
}