zoukankan      html  css  js  c++  java
  • SpringMVC返回值类型及响应数据类型

    1.SpringMVC Struts2 的优略分析

    共同点:

    • 它们都是表现层框架,都是基于 MVC 模型编写的。

    • 它们的底层都离不开原始 ServletAPI。

    • 它们处理请求的机制都是一个核心控制器。

    区别:

    • Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter。

    • Spring MVC 是基于方法设计的,而 Struts2 是基于类,Struts2 每次执行都会创建一个动作类。所以 Spring MVC 会稍微比 Struts2 快些。

    • Spring MVC 使用更加简洁,同时还支持 JSR303, 处理 ajax 的请求更方便。

    (JSR303 是一套 JavaBean 参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们 JavaBean 的属性上面,就可以在需要校验的时候进行校验了。)

    • Struts2 的 OGNL 表达式使页面的开发效率相比 Spring MVC 更高些,但执行效率并没有比 JSTL 提升,尤其是 struts2 的表单标签,远没有 html 执行效率高。

    2.SpringMVC不同返回值类型的响应

    准备工作:在webapp下创建一个response.jsp页面

    在WEB-INF/pages目录下创建一个success.jsp页面

    创建一个User类(username,password,age三个属性)

    创建一个UserController

    2.1.返回值是String类型的响应

    controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。

    使用这种方法会通过视图解析器解析出对应地址:WEB-INF/pages/xxx.jsp

    2.1.1.在response.jsp页面写一个超链接

    <a href="user/testString" >testString</a>

    2.1.2.在UserController写返回值是String类型的方法

        //指定逻辑视图名,经过视图解析器解析为 jsp 物理路径:/WEB-INF/pages/success.jsp
        @RequestMapping("/testString")
        public String testString(Model model){
            System.out.println("testString方法执行了...");
            // 模拟从数据库中查询出User对象
            User user = new User();
            user.setUsername("美美");
            user.setPassword("123");
            user.setAge(30);
            // model对象
            model.addAttribute("user",user);
            return "success";
        }

    2.1.3.在success.jsp页面通过el表达式取值

    <h3>执行成功</h3>
        
    ${user.username}
    ${user.password}

    2.2.返回值是void类型的响应

    2.2.1.在response.jsp页面写一个超链接

     

    <a href="user/testVoid" >testVoid</a>

    2.2.2.在UserController写返回值是void类型的方法

    因为是void类型,不能像上一个String类型一样直接返回一个字符串(一个jsp页面),所以需要用到servlet的原始API,在Controller方法的形参上定义request和response,使用 request 或 response 指定响应结果。

     @RequestMapping("/testVoid")
        public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception {
            System.out.println("testVoid方法执行了...");
            // 1.使用request转向页面,编写请求转发的程序
            // request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
    // 2.使用response进行页面重定向
            //response.sendRedirect(request.getContextPath()+"/index.jsp");
    // 设置中文乱码
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html;charset=UTF-8");
    ​
            // 3.直接进行响应,但是在这之前需要设置中文乱码
            response.getWriter().print("你好");
    ​
        return;
    }

    注意:请求转发是一次请求,使用request对象会调用视图解析器,所以会进入WEB-INF/pages/目录下

    重定向是两次请求,且不会进入WEB-INF/pages/目录下

    2.3.返回值是ModelAndView类型的响应

    2.3.1.在response.jsp页面写一个超链接

     

    <a href="user/testModelAndView" >testModelAndView</a>

    2.3.2.在UserController写返回值是ModelAndView类型的方法

    这个与最前面的返回值是String类型的类似

    ModelAndView是SpringMVC提供的一个对象,也会调用视图解析器帮我们跳转到xxx.jsp页面

      
         /**     
         * 返回ModelAndView对象     
         * 可以传入视图的名称(即跳转的页面),还可以传入对象。     
         * @return     
         * @throws Exception     
         */
    ​
        @RequestMapping("/testModelAndView")
        public ModelAndView testModelAndView(){
            // 创建ModelAndView对象
            ModelAndView mv = new ModelAndView();
            System.out.println("testModelAndView方法执行了...");
            // 模拟从数据库中查询出User对象
            List<User> users = new ArrayList<>();
            User user1 = new User();
            user1.setUsername("小凤");
            user1.setPassword("456");
            user1.setAge(30);
            
            User user2 = new User();
            user1.setUsername("智障");
            user1.setPassword("789");
            
            users.add(user1);
            users.add(user2);
    ​
            // 把users对象存储到mv对象中,也会把user对象存入到request对象
            mv.addObject("users",users);
    ​
            // 跳转到哪个页面(设置逻辑视图名,视图解析器会根据名称前往指定的视图)
            mv.setViewName("success");
    ​
            return mv;
        }

    2.3.3.在success.jsp页面通过el表达式取值

    <h3>执行成功</h3>
        
    ${user.username}
    ${user.password}

    2.4.响应之使用关键字forword和redirect进行页面跳转

    controller 方法在提供了 String 类型的返回值之后,默认就是请求转发。

         /**
         * 使用关键字的方式进行转发或者重定向
         * @return
         */
        @RequestMapping("/testForwardOrRedirect")
        public String testForwardOrRedirect(){
            System.out.println("testForwardOrRedirect方法执行了...");
    ​
            // 请求的转发
            // return "forward:/WEB-INF/pages/success.jsp";
    // 重定向
            return "redirect:/index.jsp";
        }

    注意:如果用了 formward:则路径必须写成实际视图 url,不能写逻辑视图。

    使用请求转发,它相当于于“request.getRequestDispatcher("url").forward(request,response)”。使用请求 转发,既可以转发到 jsp,也可以转发到其他的控制器方法。

    如果是重定向到 jsp 页面,则 jsp 页面不 能写在 WEB-INF 目录中,否则无法找到。

    3.ResponseBody响应json数据

    前面所记录的不管通过何种方式,都要先跳转到一个jsp页面进行响应,如果页面发送的是一个ajax请求,则可以通过ResponseBody进行响应。

    ResponseBody注解(获得请求体的全部内容):该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的 数据如:json,xml 等,通过 Response 响应给客户端

    3.1.首先需要在webapp下建立js/jquery.min.js文件

    3.2.在response.jsp页面引入该文件

    <script src="${pageContext.request.contextPath}/js/jquery.min.js"></script>

    3.3.配置静态文件不拦截

    由于之前在web.xml中配置前端控制器的时候拦截了所有资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,不能被使用,

    所以此时需要配置不拦截静态资源。

    mvc:resource标签配置不过滤

    location元素表示webapp目录下的包下的所有文件

    mapping元素表示以/static开头的所有请求路径,如/static/a 或者/static/a/b
     <!-- 设置静态资源不过滤 -->    
         <mvc:resources location="/css/" mapping="/css/**"/>  <!-- 样式 -->    
         <mvc:resources location="/images/" mapping="/images/**"/>  <!-- 图片 -->    
         <mvc:resources location="/js/" mapping="/js/**"/>  <!-- javascript -->

    3.4.在response.jsp页面写ajax请求

      
     <script>
            // 页面加载,绑定单击事件
            $(function(){
                $("#btn").click(function(){
                    // alert("hello btn");
                    // 发送ajax请求
                    $.ajax({
                        // 编写json格式,设置属性和值
                        url:"user/testAjax",  //请求地址,必须与controller层请求地址相对应
                        contentType:"application/json;charset=UTF-8",//发送数据给服务器端时的编码类型,此处为json类型
                        data:'{"username":"hehe","password":"123","age":30}',//发送到服务器端的数据内容,key值与Javabean中的属性名相同,才能封装到对象
                        dataType:"json", //服务器返回的数据类型
                        type:"post", //请求方式,默认get
                        success:function(data){//请求成功后的回调函数
                            // data服务器端响应的json的数据,进行解析
                            alert(data);//弹出对象
                            alert(data.username);//弹出用户名
                            alert(data.password);//弹出密码
                            alert(data.age);//弹出年龄
                        }
                    });
    ​
                });
            });
    ​
        </script>

    注意:发送到服务器的内容那块,将key值与Javabean中的属性一一对应,才可以进行封装,除此之外,还需要用到几个jar包:

     <dependency>                               
         <goupId>com.fasterxml.jackson.core</groupId>            
         <artifactId>jackson-databind</artifactId>            
         <version>2.9.0</version>        
     </dependency>        
     <dependency>            
         <groupId>com.fasterxml.jackson.core</groupId>            
         <artifactId>jackson-core</artifactId>            
         <version>2.9.0</version>        
     </dependency>        
     <dependency>            
         <groupId>com.fasterxml.jackson.core</groupId>            
         <artifactId>jackson-annotations</artifactId>              
         <version>2.9.0</version>        
     </dependency>

    3.5.编写controller方法

        /**
         * 模拟异步请求响应
         */
        @RequestMapping("/testAjax")
        public @ResponseBody User testAjax(@RequestBody User user){
            System.out.println("testAjax方法执行了...");
            // 客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
            System.out.println(user);
            // 做响应,模拟更新数据库,将用户名和年龄改了,密码没有更改
            user.setUsername("haha");
            user.setAge(40);  
            // 做响应,只需返回一个User对象即可
            return user;
        }

    注意:由于key值和对象属性一一对应,封装到对象中去了,所以@RequestBody后边就直接写User,

    @ResponseBody再将user对象转换成json字符串响应给前端页面。

  • 相关阅读:
    Swift入门篇-Hello World
    Swift入门篇-swift简介
    Minecraft 插件 world edit 的cs 命令
    搭建本地MAVEN NEXUS 服务
    MC java 远程调试 plugin 开发
    企业内部从零开始安装docker hadoop 提纲
    javascript 命令方式 测试例子
    ca des key crt scr
    JSF 抽象和实现例子 (函数和属性)
    form 上传 html 代码
  • 原文地址:https://www.cnblogs.com/bzbz/p/12146198.html
Copyright © 2011-2022 走看看