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字符串响应给前端页面。

原文地址:https://www.cnblogs.com/bzbz/p/12146198.html

时间: 2024-08-09 04:18:29

SpringMVC返回值类型及响应数据类型的相关文章

阶段3 3.SpringMVC&#183;_04.SpringMVC返回值类型及响应数据类型_1 搭建环境

创建项目 使用骨架,创建webapp 为了创建项目更快速maven设置 archetypeCatalog internal 修改编译的版本 从昨天的课程内复制 相关的坐标.上面是版本锁定. 复制前端的控制器和解决中文乱码 复制到今天的项目里面 手动创建java和resources的文件夹 java文件夹编程源码的根目录 resources编程resources的根目录 这样文件夹的样式就编程这样了. springmvc.xml复制过来. 点击ok就复制过来了 复制进来了 自定义类型转换器用不到了

阶段3 3.SpringMVC&#183;_04.SpringMVC返回值类型及响应数据类型_2 响应之返回值是String类型

返回字符串 新建一个response的页面 新建后台Controller类 视图解析器配置的前缀地址 是WEB-INF下的pages下的页面. 创建pages文件夹在下面创建success.jsp页面 启动服务器 输出了 说明我们的环境搭建的没问题 创建一个user类 实现序列化.定义三个属性 生成getter和setter方法 数据存入Model对象 通过model把定义的user对象存进去. 首先这里设置为false 从request域里面.把user对象取出来. 项目重新部署 原文地址:h

阶段3 3.SpringMVC&#183;_04.SpringMVC返回值类型及响应数据类型_4 响应之返回值是ModelAndView类型

ModelAndView是SpringMvc提供的一个对象 ModelAndView底层源码用也是ModelMap.ModelMap实现过Model的接口 ModelAndView可以直接new出来.是SpringMvc提供的 还可以设置跳转到哪个页面 用的视图解析器就会跳转到WEB-INF/pages下的success.jsp页面 改一下username和password 原文地址:https://www.cnblogs.com/wangjunwei/p/11380418.html

阶段3 3.SpringMVC&#183;_04.SpringMVC返回值类型及响应数据类型_5 响应之使用forward和redirect进行页面跳转

这个方式用的比较少. forward 转发或者重定向 返回forward关键字就表现现在想使用的就是请求转发 redirect 原文地址:https://www.cnblogs.com/wangjunwei/p/11380544.html

SpringMVC 返回值类型,参数传递 解决乱码

一.SpringMV返回值类型 返回String类型时: 返回Object类型时: 传递参数 域属性传递: 处理器映射器 原文地址:https://www.cnblogs.com/qinzhenyu/p/11825965.html

SpringMVC方法的返回值类型和自动装配

1. void类型作为返回值类型 /** * 如果方法写成了void就跟原来servlet含义是差不多 的 * json */ @RequestMapping("/firstRequest") public void firstRequest(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException { UserInfo info=new UserI

Asp.net MVC 中Controller返回值类型ActionResult

内容转自 http://blog.csdn.net/pasic/article/details/7110134 Asp.net MVC中Controller返回值类型 在mvc中所有的controller类都必须使用"Controller"后缀来命名并且对Action也有一定的要求: 必须是一个public方法 必须是实例方法 没有标志NonActionAttribute特性的(NoAction) 不能被重载 必须返回ActionResult类型 如: [csharp] view pl

C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

原文地址:http://www.cnblogs.com/landeanfen/p/5501487.html 使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值 IHttpActionResult HttpResponseMessage 自定义类型 此篇就围绕这四块分别来看看它们的使用. 一.void无返回值 void关键字我们都不陌生,它申明方法没有返回值.它的使用也很简单,我们来看一个示例就能明白. public class ORDER { publi

函数返回值类型为枚举类型

枚举是个好东西,它和结构体一样,都可以定义一种数据类型,但是枚举有一个更优点,就是它可以默认指定定义的初始值. 有一个项目,涉及到CPU卡,卡片有错误.上电.DF01目录等状态,如果单独定义这些变量,要使用很多变量,这里有一个规律,即:CPU卡不能同时为这几种状态中的几个,只能为其中的一个,这样,我们可以定义一个枚举类型变量,例如: //标识ic的几种状态typedef enum{     ICC_ERROR,       ICC_NO_EXIST,       ICC_EXIST,