springMVC学习(三)——响应

响应数据与结果视图

返回值分类

1)字符串

结果视图:控制器请求处理方法返回值字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。

@RequestMapping("/testReturnString")
public String testReturnString() {
System.out.println("AccountController 的 testReturnString 方法执行了。。。。");
return "success";
}

如 return "success",则视图解析器解析的视图是success.jsp

响应数据:

在控制器请求方法中将数据存入request域,

User user = new User();
user.setUsername("美美");
user.setPassword("123");
user.setAge(30);  
model.addAttribute("user1",user);

取出数据:在结果视图success.jsp:将isELignored设为false,通过表达式${}取出数据

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<body>
    <%--user1为键--%>
    ${user1.username}
    ${user1.password}

</body>
</html>

2)void

视图:

当无return返回值时,默认返回的结果视图的jsp文件的文件名为@RequestMapping的末端路径,如@RequestMapping("/hello"),则默认视图文件为hello.jsp,除此之外,使用Servlet 原始 API 可以作为控制器中方法的参数

   /**
     * 是void
     * 请求转发一次请求,不用编写项目的名称
     * 重定向是两次请求,request.getContextPath()获取项目的名称
     */
    @RequestMapping("/testVoid")
    public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //在controller方法形参上定义request和response,用来指定相应结果
        /**1.使用request转向页面,
         *返回视图路径写完整,因为自己编写的转发方法不会去调用视图解析器
         */
        // request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);

        // 2.也可以使用response页面重定向
        // response.sendRedirect(request.getContextPath()+"/index.jsp");

        // 3.可以通过response直接进行响应

       // 设置解决中文乱码“你好”
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

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

        return;
    }

3)ModelAndView

数据视图一起返回:

   /**
     * 返回ModelAndView
     * @return
     */
    @RequestMapping("/testModelAndView")
    public ModelAndView testModelAndView(){
        // 创建ModelAndView对象
        ModelAndView mv = new ModelAndView();
        System.out.println("testModelAndView方法执行了...");
        // 模拟从数据库中查询出User对象
        User user = new User();
        user.setUsername("小凤");
        user.setPassword("456");
        user.setAge(30);

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

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

 

转发与重定向(重定向是客户端行为,转发是服务器端行为)

都无法使用视图解析器。

 forward转发:

客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完成的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在jsp中都能取出来,因此,jsp能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端。整个过程是一个请求,一个响应。

return "forward:/WEB-INF/pages/success.jsp";

相当于:request.getRequestDispatcher("url").forward(request,response),

若定向到RequestMapping请求路径, 如return "forward:heeee"; 而某个方法的注解修饰为:@RequestMapping(path="/heeee"),且满足请求要求,这样相当于一次执行两个请求,共享request域(数据共享)

redirect重定向:

客户发送一个请求到服务器,服务器匹配servlet,servlet处理完之后调用了sendRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问某个jsp,紧接着客户端收到这个请求后,立刻发出一个新的请求,去请求该jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。(服务器向浏览器发送一个302状态码以及一个location消息头,浏览器收到请求后会向再次根据重定向地址发出请求)

//允许重定向到RequestMapping请求路径
return "redirect:testReturnModelAndView";

相当于response.sendRedirect(url);需要注意的是,如果是重定向到 jsp 页面,则 jsp 页面不能写在 WEB-INF 目录中,否则无法找到。

同时,允许重定向到RequestMapping请求路径,但请求相互独立,不共享request域与数据。

 

@ResponseBody响应json数据

<%@ 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":"hehe","password":"123","age":30}',
                    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>
页面发送ajax异步请求,服务器端返回json数据。发送请求时用到了需要从服务器端获取的js文件,但该文件被前端控制器拦截,需要在springmvc.xml中配置前端控制器使之不再拦截静态资源(js文件,图片,css样式等),
    <!--前端控制器,配置哪些静态资源不拦截-->
    <!--/**指当前目录下所有文件,location相对路径是在webapp下-->
    <mvc:resources location="/css/" mapping="/css/**"/>
    <mvc:resources location="/images/" mapping="/images/**"/>
    <mvc:resources location="/js/" mapping="/js/**"/>

控制器方法:

@ResponseBody:该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的数据如:json,xml 等,通过 Response 响应给客户端

前置知识点: Springmvc 默认用 MappingJacksonHttpMessageConverter json 数据进行转换,需要导入jackson 的包。
   <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>
@RequestMapping("/testResponseJson")
public @ResponseBody Account testResponseJson(@RequestBody Account account) {
    ……
    ……
    return account;
}

修饰参数的注解用于将传入请求的json数据转换成对象,修饰返回值类型的注解用于将对象转换成json返回响应。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值