SpringMVC--07HttpMessageConverter

HttpMessageConverter

这是一个消息转换器,用于java对象和请求体,响应体内容直接的相互转换

使用原生Servlet API完成AJAX请求

web.xml

<!--字符编码过滤器-->
<filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <!--初始化参数-->
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceRequestEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>forceResponseEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<!--springmvc控制器-->
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

springmvc-servlet.xml

<!--导入扫描包-->
<context:component-scan base-package="com.atli"></context:component-scan>

<!--thymeleaf视图解析器-->
<bean id="thymeleafViewResolver" class="org.thymeleaf.spring6.view.ThymeleafViewResolver">
    <!--作用与视图渲染的过程中,可以设置视图渲染后输出时采用的编码字符集-->
    <property name="characterEncoding" value="UTF-8"></property>
    <!--如果配置多个视图解析器,它来决定优先使用那个视图解析器,值越小优先级越高-->
    <property name="order" value="1"></property>
    <!--当ThymeleafViewResolver渲染模板是,会使用该模板引擎来解析,编译和渲染模板-->
    <property name="templateEngine">
        <bean class="org.thymeleaf.spring6.SpringTemplateEngine">
            <!--用于指定Thymeleaf 模板引擎使用的模板解析器。模板解析器负责根据模板位置、目标资源名称,文件编码等信息,加载模板并对其进行解析-->
            <property name="templateResolver">
                <bean class="org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver">
                    <!--设置模板文件的位置(前缀)-->
                    <property name="prefix" value="/WEB-INF/templates/"></property>
                    <!--设置模板文件后缀,thymeleaf文件扩展名不一定是html,也可以是其他,如txt-->
                    <property name="suffix" value=".html"></property>
                    <!--设置模板引擎类型,列如HTML,TEXT,JAVASCRIPT,CSS等-->
                    <property name="templateMode" value="HTML"></property>
                    <!--用于模板文件在读取和解析过程中采用的编码字符集-->
                    <property name="characterEncoding" value="UTF-8"></property>
                </bean>
            </property>
        </bean>
    </property>
</bean>

<!--开启注解支持-->
<mvc:annotation-driven />
<!--视图控制器-->
<mvc:view-controller path="/" view-name="index" />
<!--静态资源处理-->
<mvc:default-servlet-handler/>

AJAXController.java

@Controller
public class AJAXController {
    @GetMapping("/ajax")
    public void ajax(HttpServletResponse response) throws IOException {
        PrintWriter writer = response.getWriter();
        writer.println("from ajax");
    }
}

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script th:src="@{/static/vue3.js}"></script>
    <script th:src="@{/static/axios.js}"></script>
</head>
<body>
<div id="App">
    <button name="message" onclick="getMessage" value="check me"></button>
    <h1>{{message}}</h1>
</div>

<script th:inline="javascript">
    Vue.createApp({
        data(){
            return {
                message : ''
            }
        },
        methods:{
            /*ajax请求*/
            async getMessage(){
               let response = await axios.get('/ajax')
                this.message=response.data
            }
        }
    }).mount("#App")
</script>
</body>
</html>

@ResponseBody注解

上方写到的控制器方法采用原生的Servlet API来完成AJAX请求有诸多不便

此时我们只需要一个@ResponseBody注解就可以完成上述工作,底层实现依旧是使用原生的API进行


// @Controller
// public class AJAXController {
//     @GetMapping("/ajax")
//     public void ajax(HttpServletResponse response) throws IOException {
//         PrintWriter writer = response.getWriter();
//         writer.println("from ajax");
//     }
// }


@Controller
@ResponseBody
public class AJAXController {
    @GetMapping("/ajax")
    public String ajax(){
        return "from ajax"
    }
}
// 该程序使用的是StringHttpMessageConverter消息转换器

@ResponseBody注解不仅能转换字符串还能将java对象与json串进行相互转换(需要添加jackson依赖)

@Controller
@ResponseBody
public class AJAXController {
    @GetMapping("/ajax")
    // 假设有一个User类属性为name和age
    public User ajax(){
        return new User("li","12");
    }
}

通过上述代码,前端会收到[{'name':'li'},{'age':12}]的json格式字符串
此时底层使用了MappingJackon2HttpMessageConverter消息转换器

对于FormHttpMessageConverter消息转换器在之前就有所涉及,即将响应体中数据转换为java对象

// request body: name=li&age=12
// 若前端是发送的json格式数据那么需要在前端响应头中添加
// xhr.setRequestHeader("Content-Type","application/json");
// 并且在形参前添加@RequestBody注解
@Controller
public class AJAXController(User user) {
}

@RestController注解

这是一个复合注解,用于类上,相当于@Controller+@RequestBody

@RequestBody注解

该注解用于控制器方法的参数上,使用该注解后,会将请求体中的数据直接赋值给被注解的变量(String)

// requestBody: from user
@RequestMapping("/save")
public String save(@RequestBody String requestBodyStr){
    // 会输出 from user
    System.out.println(requestBodyStr);
    return 'success';
}

同时,该注解最常用的方法是将前端传递的JSON格式数据转换为对象(注意涉及json转换的都需要相关依赖)

// requestBody: [{'name':'li'},{'age':12}]
@RequestMapping("/save")
@RequestBody
public String save(@RequestBody User user){
    return 'success';
}

RequestEntity类

该类封装了整个请求协议,使用时直接添加在处理器方法的形参上,可以用于获取所有的请求信息

ResponseEntity类

该类封装了整个响应协议,可以实现自定义的响应,使用同RequestEntity类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值