• SpringMVC入门宝典(五)SpringMVC注解(下)


    目录

    一.@ResponseBody

    二.@RestController

    1.@RestController

    2.静态资源映射

    三.@RequestBody


    一.@ResponseBody

    @ResponseBody、@RestController将方法返回的对象转为JSON格式。

    作用:方法返回的对象转换为 JSON 格式,并将 JSON 数据直接写入到输出流中,使用此注解后不会再经过视图解析器。使用该注解可 以处理 Ajax 请求。
    位置:方法上方或方法返回值前。
    (1) 在webapp下创建js文件,并将jQuery文件引入到js下(学习jQuery请看我的前端系列文章), jsp 页面first3.jsp,发送 ajax 请求
    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>ajax请求</title>
    5. <script src="/js/jquery-2.1.1.min.js"></script>
    6. <script>
    7. $(function (){
    8. $("#btn").click(function (){
    9. var name=$("#name").val();
    10. var sex=$("#sex").val();
    11. //发送异步请求
    12. $.get("/c8/addStudent",{"name":name,"sex":sex},function (data){
    13. console.log(data);
    14. })
    15. })
    16. })
    17. </script>
    18. </head>
    19. <br>
    20. 姓名:<input id="name"><br />
    21. 性别:<input id="sex"><br />
    22. <input type="button" value="提交" id="btn">
    23. </body>
    24. </html>
    (2) 由于 jsp 页面中引入 jQuery js 文件,而 SpringMVC 会拦截所有 资源,造成 jquery.js 失效,需要在 SpringMVC 核心配置文件(springmvc.xml)中放 行静态资源。
    1. <!-- 放行静态资源 -->
    2. <mvc:default-servlet-handler />

     

    (3)在domain下编写结果实体类,该实体类会封装一个请求的结果
    1. // 请求的结果对象
    2. public class Result {  
    3.    private boolean flag; // 请求是否成功  
    4.    private String message; // 请求提示信息
    5.    // 省略getter/setter/构造方法
    6. }
    (4)编写控制器
    1. package com.first.controller;
    2. import com.first.domain.Result;
    3. import com.first.domain.Student;
    4. import org.springframework.stereotype.Controller;
    5. import org.springframework.web.bind.annotation.*;
    6. @Controller
    7. @RequestMapping("/c8")
    8. public class MyController8 {
    9. @GetMapping("/addStudent")
    10. @ResponseBody
    11. public Result addStudent(String name, String sex){
    12. // 输出接受的参数,模拟添加学生
    13. System.out.println(name+":"+sex);
    14. // 返回结果对象
    15. Result result = new Result(true, "添加学生成功!");
    16. return result;
    17. }
    18. }
    (5) SpringMVC 会将 Result 对象转为 JSON 格式写入输出流,而 SpringMVC 默认使用的 JSON 转换器是 jackson ,需要在 pom 中添 jackson 依赖。
    1. <!-- jackson -->
    2. <dependency>
    3. <groupId>com.fasterxml.jackson.core</groupId>
    4. <artifactId>jackson-core</artifactId>
    5. <version>2.9.0</version>
    6. </dependency>
    7. <dependency>
    8. <groupId>com.fasterxml.jackson.core</groupId>
    9. <artifactId>jackson-databind</artifactId>
    10. <version>2.9.0</version>
    11. </dependency>
    12. <dependency>
    13. <groupId>com.fasterxml.jackson.core</groupId>
    14. <artifactId>jackson-annotations</artifactId>
    15. <version>2.9.0</version>
    16. </dependency>

    访问http://localhost:8080/first3.jsp

    输入姓名和性别并提交,数据会提交给相应的控制层。

    控制台会输出前端输入的姓名和性别。

    二.@RestController

    1.@RestController

    如果一个控制器类下的 所有 控制器方法 返回 JSON 格式数据且不进行跳转,可以使用 @RestController 代替 @Controller ,此时每个方 法上的 @ResponseBody 都可以省略。
    如上节的代码可以改成下面那样
    1. package com.first.controller;
    2. import com.first.domain.Result;
    3. import com.first.domain.Student;
    4. import org.springframework.stereotype.Controller;
    5. import org.springframework.web.bind.annotation.*;
    6. //@Controller
    7. @RestController
    8. @RequestMapping("/c8")
    9. public class MyController8 {
    10. @GetMapping("/addStudent")
    11. //@ResponseBody
    12. public Result addStudent(String name, String sex){
    13. // 输出接受的参数,模拟添加学生
    14. System.out.println(name+":"+sex);
    15. // 返回结果对象
    16. Result result = new Result(true, "添加学生成功!");
    17. return result;
    18. }
    19. }

    2.静态资源映射

    当在 DispatcherServlet <url - pattern> 中配置拦截 “/” 时,除了 jsp 文件不会拦截以外,其他所有的请求都会经过前端控制器进行匹配。此 时静态资源例如 css js jpg 等就会被前端控制器拦截,导致不能访 问,出现 404 问题。想要正常映射静态资源共有三种方案:
    配置静态资源筛查器(最简单的配置方法,也是上节用的方法)
    SpringMVC 的配置文件中配置 <mvc:default-servlet-handler />后,会在 Spring 容器中创建一个资源检查器,它对进入 DispatcherServlet URL 进行筛查,如果不是静态资源,才由 DispatcherServlet 处理。
    修改 SpringMVC 核心配置文件:
    <mvc:default-servlet-handler/>
    配置静态资源映射器
    SpringMVC 模块提供了静态资源映射器组件,通过 <mvc:resources> 标签配置静态资源映射器,配置后的路径不会由 DispatcherServlet 理。
    修改 SpringMVC 核心配置文件:
    1. <!--配置静态资源映射器-->
    2. <!-- mapping:配置请求的URL location:资源路径-->
    3. <mvc:resources mapping="/img/" location="/img/"/>
    4. <mvc:resources mapping="/js/" location="/js/"/>
    配置默认 Servlet 处理静态资源
    web.xml 可以配置默认 Servlet 处理静态资源,该 Servlet tomcat提供,它会直接访问静态资源不进行其他操作。这样就避免了使用 DispatcherServlet 对静态资源的拦截:
    修改 web.xml:
    1. <servlet-mapping>
    2. <servlet-name>default</servlet-name>
    3. <url-pattern>*.jpg</url-pattern>
    4. </servlet-mapping>
    5. <servlet-mapping>
    6. <servlet-name>default</servlet-name>
    7. <url-pattern>*.css</url-pattern>
    8. </servlet-mapping>
    9. <servlet-mapping>
    10. <servlet-name>default</servlet-name>
    11. <url-pattern>*.js</url-pattern>
    12. </servlet-mapping>
    13. <servlet-mapping>
    14. <servlet-name>default</servlet-name>
    15. <url-pattern>*.png</url-pattern>
    16. </servlet-mapping>

    三.@RequestBody

    作用:将请求中 JSON 格式的参数转为 JAVA 对象
    位置:写在方法参数前
    1
    (1)AJAX 请求发送 JSON 格式的参数
    first4.jsp:
    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>ajax请求</title>
    5. <script src="/js/jquery-2.1.1.min.js"></script>
    6. <script>
    7. $(function (){
    8. $("#btn").click(function (){
    9. var name=$("#name").val();
    10. var sex=$("#sex").val();
    11. var param = JSON.stringify({"name":name,"sex":sex});
    12. $.ajax({
    13. url:"/c8/addStudent2",
    14. contentType:"application/json",
    15. type:"post",
    16. data:param,
    17. success:function (data){
    18. console.log(data);
    19. }
    20. })
    21. })
    22. })
    23. </script>
    24. </head>
    25. <br>
    26. 姓名:<input id="name"><br />
    27. 性别:<input id="sex"><br />
    28. <input type="button" value="提交" id="btn">
    29. </body>
    30. </html>
    (2)编写控制器
    1. package com.first.controller;
    2. import com.first.domain.Result;
    3. import com.first.domain.Student;
    4. import org.springframework.stereotype.Controller;
    5. import org.springframework.web.bind.annotation.*;
    6. //@Controller
    7. @RestController
    8. @RequestMapping("/c8")
    9. public class MyController8 {
    10. @GetMapping("/addStudent")
    11. //@ResponseBody
    12. public Result addStudent(String name, String sex){
    13. // 输出接受的参数,模拟添加学生
    14. System.out.println(name+":"+sex);
    15. // 返回结果对象
    16. Result result = new Result(true, "添加学生成功!");
    17. return result;
    18. }
    19. @PostMapping("/addStudent2")
    20. //@RequestBody把传过来的json数据封装到到Student对象中
    21. public Result addStudent2(@RequestBody Student student){
    22. // 输出接受的参数,模拟添加学生
    23. System.out.println(student);
    24. // 返回结果对象
    25. Result result = new Result(true, "添加学生成功!");
    26. return result;
    27. }
    28. }

    访问http://localhost:8080/first4.jsp

     控制台输出:

    Student{id=0, name='不一样', sex='女', address=null}

  • 相关阅读:
    为什么推荐Kestrel作为网络开发框架
    【OpenCV】双目相机测距及其深度恢复原理及其算法流程
    【mysql】navicat工具上显示到的表的行数和实际的行数不一致
    libpcap之零拷贝mmap
    web前端大作业:诗人文化网页主题网站【唐代诗人】纯HTML+CSS制作
    正则表达式如何匹配 空字符串““
    【SpringBoot】7.SpringBoot整合Swagger
    docker 安装 jenkins
    SAP EPIC 银企直连 F110S 付款程序的自动预定
    【数据结构】堆,堆的实现,堆排序,TOP-K问题
  • 原文地址:https://blog.csdn.net/weixin_44593822/article/details/125435121