• 详细解读-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>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.使用视图控制器

    因为默认启动服务器,开始默认页面是/目录下的jsp,而之前/目录下的jsp移动到了WEB-INF下,所以启动服务器后会找不到页面,此时需要用到视图控制器,来给默认启动后的服务器添加一个默认页面;

    <!--    视图控制器-->
        <mvc:view-controller path="/" view-name="index"/>
    
    • 1
    • 2

    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";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Modelmap类型:

    @RequestMapping("/modelmap")
        public String modelmap(ModelMap modelMap){
            System.out.println(modelMap.getClass());
            modelMap.addAttribute("type","modelmap");
            return "main";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    map类型:

     @RequestMapping("/map")
        public String map(Map map){
            System.out.println(map.getClass());
            map.put("type","map");
            return "main";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这三种类型之间十分相似,所以书写时也比较类似

    4.使用ModelAndView对象传输数据到页面

    当使用modelAndView对象的时候,返回值的类型也是此对象, 可以将要跳转的页面设置成view的名称,来完成跳转的功能,同时数据也是放到 request作用中。建议使用此类型进行数据传输

     @RequestMapping("/modelview")
        public  ModelAndView modelAndView(){
            ModelAndView my = new ModelAndView("main");
            my.addObject("type","modelview");
            return my;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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
    • 2
    • 3
    • 4
    • 5
    1. 通过自动注入的方式去获取servlet api(推荐使用这种方式)
     @Autowired
        private HttpSession session;
        /**
         * 通过自动注入的方式去获取servlet api
         */
        @RequestMapping("/autowired/session")
        public String session02(){
            session.setAttribute("type","autowired-session");
            return "main";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    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";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    使用@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";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    7.使用redirect来实现重定向

     /**
         * 重定向请求处理
         * redirect:它不会经过视图解析器的解析,需要写上完整的逻辑视图名称
         *  重定向不能将地址重定向到WEB-INF中
         *  springmvc转发和重定向的“/” 都定位到项目名这一级
         *  response.sendRedirect("/")
         */
        @RequestMapping("/redirect")
        public String redirect(Model model){
            model.addAttribute("type","转发");
            return "redirect:/login.jsp";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    痞子衡嵌入式:一个关于Segger J-Flash在Micron Flash固定区域下载校验失败的故事(SR寄存器BP[x:0]位)
    MyBatisPlus学习(2)—— 初始化环境配置 + 自定义Mapper
    Vue vue.config.js 的详解与配置
    浅析Linux进程间通信方式之消息队列
    MySql优化经验分享
    《二》标签
    PPT+Visio复现顶刊三维流程图
    计算机毕业设计Java毕业设计管理系统(源码+系统+mysql数据库+lw文档)
    在宇宙的眼眸下,如何正确地关心东数西算?
    Verilog 过程赋值 区别 详解
  • 原文地址:https://blog.csdn.net/weixin_54174102/article/details/126943472