- 基于OGNL的类型转换器
自定义类型转换器需要你继承ognl.DefaultTypeConverter类,并且重写该类中的 converValue()方法。
其中三个参数的意义。
Map context:表示类型转换的上下文环境
Object value:表示需要进行类型转换的参数,由于Struts2框架的类型转换器可以实现双向转换,所以根据转换方向,该参数的意义不同。当把复合类型转换为字符串类型时,该参数表示复合类型。当把字符串类型转换为复合类型时,该参数表示一个字符串数组。
Class toType:表示转换目标的类型,当把复合类型转换为字符串类型时,该参数表示字符串类型。当把字符串类型转换为复合类型时,该参数表示复合类。。
1定义User类
package entity;
public class User {
private String userName;
private String userPassword;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
}
定义UserAction.java
package action;
import com.opensymphony.xwork2.ActionSupport;
import entity.User;
@SuppressWarnings("serial")
public class UserAction extends ActionSupport{
private String message;
private User user;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String execute(){
if(getUser() != null){
message = "您输入的信息为:用户名:"+user.getUserName()+", 密码:"+user.getUserPassword();
return SUCCESS;
}else{
return INPUT;
}
}
}
配置userAction
<action name="userAction" class="action.UserAction">
<result name="success">/loginSuccess.jsp</result>
<result name="input">/login.jsp</result>
</action>
自定义类型转换器UserConverter.java
package util;
import java.util.Map;
import entity.User;
import ognl.DefaultTypeConverter;
public class UserConverter extends DefaultTypeConverter {
@SuppressWarnings("unchecked")
public Object convertValue(Map context, Object value, Class toType){
if (toType == User.class ){ //字符串类型转复合类型
String[] params = (String[])value;
User user = new User();
String[] userValues = params[0].split(",");
user.setUserName(userValues[0]);
user.setUserPassword(userValues[1]);
return user;
}else if (toType == String.class ){ //复合类型转字符串类型
User user = (User) value;
return "<" + user.getUserName() + "," + user.getUserPassword() + ">";
}
return null ;
}
}
在Action的包下配置UserAction-conversion.properties
user=util.UserConverter
user表示Action类中的User对象,util.UserConver表示自定义转换器类所在的路劲
login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>类型转换</title>
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body >
<jsp:include page="index.html"></jsp:include>
<s:form action="userAction" method="post" >
<s:textfield name="user.userName" label="登录"></s:textfield>
<s:textfield name="user.userPassword" label="密码"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
</body>
</html>
loginSuccess.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>类型转换</title>
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body >
<jsp:include page="index.html"></jsp:include>
<s:property value="message"/>
</body>
</html>
- 注册自定义类型转换器
1.局部类型转换器
文件名的命名规则如XXXXXX-conversion.properties.其中XXXXX代表Action的Name。如:UserAction-conversion.properties
user=util.UserConverter
user表示Action类中的User对象,util.UserConver表示自定义转换器类所在的路劲
2.全局类型转换器
文件名的命名为xwork-conversion.properties
entity.User=util.UserConverter
将User类与UserConverter类直接对应起来
- 基于Struts2的类型转换
package util;
import java.util.Map;
import entity.User;
import ognl.DefaultTypeConverter;
public class StrutsTypeConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map context, Object value, Class toType) {
if(toType.equals(String.class)){
return convertToString(context,value);
}else if(value instanceof String[]){
return convertFromString(context,(String[])value,toType);
}else if(value instanceof String){
return convertFromString(context,new String[]{(String)value},toType);
}else{
return performFallbackConversion(context,value,toType);
}
}
protected Object performFallbackConversion(Map context,Object object,Class toClass){
return super.convertValue(context, object, toClass);
}
/**
* 把字符串类型转换为复合类型
* @param context
* @param values
* @param toClass
* @return
*/
public Object convertFromString(Map context,String[] values,Class toClass) {
String[] params = values;
User user = new User();
String[] userValues = params[0].split(",");
user.setUserName(userValues[0]);
user.setUserPassword(userValues[1]);
return user;
}
/**
* 把复合类型转换为字符串类型
* @param context
* @param object
* @return
*/
public String convertToString(Map context,Object object) {
User user = (User) object;
return "<" + user.getUserName() + "," + user.getUserPassword() + ">";
}
}
- 数组类型转换器
package util;
import java.util.Map;
import entity.User;
import ognl.DefaultTypeConverter;
public class UserConverterArray extends DefaultTypeConverter{
/**
* 字符串转复合类型
* @param arg0
* @param arg1
* @param arg2
* @return
*/
public Object convertFromString(Map arg0,String[] arg1,Class arg2){
if(arg1.length > 1){
User[] user = new User[arg1.length];
for(int i = 0;i<arg1.length;i ++){
User u = new User();
String[] temp = arg1[i].split(",");
u.setUserName(temp[0]);
u.setUserPassword(temp[1]);
user[i] = u;
}
return user;
}else{
User u = new User();
String[] str = arg1[0].split(",");
u.setUserName(str[0]);
u.setUserPassword(str[1]);
return u;
}
}
/**
*复合转字符串
* @param arg0
* @param arg1
* @return
*/
@SuppressWarnings("unchecked")
public String convertToString(Map arg0,Object arg1){
if(arg1 instanceof User){
User u = (User)arg1;
return "<"+u.getUserName()+","+u.getUserPassword()+">";
}else if(arg1 instanceof User[]){
User[] u = (User[])arg1;
String result = "[";
for(User us : u){
result += "<"+us.getUserName()+","+us.getUserPassword()+">";
}
return result+"]";
}else{
return null;
}
}
}