Struts2类型转换器

Struts2 2017/04/29 00:04

局部类型转换器

只作用于一个action类

创建自定义类型转换器,继承DefaultTypeConverter类,重写其中的convertValue方法

TestAction.java

package com.cheng.action;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport {

	private Date times;

	public Date getTimes() {
		return times;
	}

	public void setTimes(Date times) {
		this.times = times;
	}

	@Override
	public String execute() throws Exception {
		System.out.println(times.toLocaleString());
		return "success";
	}
}

struts.xml

<struts>
	<package name="test" extends="struts-default">
		<action name="logins" class="com.cheng.action.TestAction">
			<result name="success">/index.jsp</result>
		</action>
	</package>
</struts>

DateConver.java

package com.cheng.conver;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import ognl.DefaultTypeConverter;
public class DateConver extends DefaultTypeConverter {
	//实现类型转换器有两种方式
	//1.继承ognl的DefaultType类或者实现TypeConverter接口
	//2.基于struts2库,实际上struts2库的也是基于ognl的再次封装,简化一定操作
	//区别: ognl只重写一个方法,实现双向的转换
	//		struts2要重写2个方法,一个从字符串转换成某种类型,convertFromString
	//		一个从某类型转换为字符串convertToString

	@Override
	/**
		* 参数(类型转换的上下文,前台传递过来的数据,转换后的目标类型)
		*/
	public Object convertValue(Map context, Object value, Class toType) {
		// struts2基于更安全的考虑,参数以数组的方式接受,方式用户提交的要转换的数据是多个
		Date date=null;
		String []params=(String[])value;
		SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd");
		try {
			date=sdf.parse(params[0]);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return date;
	}
}

action同包下TestAction-conversion.properties

times=com.cheng.conver.DateConver

index.jsp

<body>
<form action="test/logins" method="post">
	请填写日期(格式如20171206)<br>
	日期:<input type="text" name="times"/><br>
	<input type="submit" value="提交"/>
</form>
</body>

效果

全局类型转换器

作用于所有action类

创建自定义类型转换器,继承DefaultTypeConverter类,重写其中的convertValue方法

创建全局转换器配置文件

index.jsp

<body>
<form action="test/logins" method="post">
	请填写坐标(格式如x,y)<br>
	坐标:<input type="text" name="po"/><br>
	<input type="submit" value="提交"/>
</form>
<s:property value="po"/>
</body>

Position.java

package com.cheng.bean;
public class Position {
	private float x;
	private float y;
	public float getX() {
		return x;
	}
	public void setX(float x) {
		this.x = x;
	}
	public float getY() {
		return y;
	}
	public void setY(float y) {
		this.y = y;
	}

}

TestAction.java

package com.cheng.action;
import org.apache.struts2.ServletActionContext;
import com.cheng.bean.Position;
import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport{

	Position po;

	public Position getPo() {
		return po;
	}

	public void setPo(Position po) {
		this.po = po;
	}

	@Override
	public String execute() throws Exception {
		System.out.println("x坐标:"+po.getX()+" y坐标:"+po.getY());
		ServletActionContext.getRequest().setAttribute("po", po);
		return SUCCESS;
	}
}

struts.xml

<struts>
		<package name="test" extends="struts-default">
			<action name="logins" class="com.cheng.action.TestAction">
				<result name="success">/index.jsp</result>
			</action>
		</package>
</struts>

PositionConver.java

package com.cheng.conver;
import java.util.Map;
import com.cheng.bean.Position;
import ognl.DefaultTypeConverter;
public class PositionConver extends DefaultTypeConverter {

	@Override
	public Object convertValue(Map context, Object value, Class toType) {
		//前台传递数据到后台
		if(toType==Position.class){
			Position po=new Position();
			String[] str=(String [])value;
			String zuobiao=str[0];
			String xy[]=zuobiao.split(",");
			po.setX(Float.valueOf(xy[0]));
			po.setY(Float.valueOf(xy[1]));
			return po;
		}
		//后台传递到前台
		if(toType==String.class){
			Position po=(Position)value;
			String poo=po.getX()+","+po.getY();
			return poo;
		}

		return null;
	}

}

根目录下创建xwork-conversion.properties

com.cheng.bean.Position=com.cheng.conver.PositionConver

效果

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

Powered by codetiler.com