`
netxdiy
  • 浏览: 681666 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

struts2 自定义类型转换

阅读更多
struts2 已经为我们提供了几乎所有的primitive类型以及常用类型(如Date)的类型转换器,我们也可以为我们自己的类型添加转换器,struts2为我们提供了一个类型转换器的接口:org.apache.struts2.util.trutsTypeConverter,这是一个抽象类,继承自ongl.DefaultTypeConverter,你也可以直接继承DefaultTypeConverter定义自己的转换器,但是strutsTypeConverter提供了更简单以及更好理解的方式,下面我们写一个自己的转换器:这个转换器的用处是把姓名转换成一个姓和名的类型,前端的输入为"名_姓"如:chengbao_zhu
Name 类如下:
Java代码 
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类
Java代码 
/*** 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; 
    } 
 



接下来就是我们自定义的类型转换器啦
Java代码 
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:
Html代码 
<%@ 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代码 
<?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页面显示姓名信息 


Html代码 
/*** 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属性要使用自定义的类型转换器呢,这里有两个方式:

    全局:在classpath下新建文件xwork-conversion.properties,内容如下
    Java代码 
    example.bean.Name = example.converter.NameConverter 
    这样子的话,所有Name类型都会使用这个转换器进行类型转换 
    局部:在相应的Action目录下如NameAction的目录下,新建文件,文件名为:
    Java代码 
    Action名-conversion.properties 
    如NameAction的文件名为:NameAction-conversion.properties 
    文件内容为:name(NameAction的属性名)=example.converter.NameConverter 



打开name.jsp输入 "chengbao_zhu" 程序会跳转到displayName.jsp并显示出下面的字符串:
Java代码 
Your Name = **chengbao_zhu** 

呵呵,这也算一个基本完整的struts2流程啦
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics