springmvc第十一个练习(处理器方法返回值为List数组和String数据)

一、处理器方法返回值为List数组

项目结构

1.在上文原有基础上修改MyController类

package com.it.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.it.entity.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

@Controller
public class MyController {



    // 处理器方法返回String--表示逻辑视图名称,需要配置视图解析器
    @RequestMapping(value = "/returnString-view.do")
    public String doReturnView(HttpServletRequest request, String name, Integer 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){
        //手动添加数据到request作用域
        request.setAttribute("myname",name);
        request.setAttribute("myage",age);

        //完整视图路径,项目中不能配置视图解析器
        return "/WEB-INF/view/show.jsp";
    }

    //处理器方法返回void,响应ajax请求
    @RequestMapping(value = "/returnVoid-ajax.do")
    public void doReturnVoidAjax(HttpServletResponse response, String name, Integer age) throws IOException {
       //处理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);
        }
        //输出数据,响应ajax请求
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/json;charset=utf-8");
        PrintWriter out=response.getWriter();
        out.println(json);
        out.flush();
        out.close();
    }

    //处理器方法返回一个Student,通过框架转为json,响应ajax请求

    /**
     * @ResponseBody:把处理器方法返回对象转为json后,通过HttpServletResponse输出给浏览器
     * 位置:方法的定义上面。和其它注解不区分先后顺序
     *
     * 返回对象框架的处理流程:
     *1.框架会返回Student类型,调用框架中的ArrayList<HttpMessageConverter>中每个类的canWrite()方法
     * 检查那个HttpMessageConverter接口的实现类能处理Student类型的数据。--MappingJackson2HttpMessageConverter
     *
     * 2.框架会调用现类的write(),MappingJackson2HttpMessageConverter的write()方法
     * 把李四同学的student对象转为json,调用Jackson的ObjectMapping实现转为json
     * contentType:application/json;charset=utf-8
     *
     * 3.框架会调用 @ResponseBody把2步骤的结果数据输出到浏览器,ajax请求处理完成
     */
    @RequestMapping(value = "/returnStudentJson.do")
    @ResponseBody
    public Student doStudnetJsonObject(String name,Integer age){
        //调用service,获取请求结果的数据,Student对象表示结果数据
        Student student=new Student();
        student.setName("小明");
        student.setAge(20);
        return student;//会被框架转为json
    }


    @RequestMapping(value = "/returnStudentJsonArray.do")
    @ResponseBody
    public List<Student> doStudnetJsonObjectArray(String name,Integer age){

        List<Student> list=new ArrayList<>();
        //调用service,获取请求结果的数据,Student对象表示结果数据
        Student student=new Student();
        student.setName("小明");
        student.setAge(20);
        list.add(student);

        student=new Student();
        student.setName("张山");
        student.setAge(20);
        list.add(student);

        return list;//会被框架转为json
    }

}

2..在上文原有基础上修改index.jsp页面


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#btn2").click(function () {
                // alert("按钮单击了")
                $.ajax({
                    url:"returnStudentJsonArray.do",
                    type:"post",
                    success:function (resp) {
                        //resp从服务器端返回的是json格式的字符串{"name":"张山","age":22}
                        //jquery会把字符串转为json对象,赋值给resp形参

                        //[{"name":"小明","age":20},{"name":"张山","age":20}]
                        //alert(resp.name+"      "+resp.age);因为是数组,所以需要循环遍历
                        $.each(resp,function (i,n) {
                            alert(n.name+"    "+n.age)
                        })
                    }
                })
            })
        })
    </script>
</head>
<body>
<h2>处理器方法的返回值</h2>

<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>
<br>

<p>处理器方法的返回值为void</p>
<button id="btn">发起ajax请求</button>
<br>

<p>处理器方法的返回值为Student对象</p>
<button id="btn1">发起ajax请求</button>
<br>

<p>处理器方法的返回值为List数组</p>
<button id="btn2">发起ajax请求</button>
</body>
</html>

3.其他文件保持不变

项目结果

点击发起ajax请求,循环遍历数组中的数据

 

 二、处理器方法的返回值为String数据

         若要返回非中文字符串,将前面返回数值型数据的返回值直接修改为字符串即可。但是 返 回 的 字 符 串 中 带 有 中 文 字 符 , 则 接 收 方 页 面 将 会 出 现 乱 码 。 此 时 需 要 使 用 @RequestMapping produces 属性指定字符集。
         produces ,产品,结果,即该属性用于设置输出结果类型。

