详细解读-Spring响应处理

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

  1. 通过参数绑定的方式去获取servlet api
 @RequestMapping("/servletapi/session")
    public String session01(HttpSession session){
        session.setAttribute("type","servletapi-session");
        return "main";
    }`
  1. 通过自动注入的方式去获取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种方式的获取servlet­­api的线程安全问题:
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";
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万物皆可der

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值