SpringMVC(三)处理器方法的返回值

21 篇文章 0 订阅
5 篇文章 0 订阅

处理器方法的返回值

使用@Controller注解的处理器的处理器方法,其返回值常用的有四种类型

第一种:ModelAndView :有数据和视图,对视图执行forward。

第二种:String :表示视图,可以逻辑名称,也可以是完整视图路径

第三种:无返回值void :不能表示数据,也不能表示视图

​ 在处理Ajax的时候,可以使用void返回值。通过HttpServletResponse输出数据。响应ajax请求。

​ ajax请求服务器端返回的就是数据,和视图无关。

第四种:返回自定义类型对象 :代表的是数据,例如String,Integer,Map,List,Student等都是对象

​ 对象有属性,属性就是数据。所以返回Object表示数据,和视图无关

​ 可以使用对象表示的数据,响应ajax请求

根据不同的情况,使用不同的返回值

返回值ModeAndView

上面已写

返回值String

地址出现重复 和视图解析器
在这里插入图片描述
controller.java

/*
* 处理器方法返回Stirng---表示逻辑视图名称,需要配置视图解析器
*
* */
@RequestMapping(value = "/returnString-view.do")
public String doReturnView(HttpServletRequest request,String name,Integer age){
    System.out.println("doReturnView,name="+name+"    +age"+age);
    //可以自己手工添加数据到request作用域
    request.setAttribute("myname",name);
    request.setAttribute("myage",age);
    //show:逻辑视图名称,项目中配置了视图解析器
    //框架对视图执行forward转发操作
    return "show";
}
/*
* 处理器方法返回String,表示完整视图路径,此时不能配置视图解析器
* */
@RequestMapping(value = "/returnString-view2.do")
public String doReturnView2(HttpServletRequest request,String name,Integer age){
    System.out.println("doReturnView,name="+name+"    +age"+age);
    //可以自己手工添加数据到request作用域
    request.setAttribute("myname",name);
    request.setAttribute("myage",age);
    //show:逻辑视图名称,项目中配置了视图解析器
    //框架对视图执行forward转发操作
    return "/WEB-INF/View/show.jsp";
}

jsp

<p>处理器方法返回值String</p>
<form action="returnString-view.do" method="post">
    姓名:<input type="text" name="name"><br/>
    年龄:<input type="text" name="age"><br/>
    <input type="submit" value="提交参数">
</form>

<p>处理器方法返回值String表示视图完整路径</p>
<form action="returnString-view2.do" method="post">
    姓名:<input type="text" name="name"><br/>
    年龄:<input type="text" name="age"><br/>
    <input type="submit" value="提交参数">
</form>

返回值void
ajax

controller.java
/*
*

  • returnVoid-ajax.do
* 处理器方法返回Void响应ajax请求
* 手工实现ajax,json数据,到吗有重复的 1.java对象转为json;2.同学HttpServletResponse输出json数据
* */
@RequestMapping(value = "/returnVoid-ajax.do")
public void doReturnVoidAjax(HttpServletResponse response,String name,Integer age) throws IOException {
    System.out.println("doReturnView,name="+name+"    +age"+age);
    //处理ajax,使用json做 数据的格式
    //service调用完成了,使用student表示处理结果
    Student student =new Student();
    student.setName(name);
    student.setAge(age);

    String json = "";
    //把结果转换为json类型的数据
    if(student != null){
        ObjectMapper om   =new ObjectMapper();
        json = om.writeValueAsString(student);
        System.out.println("student转换的json===="+json);
    }
    //输出数据,响应ajax的请求
    response.setContentType("application/json;charset=utf-8");
    PrintWriter pw  = response.getWriter();
    pw.println(json);
    pw.flush();
    pw.close();

}

返回对象Object

做ajax,主要使用json的数据格式。实现步骤:

1.再加入json的工具库的依赖,springmvc默认使用的jackson。

2.在springmvc配置文件之间加入<mvc:annotation-driven>注解驱动。

​ json=om.writeValueAsString(student);

3.在处理器方法的而上面加入@ResponseBody注解

​ response.setContentType(“application/json;charset=utf-8”);

​ PrintWriter pw = response.getWriter();

​ pw.println(json);

springmvc处理器方法返回Object,可以转为json输出到浏览器,响应ajax的内部原理

1.mvc:annotation-driven注解驱动。

​ 注解驱动实现的功能是 完成Java对象到json、xml、text,二进制等数据格式的转换。

在加入到springmvc配置文件后,会自动创建HttpMessageConverter接口

的7个实现类,包括MappingJackson2HttpMessageConverter(使用jackson工具库中的ObjectMapper实现java)

HttpMessageConverter接口:消息转换器。

功能定义了java转为json,xml等数据格式的方法。这个接口有很多实现类。

现在做ajax,主要使用json的数据格式,

实现步骤:

1.加入处理json的工具库的依赖,springmvc默认使用jackson。

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.9.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.0</version>
</dependency>

2.在springmvc配置文件之间加入

<mvc:annotation-driven>

注解驱动。

json = om.writeValueAsString(student);

3.在处理器方法的上面加入@ResponseBody注解

//输出数据,响应ajax的请求
response.setContentType("application/json;charset=utf-8");
PrintWriter pw  = response.getWriter();
pw.println(json);

