- 浏览: 1229480 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (718)
- HTML (13)
- JS基础 (23)
- JS应用 (40)
- AJAX (6)
- JSP相关 (12)
- JAVA基础 (52)
- JAVA应用 (74)
- APPLET (11)
- SWING\RCP (2)
- JAVA反射 (6)
- 设计模式 (26)
- 数据库设计 (20)
- Struts (35)
- Struts2 (12)
- Spring (22)
- Hibernate (45)
- Ibatis (18)
- mybatis (3)
- SSH (8)
- UML (5)
- WebService (3)
- XML (16)
- Log4j (7)
- WEB容器 (26)
- 数据结构 (36)
- Linux (34)
- Ruby on Rails (1)
- 其它技术 (27)
- IDE配置 (15)
- 项目实战 (2)
- Oracle (69)
- JAVA报表 (7)
- Android学习 (2)
- 博客链接 (1)
- 网络基础 (1)
- WEB集群 (1)
- .Net开发 (11)
- PB (4)
- 系统构建 (15)
最新评论
-
jnjeC:
牛逼啊哥们,讲得太好了
Maven仓库理解、如何引入本地包、Maven多种方式打可执行jar包 -
九尾狐的yi巴:
很好 感谢!
Itext中文处理(更新版) -
luweifeng1983:
有用的,重启一下嘛。
设置eclipse外部修改文件后自动刷新 -
Master-Gao:
设置了也不管用,怎么破呢?
设置eclipse外部修改文件后自动刷新 -
aigo_h:
锋子还有时间写博客,还是很闲哈!
Add directory entries问题
转自:http://blog.csdn.net/lilp_ndsc/article/details/4050469
Struts2 类型转化
一、概述
在B/S应用中,将字符串请求参数转换为相应的数据类型,是MVC框架提供的功能,而Struts2是很好的MVC框架实现者,理所当然,提供了类型转换机制。
Struts2的类型转换是基于OGNL表达式的,只要我们把HTML输入项(表单元素和其他GET/POET的参数)命名为合法的OGNL表达式,就可以充分利用Struts2的转换机制。
除此之外,Struts2提供了很好的扩展性,开发者可以非常简单的开发自己的类型转换器,完成字符串和自定义复合类型之间的转换。总之,Struts2的类型转换器提供了非常强大的表现层数据处理机制,开发者可以利用Struts2的类型转换机制来完成任意的类型转换。
二、实现自定义类型转换器
实现TypeCoverter接口,或者继承DefaultTypeConverter实现类(该类实现了TypeCoverter接口),通过继承该实现类来实现自己的类型转换器。重写convertValue方法即可。
为了简化类型转换器的实现,Struts2提供了一个StrutsTypeConverter抽象类,这个抽象类是DefaultConverter的子类。实现了方法,并提供了2个不同转换方向的方法:Object
convertToString(Map context,String[] values,Class toClass)和String convertFromString(Map context,Object o)。
三、注册应用
实现了自定义类型转换器之后,将该类型转换器注册在Web应用中,Struts2框架才可以正常使用该类型转换器。
关于类型转换器的注册方式,主要有3中:
A、注册局部类型转换器:仅仅对某个Action的属性起作用。
B、注册全局类型转换器:对所有Action的特定类型的属性都会生效。
C、使用JDK1.5的注释来注册类型转换器:通过注释方式来生成类型转换器。
1、局部类型转换器
提供如下格式的文件
文件名: ActionName-conversion.properties
内容:多个propertyName(属性名)=类型转换器类(含包名),如 date=com.aumy.DateConverter
存放位置:和ActionName类相同路径。
2、全局类型转换器
提供如下格式的文件
文件名: xwork-conversion.properties
内容: 多个“复合类型=对应类型转换器”项组成,如 java.Util.Date=com.aumy.DateConverter
存放位置:WEB-INF/classes/目录下。
下面是类型转化例子:
需求1:我们需要将页面上的用户输入坐标(x,y)转化为服务器端Point对象进行数据
创建一个struts2 的Web工程,导入struts2 所需要的包,五个常用字的包
在src 目录创建Struts2的配置文件struts.xml
配置web.xml 如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>struts2</filter-name>
<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>
工程目录结构如下:
创建一个input.jsp 文件,内容如下:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>input 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>
类型转化
<hr>
<s:form action="point">
<s:textfield name="point" label="point"/>
<s:textfield name="point" label="point2"/>
<s:textfield name="point" label="point3"/>
<s:textfield name="age" label="age"/>
<s:textfield name="username" label="usernam" />
<s:textfield name="date" label="birthday" />
<s:submit />
</s:form>
</body>
</html>
显示页面如下:
用户可以在point文本框中输入 23,45 两个数字用,隔开,服务器端使用类型转化器进行转化,其它数据使用Struts2内置的类型转化机制进行转化。
创建一个用户数据模型类,在com.snt.struts2.domain包中创建一个Point类,内容如下:
package com.snt.struts2.domain;
/**
* 描述一个点类
* @author LEPING LI
*
*/
public class Point {
private int x;
private int y;
/**
* default constructor
*/
public Point() {
super();
}
/**
* full parameters constructor
* @param x
* @param y
*/
public Point(int x, int y) {
super();
this.x = x;
this.y = 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;
}
}
然后创建一个Action, PointAction 继承ActionSupport 来处理用户数据,代码如下:
里面只有一个execute() 方法.类中的属性对input.jsp 页面表单中的数据名称。各个属性一定提供getter 和setter 方法。默认的构造方法必须提供。
package com.snt.struts2.action;
import java.util.Date;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import com.snt.struts2.domain.Point;
/**
* 处理类型转化的Action
* @author LEPING LI
*
*/
public class PointAction2 extends ActionSupport {
private static final long serialVersionUID = 1L;
private Point point;
private int age;
private String username;
private Date date;
public PointAction2() {
super();
// TODO Auto-generated constructor stub
}
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 getPoint() {
System.out.println("getPoint()方法执行中.....");
return point;
}
public void setPoint(Point point) {
System.out.println("setPoint() 方法执行中....");
this.point = point;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
/**
* 业务方法
*/
public String execute()throws Exception{
System.out.println("execute()方法执行中.....");
return SUCCESS;
}
}
在src 目录下的struts.xml 文件中配置你创建的Action 如下:
PointAction执行成功的话转到output.jsp 页面,显示转化后的数据。如果不成功回到原页面。
<?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="struts2" extends="struts-default">
<!-- 演示类型转化的Action -->
<action name="point"
class="com.snt.struts2.action.PointAction">
<result name="success">output.jsp</result>
<result name="input">input.jsp</result>
</action>
</struts>
用户将input.jsp 页面的数据提交到PointAction ,Point 接收数据调用业务逻辑后,将结果返回到output.jsp 页面进行显示。 这个过程中需要将页面中用户输入到point 文本框 23,34 模式的数据转化为一个Point对象,Struts2 本身提供了一定的类型转化机制,比如:把字符类型转化为数值类型,日期类型按照默认的格式将字符串转化为日期类型。但对于我们把坐标点转化成一个对象的需要,需要程序自己手动来转化,struts2没有提供对应的转化功能,但是struts2给程序员提供更简易的转化方式,我们只需创建一个实现TypeConver 接口的类,做为类型转化器,即可实现我们指定规则的类型转化,继承DefaultTypeConverter类可以TypeCoverter接口,下面创建一个 PointConverter 继承 DefaultTypeConverter,实现其中的convertValue ()方法,代码如下:
package com.snt.struts2.converter;
import java.lang.reflect.Member;
import java.util.Map;
import com.snt.struts2.domain.Point;
import ognl.DefaultTypeConverter;
/**
* 坐标转化器
* @author LEPING LI
*/
public class PointConverter extends DefaultTypeConverter{
public Object convertValue(Map map, Object value, Class toType) {
//如果要转化的类型是Point,则是由字符串转化成Point
if(toType==Point.class){
System.out.println("converValue()方法中...将字符串转化成Point");
Point p=new Point();
//可以能多个点 (x,y) (x,y) 其值是以字符数组的形式传过来的
String[] str=(String[])value;
//取每一个
String[] tmp=str[0].split(",");
int x=Integer.parseInt(tmp[0]);
int y=Integer.parseInt(tmp[1]);
p.setX(x);
p.setY(y);
return p;
}
if(toType==String.class){
System.out.println("converValue()方法中...将Point转化成字符串");
Point p=(Point)value;
int x=p.getX();
int y=p.getY();
String result="(x="+x+",y="+y+")";
return result;
}
return null;
}
}
convertVlaue() 方法负责字符串到对象类型的双向转化。根据每三个参数来判断如何进行类型转化。
第二个参数代表需要转化的值,转化有两个方向:1将字符串转化成对象 2 将对象转化为字符串
OK,到些我们已经将转化器已经创建完毕。但是如何让这个转化器生效呢?我们还需要建立一个配置文件
需要在需要类型转化的Action 同级别目录下创建一个,名称格式如:Action类名-conversion.properties ,
我们在这里就创建一个PointAction-conversion.properties 属性文件,放在PointAction 类同一个目录下。
属性文件中内容如下:
point=com.snt.struts2.converter.PointConverter
左边是PointAction 中需要类型转化的类,右边是使用那个类型转化器的类全限定名
运行测试,应用程序,查看运行结果是否正确。
页面上会显示转化后的数据如 (x=23,y=45) 字样
类型转化的流程:
Input.jsp 将数据---- 服务器FilterDiaptcher--------对应的Action进行处理------将页面数据填充到Action对应属性-- 判断类型转化配置文件是否存在---类型转化----- setPoint()设置数据----execute()
-----Result--------JSP----显示---------类型转化---------getpoint()获取数据--------显示数据
使用Pointaction-convertion.properties ,是局部的类型转化,但是如果多处使用同一类型的转化的话,多次配置将会很麻烦,幸好 Strust2提供了全局的类型转化配置,
全局类型转化需要配置: xwork-conversion.properties 属性文件,该文件需要放在classes 目录下,即在创建工程时可以在src目录创建这个属性文件,部署时会自动编译到工程的classes 目录下,内容如下:
com.snt.struts2.domain=com.snt.struts2.converter.PointConverter
左边:需要进行类型转化的类,右边是要使用的类型转化器
我们现在在src目录下创建一个
xwork-conversion.properties 文件,输入 com.snt.struts2.domain=com.snt.struts2.converter.PointConverter
将局部的类型转化文件中内容注掉,运行测试,同样可以达到类型转化的目的。
注意:局部的类型转化配置为覆盖全局的类型转化配置
这样我们对struts2的类型转化就有了一定的认识。
但是回过头来看看我们的编写的转化器,实现了convertValue() 方法,所有的转化逻辑都积在这个方法里面,编写和阅读都不是很清晰。为些,Struts2给我们提供了一个StrutsTypeConverter 类,我们可以让自书报类型转化器继承这个类,实现其中的convertFromString() converToString() 两个方法来实现两种不同的转化,显得更为清晰。
比如:我们把上面的类型转化器可以重写一下:
package com.snt.struts2.converter;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
import com.snt.struts2.domain.Point;
public class PointConverter2 extends StrutsTypeConverter{
@Override
/**
* 将字符串转化成对象
*/
public Object convertFromString(Map context, String[] values, Class toClass) {
Point p=new Point();
String[] paramValues=values[0].split(",");
int x=Integer.parseInt(paramValues[0].toString());
int y=Integer.parseInt(paramValues[1].toString());
p.setX(x);
p.setY(y);
return p;
}
/**
* 将对象转化成字符串
*/
public String convertToString(Map context, Object o) {
Point p=(Point)o;
int x=p.getX();
int y=p.getY();
String result="(x="+x+",y="+y+")";
return result;
}
}
修改配置文件,使该转化器生效,运行测试应用,效果同样。
发表评论
-
Struts2漏洞问题及解决
2013-08-21 22:46 774Struts2漏洞问题: http://www.itey ... -
Struts2中iterator标签遍历map总结
2011-11-18 11:18 836package com.zx.demo.action; ... -
struts2的s:iterator 标签 详解
2011-11-18 10:39 744struts2的s:iterator 可以遍历 数据栈里面 ... -
Struts2 ognl中的#、%和$符号用法说明
2011-11-18 10:32 787#、%和$符号在OGNL表达式中经常出现,而这三种符号也是开 ... -
Struts2页面取值问题
2011-11-18 00:32 2206Struts2页面取值: 后总结出了4种取值得办法: ... -
Struts2数据传输的背后机制:ValueStack(值栈)
2011-11-13 16:41 8221. 数据传输背后机制 ... -
java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource的解决方法
2011-11-03 16:17 2748用Myeclipse开发struts时,配置struts-co ... -
如何自定义Struts2表单验证后的错误信息显示格式/样式
2011-11-02 23:48 7031、http://www.blogjava.net/lishu ... -
Strut2+Spring整合框架搭建
2011-11-02 22:19 1078参考:http://lukuijun.iteye.com/bl ... -
Struts2 校验框架学习笔记
2011-11-01 01:00 1003转自:http://blog.csdn.net/lilp_nd ... -
Struts2入门级HelloWord
2011-10-27 01:11 749下载附件里的看吧。。。
相关推荐
Struts2是一个流行的Java web开发框架,其核心是Action,而类型转换是Struts2处理用户输入数据的一个重要环节。Struts2内置了多种类型转换,可以将HTTP请求中的字符串数据转换为各种基本类型和复杂类型,如日期、...
本篇文章将深入探讨Struts2中的类型转换机制。 1. **类型转换的概念** 类型转换是指将一个数据类型的值转换为另一个数据类型的过程。在网络请求中,用户输入的数据通常是字符串类型,而服务器端的Action类属性可能...
在Struts2中,类型转换器(Type Converter)是框架的一个关键特性,用于处理Action类中属性的自动类型转换。这个特性使得开发者无需手动进行数据类型之间的转换,从而提高了开发效率和代码的可读性。 标题中的...
Struts2是一个强大的MVC框架,它在处理Web应用程序时提供了许多便利,其中包括类型转换功能。类型转换是将用户输入的数据自动转化为服务器端处理所需的类型,这样可以避免手动转换带来的繁琐工作。本篇文章将深入...
其中,类型转换(Type Conversion)是Struts2框架中的一个重要功能,它负责将HTTP请求参数转化为Action类中相应属性的类型。这篇博客文章“Struts2类型转换深入总结”将深入探讨这一主题。 在Struts2中,类型转换...
### Struts2类型转换与验证流程详解 #### Struts2框架概述 Struts2是一个用于构建企业级Java Web应用的强大框架。它集成了MVC设计模式,并提供了丰富的插件支持和灵活的配置选项。在Struts2中,类型转换和验证机制...
Struts2框架提供了一种机制,即类型转换器(Type Converter),用于自动将请求参数转化为预期的数据类型。 在Struts2中,实现类型转换主要有两种方式: 1. 使用内置的类型转换器:Struts2已经内置了一些常见的类型...
在Struts2中,类型转换和国际化是两个重要的特性,用于处理数据类型之间的转换以及多语言环境下的内容显示。 **类型转换**是Struts2处理请求参数与Action类属性之间数据类型不匹配的过程。当用户通过表单提交请求时...
本实例主要探讨了在Struts2中进行类型转换的三种方法:局部类型转换、全局类型转换以及大量数据类型的转换。对于初学者来说,理解并掌握这些转换方式至关重要,因为它们能够帮助我们处理用户输入的数据,并将其转化...
Struts2内置了一套类型转换机制,能够自动将字符串数据转化为预设的类型。如果默认的转换器无法满足需求,开发者可以自定义转换器,通过实现`Converter`接口并注册到配置中,来实现特定类型的转换。 接下来,我们...
struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换
struts2类型转换机制
Struts2是一个强大的MVC框架,它在处理用户请求时提供了丰富的功能,其中包括类型转换(Converter)。类型转换是Struts2框架中一个重要的特性,它允许我们把前端表单提交的数据自动转换为后端Java对象的属性。在这个...
熟悉和掌握Struts2自定义类型转换。 熟悉和掌握Struts2内建校验的操作方法 实验环境与设备: 已经接入局域网的网络实验室,机器上装有IE浏览器等; strtus2.5.8 实验内容: (1) 编写一个...
2. **自定义转换器**:如果需要处理特殊类型或有特定转换规则,可以通过实现`org.apache.struts2.util.TypeConverter`接口创建自定义转换器,并通过`@Result`注解或者`struts.xml`配置文件进行注册。 3. **转换异常*...
《STRUTS2类型转换错误导致OGNL表达式注入漏洞分析》 STRUTS2框架在处理用户输入时出现的类型转换错误,可能导致OGNL(Object-Graph Navigation Language)表达式注入漏洞。此漏洞允许攻击者通过精心构造的输入,...