首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Struts 二 类型转化

2012-10-23 
Struts 2 类型转化转自:http://blog.csdn.net/lilp_ndsc/article/details/4050469Struts2 类型转化一、概述

Struts 2 类型转化

转自:http://blog.csdn.net/lilp_ndsc/article/details/4050469

Struts2 类型转化

一、概述
??? 在B/S应用中,将字符串请求参数转换为相应的数据类型,是MVC框架提供的功能,而?

下面是类型转化例子:

需求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>

工程目录结构如下:

Struts 二 类型转化

?

创建一个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>

显示页面如下:

?

Struts 二 类型转化?

?

?用户可以在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;

???????? }

}

修改配置文件,使该转化器生效,运行测试应用,效果同样。

?

热点排行