SpringMvc 消息转换器

本文介绍如何在 Spring MVC 中实现自定义消息转换器,包括创建转换器类、配置 XML 文件、设置 web.xml 以及展示实际应用案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


 消息 转换器
  将请求头的数据转换为 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"));
		
	}

}


2.在xml文件中配置 消息转换器


<?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>








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值