`

2_Struts2的类型转换

阅读更多
struts2对于java内置的类型有非常好的处理,比如int,date可以自动转换。
对于用户自定义的类型需要自定义转换
1 采用ognl的转换类进行局部的转换
input.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>struts2类型转换</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">

  </head>
  
  <body>
  
  <h3>使用逗号将点的两个坐标分隔开</h3>
  <!-- 实际的流程是先转化,然后再验证,如果转化不成功则无需验证 -->
   <s:form action="pointConverter">
   <!-- 对应一个类 -->
   	<s:textfield name="point" label="point"></s:textfield>
   <!-- 对应一个整数 -->	
   	<s:textfield name="age" label="age"></s:textfield>
   <!-- 对应一个字符串 -->	
   	<s:textfield name="username" label="username"></s:textfield>
   <!-- 对应一个日期 -->	
   	<s:textfield name="date" label="birthday"></s:textfield>
   	
   	<s:submit label="submit"></s:submit>
   	
   </s:form> 
  </body>
</html>



//自定义的bean
package com.test.bean;

public class Point {
	private int x;
	private int y;
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
	
}
//用户自定义的转换类
package com.test.converter;

import java.util.Map;

import ognl.DefaultTypeConverter;

import com.test.bean.Point;

public class PointConverter extends DefaultTypeConverter
{

	@Override
	//context表示应用的上下文,value入参,toType表示转换成的类型
	public Object convertValue(Map context, Object value, Class toType)
	{
		//String到自定义类型的转换
		if(Point.class == toType)
		{
			Point point = new Point();
			
			String[] str = (String[])value;
			
			String[] paramValues = str[0].split(",");
			
			int x = Integer.parseInt(paramValues[0]);
			int y = Integer.parseInt(paramValues[1]);
			
			point.setX(x);
			point.setY(y);
			
			return point;
		}
		//自定义类型到String的转换
		if(String.class == toType)
		{
			Point point = (Point)value;
			
			int x = point.getX();
			int y = point.getY();
			
			String result = "[x=" + x + " , y=" + y + "]";
			
			return result;
		}
		
		return null;
	}
	
}


//业务处理的Action
package com.test.action;

import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;
import com.test.bean.Point;

public class PointAction extends ActionSupport{
	private Point point;
	private int age;
	private String username;
	private Date date;
	public Point getPoint() {
		return point;
	}
	public void setPoint(Point point) {
		this.point = point;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	@Override
	public String execute() throws Exception {
		return this.SUCCESS;
	}
	
}



output.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>My JSP 'output.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>
  <!-- 该标签表示再action中定义的属性,将自动调用属性的get方法显示,实际对应的是方法 -->
    point:<s:property value="point"/><br/>
    age:<s:property value="age"/><br/>
    username:<s:property value="username"/><br/>
    date:<s:property value="date"/>
    
  </body>
</html>


struts.xml
<action name="pointConverter" class="com.test.action.PointAction">
			<result name="input">/input.jsp</result>
			<result name="success">/output.jsp</result>
		</action>

一切都完成了,需要转换了
要在Action下建立PointAction-conversion.properties文件,文件名称是[ActionName]-conversion.properties
内容是point=com.test.converter.PointConverter
表示action中的需要转换的属性及对应的转换类,如果多个属性需要转换可以一并加入
如果我们需要转换多点坐标,可以在action中添加多个属性以及对应的-conversion.properties中分别对这三个属性进行转换的配置
当然 这样做可以实现我们的需求,可是看起来好像有没有什么必要,尤其是一旦有所变化维护起来就会增加业务量,所以我们在下面引入了全局类型转化。

2 采用全局类型转换
全局类型转换也需要一个配置文件xwork-conversion.properties名称固定,与struts.xml在同一目录下,既class目录下。
全局类型转换的配置文件内容与局部类型转换类似,但略有不同
局部类型转换
point=com.test.converter.PointConverter
point2=com.test.converter.PointConverter

等号左边表示的是需要转换的action中的属性名,等号右边表示的是要用的转换类

全局类型转换
com.test.bean.Point=com.test.converter.PointConverter

等号左边表示的是需要转换的具体类全称,以后碰到此类都自动转换,等号右边表示要用到的转换类
这样就大大的减轻了我们的工作量和维护成本。
input.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>struts2类型转换</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">

  </head>
  
  <body>
  
  <h3>使用逗号将点的两个坐标分隔开</h3>
  <!-- 实际的流程是先转化,然后再验证,如果转化不成功则无需验证 -->
   <s:form action="pointConverter">
   <!-- 对应一个类 -->
   	<s:textfield name="point" label="point"></s:textfield>
   	<s:textfield name="point2" label="point"></s:textfield>
   	<s:textfield name="point3" label="point"></s:textfield>
   <!-- 对应一个整数 -->	
   	<s:textfield name="age" label="age"></s:textfield>
   <!-- 对应一个字符串 -->	
   	<s:textfield name="username" label="username"></s:textfield>
   <!-- 对应一个日期 -->	
   	<s:textfield name="date" label="birthday"></s:textfield>
   	
   	<s:submit label="submit"></s:submit>
   	
   </s:form> 
  </body>
</html>


output.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>My JSP 'output.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>
  <!-- 该标签表示再action中定义的属性,将自动调用属性的get方法显示,实际对应的是方法 -->
    point:<s:property value="point"/><br/>
    point2:<s:property value="point2"/><br/>
    point3:<s:property value="point3"/><br/>
    age:<s:property value="age"/><br/>
    username:<s:property value="username"/><br/>
    date:<s:property value="date"/>
    
  </body>
</html>


PointAction.java
package com.test.action;

import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;
import com.test.bean.Point;

public class PointAction extends ActionSupport{
	private Point point;
	private Point point2;
	private Point point3;
	private int age;
	private String username;
	private Date date;
	public Point getPoint() {
		return point;
	}
	public void setPoint(Point point) {
		this.point = point;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	@Override
	public String execute() throws Exception {
		return this.SUCCESS;
	}
	public Point getPoint2() {
		return point2;
	}
	public void setPoint2(Point point2) {
		this.point2 = point2;
	}
	public Point getPoint3() {
		return point3;
	}
	public void setPoint3(Point point3) {
		this.point3 = point3;
	}
	
}



3 使用struts提供的转换类StrutsTypeConverter来实现转换
struts2为了简化我们的转换类,他给我们提供了一个封装好的转换类,
当然底层的转化类还是ognl。下面我们将上面PointConverter的转换类重写一下,并实现同样的功能
package com.test.converter;

import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

import com.test.bean.Point;

public class PointConverter2 extends StrutsTypeConverter {

	@Override
	//从字符串转换到对象
	public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
		Point point = new Point();
		String[] paramValues = arg1[0].split(",");
		
		int x = Integer.parseInt(paramValues[0]);
		int y = Integer.parseInt(paramValues[1]);
		
		point.setX(x);
		point.setY(y);
		return point;
	}

	@Override
	//从对象转换到字符串
	public String convertToString(Map arg0, Object arg1) {
		Point point = (Point)arg1;
		
		int x = point.getX();
		int y = point.getY();
		String result = "[ x = "+ x +" , y = "+ y +" ]";
		return result;
	}

}


我们可以将xwork-conversion.properties中的com.test.bean.Point=com.test.converter.PointConverter换成com.test.bean.Point=com.test.converter.PointConverter2 进行测试

4 对集合类型进行转换
PointConverter3
	public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
		List<Point> list = new ArrayList<Point>();
		for(String value:arg1)
		{
			Point point = new Point();
			
			String [] paramValues = value.split(",");
			
			int x = Integer.parseInt(paramValues[0]);
			int y = Integer.parseInt(paramValues[1]);
			
			point.setX(x);
			point.setY(y);
			
			list.add(point);
		}
		return list;
	}

	@Override
	public String convertToString(Map arg0, Object arg1) {
		List<Point> list = (List<Point>)arg1;
		
		StringBuilder sb = new StringBuilder();
		
		int number = 0;
		
		sb.append("[");
		for(Point point : list){
			++number;
			int x = point.getX();
			int y = point.getY();
			
			sb.append(number).append(" x = ").append(x).append(", y = ").append(y).append("    ");
		}
		
		sb.append(" ]");
		return sb.toString();
	}

input.jsp
<s:textfield name="point" label="point"></s:textfield>
   	<s:textfield name="point" label="point2"></s:textfield>
   	<s:textfield name="point" label="point3"></s:textfield>

PointAction
private List<Point> point;

建议属性文件使用局部的
point=com.test.converter.PointConverter3
5 采用对象属性方式的类型转换
该方式无需属性文件,无需转化类
struts2会直接赋值到对象的属性上
input.jsp
<s:textfield name="point.x" label="x"></s:textfield>
<s:textfield name="point.y" label="y"></s:textfield>

output.jsp
x:<s:property value="point.x"/><br/>
y:<s:property value="point.y"/><br/>

PointAction.java
       private Point point;
	public Point getPoint() {
		return point;
	}
	public void setPoint(Point point) {
		this.point = point;
	}

注意:Point必须包含一个无参数的构造方法

6 类型转换的校验错误处理
当服务器不能对用户输入的类型进行成功转换的时候(遇到类型转换错误的时候,比如我们将age输入abc),struts2框架自动生成一条错误信息,并且将该错误信息放到addFieldError里面,返回到出错页面并提示用户Invalid 。。。。但是对于用户来说并不友好。
我们需要将他改成我们希望的错误信息。
我们需要在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.custom.i18n.resources" value="message"></constant>
	<package name="struts2" extends="struts-default">
		<!-- name对应表单的action,class对应于处理类 -->
		<action name="login" class="com.test.action.LoginAction">
			<!-- result标签默认匹配success,这里可以省略name="success" -->
			<result name="success">/result.jsp</result>
			<!-- 未通过validate方法的时候跳转到此 -->
			<result name="input">/login2.jsp</result>
			<result name="failer">/login2.jsp</result>
		</action>
		<action name="pointConverter" class="com.test.action.PointAction">
			<result name="input">/input.jsp</result>
			<result name="success">/output.jsp</result>
		</action>
	</package>

</struts>

建立名为message.properties的资源文件
xwork.default.invalid.fieldvalue={0} error

这样 以后的类型转换的错误信息就变成 .. error
比如 age error
分享到:
评论
2 楼 yinxiaoyong 2009-02-06  
我写的居然和你这里是一样的,呵呵
1 楼 yinxiaoyong 2009-02-06  
老兄,这些代码怎么排版的啊

相关推荐

    Struts2_jquery_json1.0.zip_Struts2 heloword_struts2_struts2 jque

    `struts2_helloworld`标签可能指的是一个简单的入门示例,它通常包括创建一个Action类、一个JSP页面和相关的Struts配置,以展示Struts2的基本工作流程。 总结来说,"Struts2_jquery_json1.0.zip"是一个综合实例,...

    轻量级Java EE企业应用实战_Struts 2_Spring3_Hibernate(第三版)

    《轻量级Java EE企业应用实战_Struts 2_Spring3_Hibernate(第三版)》是一本深入浅出地介绍如何构建高效、可扩展的企业级应用程序的书籍,它结合了Struts 2、Spring 3和Hibernate这三大流行框架,为Java EE开发者...

    STRUTS2类型转换

    Struts2是一个流行的Java web开发框架,其核心是Action,而类型转换是Struts2处理用户输入数据的一个重要环节。Struts2内置了多种类型转换,可以将HTTP请求中的字符串数据转换为各种基本类型和复杂类型,如日期、...

    jar_struts2

    8. **异常处理**:Struts2提供了全局异常处理机制,可以统一处理应用程序中抛出的异常,并将其转换为特定的结果页面。 9. **国际化与本地化**:Struts2支持多语言环境,开发者可以配置资源文件来实现内容的国际化。...

    struts2数据类型转换器

    这篇博客“Struts2数据类型转换器”可能深入探讨了这个主题,虽然具体的细节无法在此给出,但我们可以根据Struts2中数据类型转换的工作原理来展开讨论。 在Java Web开发中,用户通过表单提交的数据通常是字符串形式...

    struts2 类型转换器

    在`Struts2_3500_type_conversion`这个压缩包文件中,可能包含了相关的示例代码、配置文件或测试用例,用于演示如何创建和应用自定义类型转换器。用户可以通过查看这些资源,了解并实践Struts2类型转换器的使用。 ...

    json_struts2.rar_JSON java_SSH json Struts2_java json_json_strut

    Struts2支持多种数据绑定,包括从JSON到Java对象的转换,这大大简化了Web应用中的数据处理。 SSH2是Struts2的一个版本,它集成了Spring和Hibernate框架,提供了全面的企业级应用程序解决方案。Spring负责依赖注入和...

    struts2学习笔记3数据类型转换

    struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换

    struts2简单实例(类型转换)

    在这个"struts2简单实例(类型转换)"中,我们将探讨Struts2如何处理不同类型的数据转换,以及如何创建一个简单的演示应用。 首先,让我们理解什么是类型转换。在Web应用程序中,用户通过表单提交的数据通常是字符...

    struts2学习笔记三(第3讲.Struts2的类型转换)

    Struts2是一个强大的Java web框架,它为开发者提供了丰富的功能,包括MVC设计模式的实现、类型转换、国际化、拦截器等。在本篇“Struts2学习笔记三”中,我们将聚焦于Struts2的类型转换这一核心特性。类型转换在处理...

    struts2自定义类型转换器

    这就是"struts2自定义类型转换器"的主题。 首先,理解Struts2的类型转换机制。当Struts2接收到HTTP请求时,它会尝试将请求参数与Action类的属性进行绑定。这个过程涉及到了类型转换,Struts2内置了一套转换器机制,...

    浪曦\浪曦_Struts2应用开发系列_第1讲

    - 定制类型转换器:通过实现`org.apache.struts2.conversion.Converter`接口,可以自定义特定类型的转换规则。 4. **Struts2输入校验**: - **Validation框架**:使用注解或XML配置文件进行字段验证,如`@...

    Struts2 ConverterType类型转换 案例源码

    Struts2是一个强大的MVC框架,它在处理用户请求时提供了丰富的功能,其中包括类型转换(Converter)。类型转换是Struts2框架中一个重要的特性,它允许我们把前端表单提交的数据自动转换为后端Java对象的属性。在这个...

    ofc-struts2.rar_JAVA蜡烛图_OFC struts2_Struts 图表_java openflashcha

    2. **配置文件**:如struts.xml,定义了Struts2框架的行为,包括动作映射和结果类型。 3. **JSP/HTML页面**:显示图表的Web页面,可能包含JavaScript代码来加载和展示OpenFlashChart生成的图表。 4. **JSON数据文件*...

    struts2自定义数据类型转换练习

    本练习主要关注如何在Struts2中实现自定义的数据类型转换,以满足特定业务需求。 首先,我们需要了解Struts2的数据转换机制。当用户提交表单数据时,Struts2会通过ActionContext获取到这些数据,并尝试将其转换为...

    传智播客_Struts2_PPT.ppt

    总的来说,Struts2在Struts1的基础上进行了很多改进,如无侵入式设计、强大的拦截器机制、类型转换器、多种视图支持、精细化的输入验证以及便捷的国际化管理。这些特性使得Struts2成为Java Web开发中一个受欢迎的...

    Struts2实例 国际化 类型转换 struts标签

    这个实例项目展示了如何在实际应用中结合Struts2、国际化、类型转换以及Struts2自定义标签来实现用户管理功能,包括用户数据的增删改查。 首先,我们来看Struts2的核心概念。Struts2作为MVC框架,它负责处理HTTP...

Global site tag (gtag.js) - Google Analytics