博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
系列四、SpringMVC响应数据和结果视图
阅读量:6983 次
发布时间:2019-06-27

本文共 8255 字,大约阅读时间需要 27 分钟。

hot3.png

项目结构如下

ff0d9b190a6598896b366d8e5e993eaa10f.jpg

一、返回值分类

一 返回字符串

Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址,根据字符串最后跳转到对应jsp页面

第一步、导入依赖坐标文件、配置好webxml文件、springmvc核心配置文件

src/main/java
**/*.xml
src/main/resources
**/*.properties
**/*.xml
5.0.2.RELEASE
UTF-8
1.8
1.8
org.springframework
spring-context
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-webmvc
${spring.version}
javax.servlet
servlet-api
2.5
provided
javax.servlet.jsp
jsp-api
2.0
provided
org.springframework
spring-core
${spring.version}
dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc.xml
1
dispatcherServlet
/
characterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
characterEncodingFilter
/*

第二步、创建实体类以及controller层控制类

package com.cc.entity;public class Student {    private String name;    private int age;    private String password;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    @Override    public String toString() {        return "Student{" +                "name='" + name + '\'' +                ", age=" + age +                ", password='" + password + '\'' +                '}';    }}
package com.cc.controller;import com.cc.entity.Student;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@Controller@RequestMapping("/user")public class UserController {    /**     * 返回参数为字符串类型     * @param model使用Model向视图层传递student对象     * @return     */    @RequestMapping("/testString")    public  String testString(Model model){        System.out.println("testString.....");        //模拟数据库查询功能        Student student=new Student();        student.setName("美美");        student.setAge(20);        student.setPassword("123456");        //model对象        model.addAttribute("student",student);        return "success";    }}

第三步、创建response.jsp响应页面,相应的执行页面

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>    Title    <%--响应结果为字符串--%>

9c0a7783f5c2cb2f56972e3e1173ee69d87.jpg

274125c7019d26c0ddff375b4f53bab0dc5.jpg

 

3bbc29d21666e720c1de6c7bbed535a575e.jpg

二、返回值是void

controller层代码添加如下代码

返回值是void类型,想跳转相应的页面,可以使用HttpServletResponse api进行转发或者是重定向,也可以直接响应页面在输入http://localhost:8080/user/testVoid,会直接响应输出 hello

/**     * 返回结果为void     * 请求转发是一次请求     * @param     */    @RequestMapping("/testVoid")    public  void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception{        System.out.println("testVoid.....");        //使用原生api,编写请求转发        request.getRequestDispatcher("/pages/success.jsp").forward(request, response);        //使用重定向        //response.sendRedirect(request.getContextPath()+"/pages/success.jsp");        //访问servet会直接进行响应        //response.getWriter().println("hello");        return;    }

response.jsp页面添加如下代码

<%--响应结果为void--%>    testVoid

6069cff7f39fccd6b7252aa12523919c5fa.jpg350a6aaef5279cb951046149a2a6e0d6bc3.jpg

0fba7e7899448c55e8b327aac60a7be95b5.jpg

三、返回值是ModelAndView对象

controller层修改代码如下:ModelAndView 作为返回值,其实本质上是实现ModelMap接口

/**     * 本质上和model是一样的,model底层实现都是modelMap     * @return     */    @RequestMapping("/testModelAndView")    public ModelAndView testModelAndView() {        System.out.println("testModelAndView.....");        //创建ModelAndView对象        ModelAndView mv=new ModelAndView();        Student student=new Student();        student.setName("美美");        student.setAge(20);        student.setPassword("123456");        //把user对象存储到对象中,也会把user对象存入request对象中        mv.addObject("student",student);        //跳转到那个页面        mv.setViewName("success");        return mv;    }

response.jsp页面修改代码如下

<%--响应结果为ModeladnView--%>    testModelAndView

测试如下,携带参数进行请求跳转

4d8bed933519e22f624c45b106dec0db1e1.jpgcab5a8065b554e44d5dbf01183cdaa6b072.jpg

 二、SpringMVC框架提供的转发和重定向

 

直接修改controller层代码,需要注意的地方,使用关键字实现重定向和转发只有,视图配置器这个时候就不起作用了

/**     * 使用关键字 forward和redirect请求页面     * @return     */    @RequestMapping("/test")    public String testForwardandRedirect() {        System.out.println("testForwardandRedirect.....");        //转发请求页面,使用了关键字后,就不能使用视图解析器        //return "forward://pages/success.jsp";        //使用重定向请求页面        //return "redirect:/index.jsp";        return "redirect:/pages/success.jsp";    }

response.jsp页面代码修改如下

<%--使用forword和Redirect实现响应--%>    test

c50898604087fc5dd19e15bc5f8b1ba36bb.jpg22fe96aa52ef188463d5d46fe50fc016956.jpg

0fabe7efe0488080276df93c378c898b0ec.jpg

三. ResponseBody响应json数据

该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的数据如:json,xml 等,通过 Response 响应给客户端,帮我们解决了很多麻烦的事情

第一步、DispatcherServlet会拦截到所有的资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,从而不能被使用。解决问题就是需要配置静态资源不进行拦截,在springmvc.xml配置文件添加如下配置

 mvc:resources标签配置不过滤

location元素表示webapp目录下的包下的所有文件
mapping元素表示以/static开头的所有请求路径,如/static/a 或者/static/a/b

第二步、 使用@RequestBody获取请求体数据

    

 controller层代码修改如下

/**         * 测试响应 json 数据         */        @RequestMapping("/testAjax")        public void  testAjax(@RequestBody String body) {            System.out.println("testAjax is doing");            System.out.println(body);    }

cce1eeeba84439af413c524f179e9ae8781.jpg

后台拿到前端发送过来的数据

ab45f17042ea233460b4b95918acc158319.jpg

第三、 使用@RequestBody注解把json的字符串转换成JavaBean的对象

 1、json字符串和JavaBean对象互相转换的过程中,需要使用jackson的jar包

com.fasterxml.jackson.core
jackson-databind
2.9.0
com.fasterxml.jackson.core
jackson-core
2.9.0
com.fasterxml.jackson.core
jackson-annotations
2.9.0

2、controller层修改代码如下

@RequestMapping("/testAjax")    public @ResponseBody Student  testAjax(@RequestBody Student student) {        //@ResponseBody设置返回封装对象        System.out.println("testAjax is doing");        student.setName("tom");        student.setPassword("123456");        System.out.println(student);        return student;    }

3.response.jsp页面代码如上一步,点击测试代码,控制台额和view层都接收到了数据

42fb8affabdc4f068dc866b96b0a81c0433.jpg

156acd0af88b2241fb58c4aa962e5e81517.jpg

58196411239ba3ae7e6d4f8aa2cc8c2eac4.jpg

转载于:https://my.oschina.net/u/4115727/blog/3055752

你可能感兴趣的文章
Better Software East/DevOps East/Agile Dev East 2016大会上的教程介绍
查看>>
深入理解浏览器的缓存机制
查看>>
详解蚂蚁金服 SOFAJRaft:生产级高性能 Java 实现
查看>>
用PVS在.NET内核中发现的缺陷
查看>>
中国在两年内赶超美国AI?李开复:不一定
查看>>
战胜阿里和腾讯,Ripple已经获得200家跨境支付客户!
查看>>
代码自解释不是不写注释的理由
查看>>
剖析AWS CodeDeploy
查看>>
首次踏入vue坑——阅读zhihudaily-vue源码
查看>>
前端开发工具——汇总篇
查看>>
Rust编程语言的核心部件
查看>>
15条软件开发黄金定律
查看>>
Facebook广告平台遭遇8小时服务中断,或对黑色星期五购物节造成影响
查看>>
关于《在Windows与.NET平台上的持续交付实践》的问答录
查看>>
RTC2018现场速递:实时互动在线上创造了一个新世界
查看>>
JUnit 5 – 早期试用体验 – 第1篇
查看>>
ssh tunnel
查看>>
架构设计复杂度的6个来源
查看>>
Netflix混沌工程手册Part 2:混沌工程原则
查看>>
矩阵:如何使用矩阵操作进行 PageRank 计算?
查看>>