SpringMVC(六)-响应数据和结果视图

一、返回值分类

1、请求返回值为字符串

(1)点击response.jsp中的超链接,发送请求。

(2)根据请求路径,执行UserController类中的testString()方法,查到数据放入Model中,Model可以把值传到request域,这样页面就可以拿到数据了

(3)UserController类中的testString()方法返回字符串"success",在springmvc.xml中配置的视图解析器,会根据配置及返回值,找到/WEB-INF/pages/目录下的success.jsp,并跳转至这个页面。

(4)success.jsp页面中<page>标签中配置的 isELIgnored="false" 会使EL表达式生效,从而在页面上显示出后台查询出的值。

<!-- response.jsp,发起请求连接的页面 -->

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="user/testString" >testString</a>
</body>
</html>
<!-- success.jsp,请求成功后的页面 -->

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <h3>执行成功</h3>

    ${user.username}
    ${user.password}

</body>
</html>
@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/testString")
    public String testString(Model model){
        System.out.println("testString方法执行了...");
        // 模拟从数据库中查询出User对象
        User user = new User();
        user.setUsername("小明");
        user.setPassword("123");
        user.setAge(18);
        // model对象
        model.addAttribute("user",user);
        return "success";
    }

}
public class User implements Serializable{

    private String username;
    private String password;
    private Integer age;

    // 省略get and set 
}

2、请求无返回值

(1)如果不做处理,即执行testVoidOne()方法,后台执行完后默认会去@RequestMapping()标注的路径下找jsp文件,如下代码若不处理,则会到:项目名/WEB-INF/pages/user目录下找testVoid.jsp文件。

(2)调用请求转发(只进行一次请求),即执行testVoidTwo()方法,不会使用springmvc.xml中配置的视图解析器,所以转发页面目录地址要写完整。

(3)调用请求重定向(进行两次请求),即执行testVoidThree()方法,第二次请求不能直接访问/WEB-INF/pages/目录,要利用request.getContextPath()方法获取项目名,拼接完整页面文件路径。

(4)直接通过输出流响应数据,即执行testVoidFour()方法,要注意设置中文编码格式

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/testVoidOne")
    public void testVoidOne(Model model){
        System.out.println("testVoidOne方法执行了...");
    }

    @RequestMapping("/testVoidTwo")
    public void testVoidTwo(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("testVoidTwo方法执行了...");
        request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
        return;
    }

    @RequestMapping("/testVoidThree")
    public void testVoidThree(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("testVoidThree方法执行了...");
        response.sendRedirect(request.getContextPath()+"/index.jsp");
        return;
    }

    @RequestMapping("/testVoidFour")
    public void testVoidFour(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("testVoidFour方法执行了...");

        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        response.getWriter().print("你好");
        return;
    }

}

3、返回ModelAndView对象

ModelAndView是SpringMVC为我们提供的一个对象,该对象也可以用作控制器方法的返回值。

<!-- response.jsp,发起请求连接的页面 -->

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="user/testModelAndView" >testModelAndView</a>
</body>
</html>
@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/testModelAndView")
    public String testModelAndView(){
        System.out.println("testModelAndView方法执行了...");
        ModelAndView mv = new ModelAndView();

        // 模拟从数据库中查询出User对象
        User user = new User();
        user.setUsername("小明");
        user.setPassword("123");
        user.setAge(18);

        // 把user对象存储到mv对象中,也会把user对象存入到request对象
        mv.addObject("user",user);

        // 跳转到哪个页面
        mv.setViewName("success");

        return mv;
    }

}

 

二、利用关键字进行转发和重定向(使用较少)

用关键字进行转发(forward)和重定向(redirect),是无法使用视图解析器的,所以跳转到的页面目录地址要写完整。重定向(redirect)的页面目录地址不必写出项目名,框架自动填补了。

<!-- response.jsp,发起请求连接的页面 -->

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="user/testForwardOrRedirect" >testForwardOrRedirect</a>
</body>
</html>
@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/testForwardOrRedirect")
    public String testForwardOrRedirect(){
        System.out.println("testForwardOrRedirect方法执行了...");

        // 请求的转发
        // return "forward:/WEB-INF/pages/success.jsp";

        // 重定向
        return "redirect:/index.jsp";
    }

}

 

三、ResponseBody响应json数据

(1)利用ajax发送异步请求,在src/main/webapp/js文件夹下导入jquery.min.js,并在发送请求页面导入。

(2)由于DispatcherServlet会拦截到所有的资源,就会导致静态资源(img、css、js)也被拦截而不能使用。需要在springmvc.xml文件添加不拦截静态资源文件的配置,见以下代码。

(3)ajax中要以json字符串的形式,封装传入后台的数据,字符串中的key要与JavaBean的属性名称一致。控制器中@RequestBody注解会自动将客户端传来的json数据封装为相应的JavaBean,但是需要导入jackson相关jar包。

(4)后台控制器处理完业务之后,@ResponseBody注解会将JavaBean对象数据转换为json格式数据返回给客户端,从而完成异步请求。

<!-- jackson相关jar包引入 -->
<dependency>
    <groupId>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>
    <!-- springmvc.xml文件添加的配置内容 -->
    <!-- 前端控制器,哪些静态资源不拦截 -->
    <mvc:resources location="/css/" mapping="/css/**"/>
    <mvc:resources location="/images/" mapping="/images/**"/>
    <mvc:resources location="/js/" mapping="/js/**"/>

 

<!-- response.jsp,发起请求连接的页面 -->

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script src="js/jquery.min.js"></script>

    <script>
        // 页面加载,绑定单击事件
        $(function(){
            $("#btn").click(function(){
                // alert("hello btn");
                // 发送ajax请求
                $.ajax({
                    // 编写json格式,设置属性和值
                    url:"user/testAjax",
                    contentType:"application/json;charset=UTF-8",
                    data:'{"username":"Jack","password":"123","age":26}',
                    dataType:"json",
                    type:"post",
                    success:function(data){
                        // data服务器端响应的json的数据,进行解析
                        alert(data);
                        alert(data.username);
                        alert(data.password);
                        alert(data.age);
                    }
                });
            });
        });
    </script>

</head>

<body>
    <button id="btn">发送ajax的请求</button>
</body>
</html>
@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/testAjax")
    public @ResponseBody User testAjax(@RequestBody User user){
        System.out.println("testAjax方法执行了...");

        // 客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
        System.out.println(user);

        // 模拟查询数据库
        user.setUsername("Tom");
        user.setAge(28);
        
        // 响应
        return user;
    }

}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值