Struts2 类型转换

实现的目标,将页面中的字符转为对象,如Larry;123456 转为 User对象,username为Larry,password为123456。

如何实现:

Struts的类型转换,对于8个原生数据类型以及Date,String等常见类型,
Struts2可以使用内建的类型转换器实现自动转换;但对于自定义的对象
来说,就需要我们自己指定类型转换的方式了。

 一、原始的类型转换方式 (局部类型转换)

工程用到的文件如下图所示

1、创建测试页面test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>使用分号隔开用户名和密码</h1>
	<form action="userAction">
	 user info: <input type="text" name="user"> <br>
	 
	 <input type="submit" value="submit">
	</form>
</body>
</html>

  

2、创建userAction

public class UserAction extends ActionSupport {

	
	private User user;

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
	

	@Override
	public String execute() throws Exception {
		System.out.println("username:" + user.getUsername());
		System.out.println("password:" + user.getPassword());
		return SUCCESS;
		
	}
}

  输出用户名和密码

3、在struts.xml中添加配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
	"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
   <!-- 是否开启动态方法调用 -->
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
	<package name="default" namespace="/" extends="struts-default">
		 <action name="login" class="com.example.struts2.LoginAction" method="login">
			<result name="success">/success.jsp</result>
			<result name="error">/error.jsp</result>
			<result name="result">/result.jsp</result>
		</action> 
		<action name="helloworld" class="com.example.struts2.HelloWorldAction">
			<result name="success">/success.jsp</result>
			<result name="result">/result.jsp</result>
		</action> 
		<action name="userAction" class="com.example.struts2.UserAction">
			<result name="success">/output.jsp</result>
		</action>
	</package>
</struts>  

output.jsp文件如下:

<%@ page language="java" contentType="text/html;charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<s:property value="user" />

</body>

</html>

  

  

4、创建转换器

public class UserConverter extends DefaultTypeConverter {
	
	

	@Override
	public Object convertValue(Map<String, Object> context, Object value, Class toType) {
		
		if(User.class == toType){ //从页面向后台对象转换
			String[] str = (String[])value;
			String firstValue = str[0];
			StringTokenizer st = new StringTokenizer(firstValue,";");
			String username = st.nextToken();
			String password = st.nextToken();
			
			User user = new User();
			user.setUsername(username);
			user.setPassword(password);
			
			return user;
			
			
		}
		
		return null;
		
	}
	
}

  并且增加配置文件UserAction-conversion.properties

内容为:user=com.example.converter.UserConverter

位于UserAction中的user变量使用com.example.converter.UserConverter转换器

5、测试

打开test.jsp

 然后点击提交

控制台输出如下

 提交后页面结果

二、Struts自带的类型转换 (局部类型转换)

可以使用Struts2框架自带的类型转换器StrutsTypeConverter简化类型转换代码的编,
StrutsTypeConverter继承于DefaultTypeConverter父类,并且提供了两个抽象方法
convertFromString与convertToString,分别表示从页面的字符串转换为后台对象以及
从后台对象转换为页面的字符串,我们只需实现这两个抽象方法即可实现类型转换。

1、单个类型转换

创建类型转换器

public class UserConverter2 extends StrutsTypeConverter {


	@Override
	public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
		User user = new User();
		String value = arg1[0];
	
		StringTokenizer st = new StringTokenizer(value,";");
		user.setUsername(st.nextToken());
		user.setPassword(st.nextToken());
		return user;
	}


	@Override
	public String convertToString(Map arg0, Object arg1) {
		
		User user = (User)arg1;
		
		String username = user.getUsername();
		String password = user.getPassword();
		
		String userInfo = "username :" + username + ",password :" + password;
		
		
		return userInfo;
	}
	
	

	
	
}

  修改配置文件

 输出结果和上面是一致的。

2、批量类型转换(局部类型转换)

 1)增加input.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>使用分号隔开用户名和密码</h1>
	<form action="userAction2">
	 user info 1: <input type="text" name="user"> <br>
	 user info 2: <input type="text" name="user"> <br>
	 user info 3: <input type="text" name="user"> <br>
	 user info 4: <input type="text" name="user"> <br>
	 
	 <input type="submit" value="submit">
	</form>
</body>
</html>

  

2)UserAction2 

public class UserAction2 extends ActionSupport {

	
	private List<User> user;


	public List<User> getUser() {
		return user;
	}


	public void setUser(List<User> user) {
		this.user = user;
	}



	@Override
	public String execute() throws Exception {
		for(User u: user){
			System.out.println("username:" + u.getUsername());
			System.out.println("password:" + u.getPassword());
		}
		
		return SUCCESS;
		
	}
}

  

3)struts.xml增加配置

	<action name="userAction2" class="com.example.struts2.UserAction2">
			<result name="success">/output.jsp</result>
		</action>

  

4、增加转换器

public class UserConverter3 extends StrutsTypeConverter {


	@Override
	public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
		List<User> list = new ArrayList<>();
		
		for(String value : arg1){
			User user = new User();
			StringTokenizer st = new StringTokenizer(value,";");
			user.setUsername(st.nextToken());
			user.setPassword(st.nextToken());
			list.add(user);
		}
		
		return list;
	}


	@Override
	public String convertToString(Map arg0, Object arg1) {
		
		List<User> list = (List<User>)arg1;
		StringBuffer buffer = new StringBuffer();
		for(User user : list){
			String username = user.getUsername();
			String password = user.getPassword();
			buffer.append("username:").append(username).append(",password:" ).append(password).append(" ");
			
		}
		
		
		
		
		return buffer.toString();
	}
	
	

	
	
}

  增加属性文件

5)测试结果

 点击提交后返回

三、全局类型转换

在src目录下创建xwork-conversion.properties,该文件的内容是待转换的类=转换器的名字,即

com.example.bean.User=com.exmaple.converter.UserConverter2

 1、创建全局配置属性文件

2、修改input.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>使用分号隔开用户名和密码</h1>
	<form action="userAction">
	 user info 1: <input type="text" name="user"> <br>
	 <input type="submit" value="submit">
	</form>
</body>
</html>

  

3、提交后显示

原文地址:https://www.cnblogs.com/linlf03/p/11519798.html