struts2 自定义类型转换器

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流程啦

    你可能感兴趣的:(java,apache,jsp,bean,struts)