index.jsp页面


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#btn3").click(function () {
                // alert("按钮单击了")
                $.ajax({
                    url:"returnStringData.do",
                    type:"post",
                    success:function (resp) {
                        //resp从服务器端返回的是json格式的字符串{"name":"张山","age":22}
                        //jquery会把字符串转为json对象,赋值给resp形参

                        //[{"name":"小明","age":20},{"name":"张山","age":20}]
                        //alert(resp.name+"      "+resp.age);因为是数组,所以需要循环遍历
                        // $.each(resp,function (i,n) {
                        //     alert(n.name+"    "+n.age)
                        // })
                        alert("返回的是文本数据:"+resp)
                    }
                })
            })
        })
    </script>
</head>
<body>
<h2>处理器方法的返回值</h2>

<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>
<br>

<p>处理器方法的返回值为void</p>
<button id="btn">发起ajax请求</button>
<br>

<p>处理器方法的返回值为Student对象</p>
<button id="btn1">发起ajax请求</button>
<br>

<p>处理器方法的返回值为List数组</p>
<button id="btn2">发起ajax请求</button>
<br>

<p>处理器方法的返回值为String数据</p>
<button id="btn3">发起ajax请求</button>
</body>
</html>
MyController类
package com.it.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.it.entity.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

@Controller
public class MyController {



    // 处理器方法返回String--表示逻辑视图名称,需要配置视图解析器
    @RequestMapping(value = "/returnString-view.do")
    public String doReturnView(HttpServletRequest request, String name, Integer 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){
        //手动添加数据到request作用域
        request.setAttribute("myname",name);
        request.setAttribute("myage",age);

        //完整视图路径,项目中不能配置视图解析器
        return "/WEB-INF/view/show.jsp";
    }

    //处理器方法返回void,响应ajax请求
    @RequestMapping(value = "/returnVoid-ajax.do")
    public void doReturnVoidAjax(HttpServletResponse response, String name, Integer age) throws IOException {
       //处理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);
        }
        //输出数据,响应ajax请求
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/json;charset=utf-8");
        PrintWriter out=response.getWriter();
        out.println(json);
        out.flush();
        out.close();
    }

    //处理器方法返回一个Student,通过框架转为json,响应ajax请求

    /**
     * @ResponseBody:把处理器方法返回对象转为json后,通过HttpServletResponse输出给浏览器
     * 位置:方法的定义上面。和其它注解不区分先后顺序
     *
     * 返回对象框架的处理流程:
     *1.框架会返回Student类型,调用框架中的ArrayList<HttpMessageConverter>中每个类的canWrite()方法
     * 检查那个HttpMessageConverter接口的实现类能处理Student类型的数据。--MappingJackson2HttpMessageConverter
     *
     * 2.框架会调用现类的write(),MappingJackson2HttpMessageConverter的write()方法
     * 把李四同学的student对象转为json,调用Jackson的ObjectMapping实现转为json
     * contentType:application/json;charset=utf-8
     *
     * 3.框架会调用 @ResponseBody把2步骤的结果数据输出到浏览器,ajax请求处理完成
     */
    @RequestMapping(value = "/returnStudentJson.do")
    @ResponseBody
    public Student doStudnetJsonObject(String name,Integer age){
        //调用service,获取请求结果的数据,Student对象表示结果数据
        Student student=new Student();
        student.setName("小明");
        student.setAge(20);
        return student;//会被框架转为json
    }


    @RequestMapping(value = "/returnStudentJsonArray.do")
    @ResponseBody
    public List<Student> doStudnetJsonObjectArray(String name,Integer age){

        List<Student> list=new ArrayList<>();
        //调用service,获取请求结果的数据,Student对象表示结果数据
        Student student=new Student();
        student.setName("小明");
        student.setAge(20);
        list.add(student);

        student=new Student();
        student.setName("张山");
        student.setAge(20);
        list.add(student);

        return list;//会被框架转为json
    }

    /**
     * 处理器方法返回的是String,String表示数据的,不是视图。
     * 区分返回值String是数据还是视图,看有没有@ResponseBody注解
     * 如果有@ResponseBody注解,返回String就是数据,反之就是视图。
     */
    @ResponseBody
    @RequestMapping(value = "/returnStringData.do",produces = "text/plain;charset=utf-8")
    public String doStringData(String name,Integer age){
        return "Hello springmvc 返回对象,表示数据";
    }

}

点击发起请求

响应头的Context-Type是在@RequestMapping中的produces属性定义的,text/plain;charset=utf-8;

如果不定义响应类型,输出为的中文字符全部为?,不能正确的显示出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

做一道光

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值