Struts2 的转换器:
如果Action 是PO 类(PO :就是Action 没有继承或实现任何父类或接口),即使转换过程发生了错误,Struts 还会继续执行,跳转配置页面
只要实现了ValidationAware 接口,转换过程出错后才会返回配置的输入页面,需要实现哪些接口方法?这里只需要继承ActionSupport 这个类,如果必要只要实现Validate 这个方法即可,因为此类已经实现了ValidationAware 接口
实现TypeConvert 接口:接口参数较多,需要手动判断转换类型;
继承DefaultTypeConvert :需要手动判断转换类型;
继承StrutsTypeConvert :针对不同转换提供转换接口;
局部注册:
注册文件
1、名称: Action类名-conversion.properties
2、以key=value的方式指定属性的转换类,fullName=com.iflytek.convert. MyPointConverter,注意这里的fullName是需要转换的类的全名称,加包名,value是对转换类进行处理的Action
3、 将此文件放置在与Action同目录的包路径中
全局注册:
注册文件
1、名称: xwork-conversion.properties
2、以key-value的方式指定属性的转换类,例;
org.lxh.convert.Point = com.iflytek.convert.MyPointConverter
key 不能是属性 , 而是一个全限定名称的类 , 可以放置多个配置值对
3 、 将此文件放置 web-inf/classes 目录下
Ok ,直接上代码:
TestAction.java:
package com.iflytek.action; import java.awt.Point; import java.util.Date; import com.opensymphony.xwork2.ActionSupport; /** * @author xudongwang 2011-10-31 * */ public class TestAction extends ActionSupport { //http://localhost:8080/Struts2.2_TypeConversion/test?name=2&age=1&date=1988-09-09&p=3,2 private String name; private int age; private Date date; private Point p; @Override public String execute() throws Exception { return super.execute(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public Point getP() { return p; } public void setP(Point p) { this.p = p; } }
MyPointConverter.java( 继承StrutsTypeConverter)
package com.iflytek.conversion; import java.awt.Point; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; /** * @author xudongwang 2011-10-31 * */ public class MyPointConverter extends StrutsTypeConverter { @Override public Object convertFromString(Map context, String[] values, Class toClass) { Point p = new Point(); String[] strs = (String[]) values; String[] xy = strs[0].split(","); p.x = Integer.parseInt(xy[0]); p.y = Integer.parseInt(xy[1]); return p; } @Override public String convertToString(Map context, Object o) { return o.toString(); } }
or
MyPointConverter02.java( 继承DefaultTypeConverter)
package com.iflytek.conversion; import java.awt.Point; import java.util.Map; import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter; /** * @author xdwang 2012-6-25 * */ public class MyPointConverter02 extends DefaultTypeConverter { public Object convertValue(Map<String, Object> context, Object value, Class toType) { if (toType == Point.class) { Point point = new Point(); String[] temps = (String[]) value; String[] params = temps[0].split(","); int x = Integer.parseInt(params[0]); int y = Integer.parseInt(params[1]); point.x = x; point.y = y; return point; } else if (String.class == toType) { Point point = (Point) value; return point.getX() + "," + point.getY(); } return null; } }
struts.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> <constant name="struts.devMode" value="true" /> <constant name="struts.ui.theme" value="simple" /> <package name="tags" extends="struts-default"> <action name="test" class="com.iflytek.action.TestAction"> <result>/test.jsp</result> </action> </package> </struts>
web.xml :
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 过滤器 --> <filter> <filter-name>encoding</filter-name> <filter-class>com.iflytek.filter.EncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>struts2</filter-name> <!-- 新的 --> <!-- <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> --> <!-- 旧的 --> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
xwork-conversion.properties (放在src 下)
java.awt.Point=com.iflytek.conversion.MyPointConverter02
test.jsp :
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <%@taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'test.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> name: <s:property value="name" /> <br> age: <s:property value="age" /> <br> date: <s:property value="date" /> <br> <s:date name="date" format="yyyy/MM/dd HH:mm:ss"/><br/> <s:property value="p"/><br/> </body> </html>
启动服务后,直接在地址栏输入:
http://localhost:8080/Struts2.2_TypeConversion/test?name=2&age=1&date=1988-09-09&p=3,2
页面显示:
name: 2
age: 1
date: 88-9-9
1988/09/09 00:00:00
3.0,2.0