struts2 已经为我们提供了几乎所有的primitive类型以及常用类型(如Date)的类型转换器,我们也可以为我们自己的类型添加转换器,struts2为我们提供了一个类型转换器的接口:org.apache.struts2.util.trutsTypeConverter,这是一个抽象类,继承自ongl.DefaultTypeConverter,你也可以直接继承DefaultTypeConverter定义自己的转换器,但是strutsTypeConverter提供了更简单以及更好理解的方式,下面我们写一个自己的转换器:这个转换器的用处是把姓名转换成一个姓和名的类型,前端的输入为"名_姓"如:chengbao_zhu
Name 类如下:
package example.bean;
public class Name {
private String firstName;
private String familyName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getFamilyName() {
return familyName;
}
public void setFamilyName(String familyName) {
this.familyName = familyName;
}
}
Action类
/*** NameAction.java ***/
package example.action;
import com.opensymphony.xwork2.ActionSupport;
import example.bean.Name;
public class NameAction extends ActionSupport{
private Name name;
@Override
public String execute() throws Exception {
return SUCCESS;//SUCCESS 是Action接口的一个常量"success"
}
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
}
接下来就是我们自定义的类型转换器啦
package example.converter;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
import example.bean.Name;
public class NameConverter extends StrutsTypeConverter {
/**
* 从String转换为自己的类型
*/
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
Name name = new Name();
//这里我们用的分隔符为"_"
String[] nameParams = values[0].split("_");
String firstName = nameParams[0];
String familyName = nameParams[1];
name.setFirstName(firstName);
name.setFamilyName(familyName);
return name;
}
/**
* 从自定义的类型转换为String以供显示
*/
@Override
public String convertToString(Map context, Object o) {
Name name = (Name) o;
String nameStr = "**" + name.getFirstName() + "_"
+ name.getFamilyName() + "**";
return nameStr;
}
}
下面是输入页面name.jsp:
<%@ page language="java" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Input your name</title>
</head>
<body>
<s:form action="nameConverter">
<s:textfield name="name"></s:textfield>
<s:submit value="提交改名"></s:submit>
</s:form>
</body>
</html>
配置struts.xml,struts.xml必需放在classpath下面
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="example" extends="struts-default">
<action name="nameConverter" class="example.action.NameAction">
<result name="success">/displayName.jsp</result>
</action>
</package>
</struts>
如果成功的话则会跳转到displayName.jsp页面显示姓名信息
/*** displayName.jsp 页面代码 **/
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Display</title>
</head>
<body>
Your Name = <s:property value="name"/>
</body>
</html>
至此,全部的基本配置已经完毕,接下来的问题是:如何让NameAction知道name属性要使用自定义的类型转换器呢,这里有两个方式:
[list=1]
全局:在classpath下新建文件xwork-conversion.properties,内容如下
example.bean.Name = example.converter.NameConverter
这样子的话,所有Name类型都会使用这个转换器进行类型转换
局部:在相应的Action目录下如NameAction的目录下,新建文件,文件名为:
Action名-conversion.properties
如NameAction的文件名为:NameAction-conversion.properties
文件内容为:name(NameAction的属性名)=example.converter.NameConverter
[/list]
打开name.jsp输入 "chengbao_zhu" 程序会跳转到displayName.jsp并显示出下面的字符串:
Your Name = **chengbao_zhu**
呵呵,这也算一个基本完整的struts2流程啦