`
沈冠军
  • 浏览: 110061 次
  • 性别: Icon_minigender_1
  • 来自: 玉林
社区版块
存档分类
最新评论

struts2学习之类型转换

阅读更多

1、前言

      我们都知道从前台表单的数据提交到后台时候,都是字符串类型的,我们用到时,还得对它们进行类型转换,如果一个 表单数据很多的话,如果每一个都用request.getParameter("name")来得到的话,那是很烦躁的,这些代码都是重复的,对于有规律的代码,可以单独拿出来进行封装,我曾经也写了一个这样的方法,不过写的很简单,很多情况都没有考虑到,比如类型转换。struts提供了一个很好的转换封装机制,下面看看例子。

2、需要了解的知识点

      struts2和struts1有很大的不同,可以说strus2的前身不是strust1,Struts2从本质上看来源于Webwork,它同时具有Struts和Webwork的优点,struts1和struts2的常用对象对应关系如下:


         说明:struts2对表单信息处理有两种机制,一种是属性驱动,即把表单中的属性定义在action类中,另一种是模型

         驱动,即和struts1一样,把所有的属性放在一个单独的javabean类中,这种方式使得代码的结构比较清晰,由于

         第一篇博客采用了属性驱动来实现了,这篇的例子就采用模型驱动来实现。

3、编写一个User.java模型类

        

package com.champion.bean;

import java.util.Date;

public class User {
	private String username;
	private String password;
	private String repassword;
	private Point point;
	private Date birthday;
	private Date graduated;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getRepassword() {
		return repassword;
	}
	public void setRepassword(String repassword) {
		this.repassword = repassword;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public Date getGraduated() {
		return graduated;
	}
	public void setGraduated(Date graduated) {
		this.graduated = graduated;
	}
	public Point getPoint() {
		return point;
	}
	public void setPoint(Point point) {
		this.point = point;
	}
	
}

 

    说明:可以看到在这个类中,有一个Point类型的属性point,这个是我另外定义的一个javabean类,我想用更多的

             属性类型来说学习struts2的类型转换机制。

4、还得建一个Point.java模型类

    

package com.champion.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;
	}

}

  

    说明:在这个模型中,我们可以看到它有两个属性x和y,point的意义是一个二维坐标。

3、创建一个registe.jsp页面,才用的时struts内置的标签库,使用它的好处是它内置了很多功能,使得代码更加简单。

   

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<html>
	<head>
		<title>用户注册</title>
	</head>
	<body><h2>坐标请输入两个常数,用逗号隔开,如32,34</h2>
		<s:form action="registe2">
			<s:textfield name="point" value="坐标"></s:textfield>
			<s:textfield name="username" label="用户名:"></s:textfield>
			<s:password name="password" label="密码:"></s:password>
			<s:password name="repassword" label="确认密码:"></s:password>
			<s:textfield name="birthday" label="出生年月:"></s:textfield>
			<s:textfield name="graduated" label="毕业日期:"></s:textfield>
			<s:submit value="提交"></s:submit>
		</s:form>
	</body>
</html>

 

4、编写RegisteAction2java类

 

   

import com.champion.bean.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class RegisteAction2 extends ActionSupport implements ModelDriven<User>{
	User user=new User();
	public User getModel() {
		return user;
	}
	@Override
	public String execute() throws Exception {
	
	       return SUCCESS;
	}
}

     说明:这个类继承了ActionSupport这个动作超类,对于一些自定义的字符类型,如果不继承这个类的话,就无法

              写自定义的方法对自定义类型如Point类型进行转型。继承ModelDriven<I>接口是使用模型驱动,在这个类

              中不用写属性,只要实现ModelDriven<I>中的getModel()方法,返回一个模型对象,struts就会自动的

              对User类 的属性进行匹配类型,并赋值。特别说明,只有动作处理都没有错误(如没有类型转换出错)时,最

              后才会执行execute()放方法,返回一个字符类型。

5、编写注册成功后要显示的页面outInfo.jsp页面

 

   

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<html>
	<head>
		<title>注册信息</title>
	</head>
	<body>
		<s:label value="坐标:"></s:label>
		<s:property value="point" />
		<br>
		<s:label value="用户名:" />
		<s:property value="username" />
		<br>
		<s:label value="密码:" />
		<s:property value="password" />
		<br>
		<s:label value="出生年月:" />
		<s:property value="birthday" />
		<br>
		<s:label value="毕业年月"></s:label>
		<s:property value="graduated" />
	</body>
</html>

 

     说明:这个页面也采用了struts的内置标签,使用<s:property value="属性名">即可活动属性名的值,并输出到

             页面中。

6、编写struts.xml文件

  

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" 
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
	<package name="struts2" extends="struts-default">
		<action name="registe2" class="com.champion.action.RegisteAction2">
			<result name="success">/outInfo.jsp</result>
			<result name="input">/registe2.jsp</result>
		</action>
	</package>
</struts>    

 

     说明:这个文件定义一个action动作,动作类执行成功时,显示outInfo.jsp页面,这段

             <result name="input">/registe2.jsp</result>的意思是如果出错,则继续停留在registe2.jsp页面,但

             是页面会刷新,input这个属性是struts内置的。

7、如果直接运行的话,程序会不会成功呢,由于篇幅的原因,这里就不展示了,答案是否定的,为什么呢,因为我在页面

     坐标输入的如:3,5这样的值,struts是不知道怎么对后台的point进行赋值的,因为point不是一个常见的类型,而

是我自己定义的javabean对象,要想从前台得到的值对它进行赋值,那还得自己编写解析的类。

     struts2对数据的转换提供了很多中转换的方法,由于它是采用了xwork框架来实现的,所以我们也可以编写一个类

让它继承ognl.DefaultTypeConverter这个类,但是这个然后在convertValue(Map context, Object value, Class toType)方法中对数据进行解析就可以,但是这中方法不太好用,所以我决定采用strut2包装好的类来实现,这个类是StrutsTypeConverter,其实它的本质就是继承了ognl.DefaultTypeConverter,只不过它进行包装了,我们用起来更

方便一些。

下面开始编写PointConterver2.java类,实现对Point类型的转换。

 

package com.champion.converter;

import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

import com.champion.bean.Point;

public class PointConterver2 extends StrutsTypeConverter {
	@Override
	/**
	 * 这个方法是从页面传来的string类型进行转换相应的类型
	 * values表示从页面传回来的一个字符串数组
	 * toType表示需要转换为的类型
	 */
	public Object convertFromString(Map arg0, String[] values, Class toType) {
		// 取得values对象中的数据,这个数组其实只有一个数据,因为我在页面只写了一个point属性的输入框
		String firstValue = values[0];
		// 以逗号将数据进行拆分,拆分后的第一个元素为x,另一个为y
		String[] resultValue = firstValue.split(",");
		// 创建一个Point对象
		Point point = new Point();
		// 对point的x和y进行赋值
		point.setX(Integer.parseInt(resultValue[0]));
		point.setY(Integer.parseInt(resultValue[1]));
		return point;
	}

	@Override
	/**
	 * 这个方法是用来将类型转换为字符类型的方法,当在页面需要显示某个属性的值时,就会调用这个方法
	 * value表示需要转换的对象
	 */
	public String convertToString(Map arg0, Object value) {
		// 强制转型为Point类型
		Point point = (Point) value;
		// 得到x和y的值
		int x = point.getX();
		int y = point.getY();
		// 拼凑一个字符串,当在页面要显示point类型时,显示的格式就是result这样的格式,这个可以自己定义
		String result = "x:" + x + "  y:" + y;
		System.out.println(result);
		return result;
	}
}

 

   说明:在代码中已经说的比较详细了

8、到现在是不是可以了呢,答案还是否定的,因为我们只是编写了转换类,但是它什么时候执行,又对那个属性进行转型,程序都不知道,所以还得编写一个关联文件,文件名为xwork-conversion.properties

 

    

com.champion.bean.Point=com.champion.converter.PointConterver2

   说明:这个文件很简单,只有一行代码,它的意思是对com.champion.bean目录下的Point类型进行转换,用到的转换

             com.champion.converter.PointConterver2,也就是刚刚编写的那个类型转换类,对于那个文件名是规定

             死的了,这个是在全局使用的,也就是无论你在那里action中有Point这中类型的,它都会掉用这个转换器对它进

            行转换,另外还可以定义局部的,关联文件名规则为actionName-converter.properties,并且这个文件要

            与action类要在同一个目录下如在这个例子中, 名为registeAction2-conterter.properties关联文件,那

            么它的内容有所不同,这里的内容为Point=com.champion.converter.PointConterver2,也就是不用说明

             Point的路径了,因为它和RegisteAction2在同一个目录下。

 9、是时候看看效果怎么样了。

      在regist2.jsp页面输入信息如下:

    

   提交后,显示的结果为:



    说明:可以看到Point类型已经成功的进行了类型转换,输入的坐标结果正是在PointConverter2中的result值的

             格式一 样。

10、小结一下

     对于已经存在的数据类型,struts2都可以帮我们自动进行了转换,但是我们定义的类型,就必须自己编写转换类来对其进行转换,其实struts对数据的转换机制和我们自己编写的本质上是一样的,只不过,他采用了反射机制,面向的是泛型

而我们编写的是针对与每一个特定的类型而已,今天学习就到这,累了,想睡觉了。

 

 


 

 

  • 大小: 5.3 KB
  • 大小: 20.6 KB
  • 大小: 6.3 KB
分享到:
评论

相关推荐

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

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

    struts2(1-7)源码 struts2学习入门 源码学习

    struts2 将要进行自定义类型转换的点数据从1个增加到3个 struts3 进行全局的类型转换 struts4 使用Struts2中内部类中的方法进行自定义类型转换,用到的类StrutsTypeConverter struts5 增加集合类型,使用范型 ...

    struts2简单实例(类型转换方法对比)

    自己初学struts2做的类型转换方式,有局部类型转换,全局类型转换,和大量数据类型转换,供初学者学习,共同讨论

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

    NULL 博文链接:https://zhaolianyang.iteye.com/blog/859890

    STRUTS 2完全学习手册.pdf

    《Struts 2完全学习手册》全面讲述Struts 2开发框架的知识,包括Struts 2中配置文件的详细讲解、国际化与异常处理、数据类型的转换、数据的输入校验、Struts 2强大的标签库、Struts 2中文件的上传与下载、Struts 2对...

    struts2.1.8学习

    5、Struts2 提供了类型转换器 6、Struts2 提供多种表现层技术,如JSP/Freemarker/Velocity 等 7、Struts2 的输入验证可以对指定方法进行验证,解决Struts1 之痛 8、Struts2 提供了全局范围、包范围和Action 范围的...

    Struts2学习文档,Struts入门学习资料

    Struts2学习文档,Struts入门学习资料,包括(struts-xml,action,上传下载,监听器,拦截器,验证,类型转换,国际化等等)

    Struts2学习教程之自定义类型转换器的方法

    类型转换器的作用是将请求中的字符串或字符串数组参数与action中的对象进行...下面这篇文章主要给大家介绍了关于Struts2学习教程之自定义类型转换器的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

    struts2类型转换和验证流程图

    可以详细了解struts2的流程,便于学习和研究struts2,大家可以交流学习。

    struts2学习笔记

    Struts2环境搭建 Struts2类型转换 Struts2输入校验 拦截器 文件的上传与下载 Struts2的国际化 深入探析 struts2与servlet API耦合方法

    Struts2 学习笔记

    01 Struts2-Action 5 一、 Struts作用: 5 二、 搭建Struts2的运行环境: 5 三、 Namespace 6 四、 标签 6 五、 Action 6 六、 路径问题的说明 8 七、 Action的动态调用方法 8 八、 Action通配符(wildcard)的配置 9 ...

    struts2学习笔记!

    struts2学习笔记!因为还没有全部学完,所以分部分分享!主要内容:struts.xml配置,web.xml配置 Action要点!全局类型转换,部分类型转换,类型转换文件 类型装换错误的处理问题局部使用,把中文汉字转换为编码 struts2对...

    struts2学习心得

    随笔记载了struts2中关于数据类型转换和校验方式的一些基本信息

    Struts2框架学习总结【自用】【原创】【详细】

    个人struts2框架学习后的梳理和总结,内容丰富,从配置文件到action类、result、ognl、类型转换器、国际化、拦截器、表单验证等等内容,还推荐了很多博客链接,有了它自学Struts2框架毫无压力!

    struts2学习ppt

    掌握Struts2原理、基本配置及...掌握Struts2核心解析、国际化、类型转换、输入校验、OGNL、Struts2标签库 了解AJAX技术支持 掌握文件的上传与下载。 深入理解MVC与Struts之间的关系,并使用基本MVC和Struts进行项目开发

    Struts2 in action中文版

    1.1 Web应用程序:快速学习 2 1.1.1 构建Web应用程序 2 1.1.2 基础技术简介 3 1.1.3 深入研究 6 1.2 Web应用程序框架 7 1.2.1 什么是框架 7 1.2.2 为什么使用框架 8 1.3 Struts 2框架 9 1.3.1 Struts 2简史 9 1.3.2 ...

    struts2笔记

    struts2学习笔记,详细说明了struts2框架的执行流程,类型转换,输入校验和国际化等等

    struts2学习笔记四(第4讲.Struts2的类型转换续)

    NULL 博文链接:https://zhaolianyang.iteye.com/blog/861529

    struts2学习.rar

    介绍struts2的知识,分别是 入门与概述、action与struts xml、OGNL与类型转换、标签库、文件上传下载、拦截器、国际化、输入校验。

    BBS-struts2课程设计-南工考研论坛

    (2) 用户处于只有登录之后才可以讨论,聊天;如果没有登录只可以查看信息。 (3) 用户注册,需要通过Struts2字段校验判断用户注册页面中的用户名、密码、年龄、出生日期、邮箱等是否符合校验规则,并对自定义校验器...

Global site tag (gtag.js) - Google Analytics