springmvc处理器方法返回Object,可以转为json输出到浏览器,响应ajax的

内部原理
1.mvc:annotation-driven注解驱动。

注解驱动实现的功能是 完成java对象到json.xml.text,二进制等数据格式的转换。

HttpMessageConvetor接口:消息转换器 。

mvc:annotation-driven在加入到springmvc配置文件后,会自动创建HttpMessageConvetor接口的七个实现类对象。

包括 MappingJackson2HttpMessageConverter(使用jackson工具库中的ObjectMapper实现java对象转换为jason对象)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
功能:定义了java对象转为json、xml等数据格式方法,这个接口有很多的实现类。在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
这些实现类完成java对象到json、,java对象 到xml,java对象到到二进制数据的转换

下面的两个方法是控制器 类把结果输出给浏览器时使用的:

boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);
void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)
      throws IOException, HttpMessageNotWritableException;

1)canwrite作用检查处理器的返回值,能不能转为var2表示的数据格式。

检查student(lisi,20)能不能转为var2表示的数据格式。如果能转换为json,canWriter返回true

MediaType:表示数格式的 例如json、xml等等

2)write:把处理器方法的返回值对象,调用jackson中的ObjectMapper转为json字符串。

json = om.writeValueAsString(student);
2.@ResponseBody注解

放在处理器方法的上面,通过HttpServletResponse输出数据,响应ajax请求的。

response.setContentType("application/json;charset=utf-8");
PrintWriter pw  = response.getWriter();
pw.println(json);
pw.flush();
pw.close();

在这里插入图片描述

/*
* 处理器方法返回一个Student,通过框架转为json,响应ajax请求
* @ResponseBody:
* 作用:把处理器方法返回对象转为json后,通过HttpServletResponse输出给浏览器。
* 位置:方法的定义上面。和其他注解没有顺序关系。
* 返回对象框架的处理流程:
* 1.框架会把返回值Student类型,调用框架的中ArrayList中每个类 conWrite()方法
* 检查那个HttpMessageConvertor接口的实现类能处理Student类型的数据–MappingJackson2HttpMessageConvertor
*
* 2.框架会调用实现类的write(),MappingJackson2HttpMessageConvertor的write()方法
* 把李四同学的饿student对象转为json,调用 Jackson的ObjectMappr实现转为json
* Content-Type: application/json;charset=utf-8
*
3.框架会调用@ResponseBody把2的结果数据输出到浏览器,ajax请求处理完成
*/

    @RequestMapping(value = "/doStudent.do")
    @ResponseBody
    public Student doSome(HttpServletResponse response,String name,Integer age) throws IOException {
        Student student = new Student();
        student.setName("李四同学");
        student.setAge(20);
        return student;
    }
}

jsp

提交参数给Controller

返回值List是JsonArray

<script type="text/javascript">
    $(function (){
        $("button").click(function (){
            // alert("button click")
            $.ajax({
                url: "doStudentJsonArray.do",
                data:{
                    name:"zhangsan",
                    age:20
                },
                type:"post",
                dataType:"json",
                success:function(resp){
                    //resp返回的是json格式的字符串
                    //jquery会把字符串转为json对象,赋值给resp形参

                    // alert(resp.name+"   "+resp.age);
                    $.each(resp,function (i,n){
                        alert(n.name+""+n.age)
                    })
                }
            } )
        })
    })

</script>

返回值是String是文本数据

处理器方法返回的是String,String表示数据的,不是视图。

区分返回值String是数据,还是视图,看看有没有@ResponseBody注解

如果有@ResponseBody注解,返回String就是数据,反之就是视图

@RequestMapping("/returnStringData.do")
@ResponseBody
public String doStringData(String name,Integer age){
    return "Hello SpringMVC返回对象表示数据";
}

text/plain;charset=ISO-8859-1

默认使用“text/plain;charset=ISO-8859-1”作为contentType,导致中文有乱码

解决方案:给ReqeustMapping增加一个属性produces,使用这个属性指定新的contentType

@RequestMapping(value = "/returnStringData.do",produces = "text/plain;charset=utf-8")
@ResponseBody
public String doStringData(String name,Integer age){
    return "Hello SpringMVC返回对象表示数据";

}

编码方式:text/plain;charset=utf-8

处理过程

  • 1.框架会把返回值String类型,调用框架的中ArrayList中每个类 conWrite()方法*
  • 检查那个HttpMessageConvertor接口的实现类能处理String类型的数据–StringHttpMessageConvertor**
  • 2.框架会调用实现类的write(),StringHttpMessageConvertor的write()方法*
  • 把字符串按照指定的编码来处理* Content-Type: text/plain;charset=utf-8*
  • 3.框架会调用@ResponseBody把2的结果数据输出到浏览器,ajax请求处理完成* */

解读url-pattern

<servlet-mapping>
    <servlet-name>myweb</servlet-name>
    <!--
        使用框架的时候,url-pattern可以使用两种值
        1.使用扩展名方式,语法 *.xxxx,xxxx是自定义的扩展名。常用的方式 *.do,*.action,*.mvc等等
        http://localhost:8080/myweb/some.do
        http://localhost:8080/myweb/other.do

        2.使用“/”
     -->

    <url-pattern>*.do</url-pattern>
</servlet-mapping>

.do 结尾的会返回给中央处理器myweb处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值