消息 转换器
将请求头的数据转换为 action对应方法的参数
将方法返回值内容转换成响应头
必须使用 post方式提交
简单的消息转换例子
将一个 消息 如 0755-5451212 经过 处理 转换成对应的参数
1:首先要 自定义消息转换器
MyMessageConventor..java 继承 AbstractHttpMessageConverter
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
/**
* 1:首先 继承 AbstractHttpMessageConverter <>
* <> 泛型里面放的是转换消息对应的对象。
*
* @author Administrator
*
*/
public class MyMessageTransition extends AbstractHttpMessageConverter<PhoneNumber> {
/**
* 将请求消息 进行逻辑处理且传入
*/
@Override
protected PhoneNumber readInternal(Class<? extends PhoneNumber> arg0,
HttpInputMessage msg) throws IOException,
HttpMessageNotReadableException {
//获取 消息所在的请求正文
InputStream is= msg.getBody();
//读取 消息
BufferedReader br=new BufferedReader(new InputStreamReader(is));
//截取需要的消息
String message=br.readLine().split("=")[1];
PhoneNumber phone = new PhoneNumber();
phone.setPhone(message.toString().split("-")[0]);
phone.setNumber(message.toString().split("-")[1]);
return phone;
}
/**
* 第一个进入的方法
* 是否支持当前对象的消息转换
*/
@Override
protected boolean supports(Class<?> arg0) {
if(arg0==PhoneNumber.class){
//true 表示 支持 跳入readInternal 方法
return true;
}
return false;
}
/**
* 最后进入的方法
* 将返回的对象转换成字符串显示在网页上
*/
@Override
protected void writeInternal(PhoneNumber phone, HttpOutputMessage msg)
throws IOException, HttpMessageNotWritableException {
//将对象属性变为需要的字符串
String phones=phone.getPhone()+"--"+phone.getNumber();
msg.getBody().write(phones.getBytes("utf-8"));
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
">
<context:component-scan base-package="cn"></context:component-scan>
<mvc:annotation-driven>
<mvc:message-converters>
<bean id="transition" class="cn.zj.mvc.lesson02.MyMessageTransition">
<!-- 在父类里面有这个属性 ,可以直接引入 -->
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=utf-8</value>
<!-- application 可以在任意 form 表单里面 enctype 属性默认找到 -->
<value>application/x-www-form-urlencoded</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
web.xml文件如下
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<filter>
<filter-name>utf</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>
</filter>
<filter-mapping>
<filter-name>utf</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加载 springmvc 文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
</beans>
3.action 文件
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class MessageTransition {
/**
* 消息 转换器
* 将请求头的数据转换为 action对应方法的参数
* 将方法返回值内容转换成响应头
* 必须使用 post方式提交
*
* 要将消息转换成对象用 @RequestBody
* 将对象返回给响应头用 @ResponseBody 可以放在方法上面 也可以放在 类型前面
*
*
* 运行流程
* 1: 消息 通过 from post 方法传入 到 一个action
* 如果 继承了 AbstractHttpMessageConverter 类 且在 spring.xml文件中配置
*
* 2:进入supports 方法 返回true进入3
*
* 3:进入 readInternal方法
*
* 4:进入 action方法
*
* 5:进入 writeInternal方法
*
*
*/
@RequestMapping("/message")
public @ResponseBody PhoneNumber messageTran(@RequestBody PhoneNumber phone){
System.out.println(phone.getPhone()+"_"+phone.getNumber());
return phone;
}
}
4.jsp 界面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'message.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="${pageContext.request.contextPath}/message.action" method="post">
<input type="hidden" name="phone" value="0731-0258444"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>