`
沈冠军
  • 浏览: 111205 次
  • 性别: 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学习笔记三(第3讲.Struts2的类型转换)

    在本篇“Struts2学习笔记三”中,我们将聚焦于Struts2的类型转换这一核心特性。类型转换在处理用户提交的数据时非常关键,它允许Struts2自动将请求参数转换为Java对象的属性。 在Struts2中,类型转换主要由`...

    struts2简单实例(类型转换)

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

    struts2数据类型转换器

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

    struts2 学习重点笔记

    ### Struts2 学习重点知识点总结 #### 一、Struts2 概念与架构 **1.1 Struts2 简介** - **定义**:Struts2 是 Apache 组织提供的一个基于 MVC 架构模式的开源 Web 应用框架。 - **核心**:Struts2 的核心其实是 ...

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

    本实例主要探讨了在Struts2中进行类型转换的三种方法:局部类型转换、全局类型转换以及大量数据类型的转换。对于初学者来说,理解并掌握这些转换方式至关重要,因为它们能够帮助我们处理用户输入的数据,并将其转化...

    struts2注册转换器

    Struts2是一个强大的MVC(模型-视图-控制器)框架,广泛应用于Java Web开发中。...这个案例提供了一个很好的学习点,帮助开发者更好地理解和利用Struts2框架的类型转换机制,提高代码的健壮性和可维护性。

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

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

    Struts2类型转换(一)----常规类型,自定义类型,错误处理

    Struts2是一个强大的MVC框架,它在处理Web应用程序时提供了许多便利,其中包括类型转换功能。类型转换是将用户输入的数据自动转化为服务器端处理所需的类型,这样可以避免手动转换带来的繁琐工作。本篇文章将深入...

    struts2学习心得

    9. **全局类型转换配置**:为了统一管理不同类型转换的规则,Struts2允许在`struts.xml`配置文件或`xwork-conversion.properties`文件中定义全局的类型转换策略,从而避免在每个Action中重复配置相同的转换规则。...

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

    在"Struts2学习笔记四(第4讲.Struts2的类型转换续)"中,我们将会深入探讨Struts2中的类型转换机制,这是一个核心特性,用于处理Action类属性与HTTP请求参数之间的数据类型转换。 在HTTP请求中,数据通常是字符串...

    struts2中文学习文档

    WebWork在被Struts2吸收之前,已经具备了许多先进的特性,如动态类型转换、拦截器和结果类型等。这些特性后来都被融入到了Struts2中,使得Struts2不仅继承了WebWork的优点,还在此基础上进行了改进和扩展,成为了...

    struts2 转换器

    Struts2转换器是Struts2框架中的一个重要组成部分,...通过学习和分析这个项目,你可以深入理解Struts2转换器的工作原理,掌握如何自定义和配置转换器,以及如何在实际项目中应用这些知识,提高Web应用的数据处理能力。

    struts2 学习资料

    4. **结果类型(Result Type)**:Struts2允许定义多种结果类型,如JSP、FreeMarker、Velocity等,可以根据不同的应用场景选择合适的结果渲染引擎。 5. **OGNL(Object-Graph Navigation Language)**:Struts2使用...

    struts2学习 源码

    8. **类型转换**:Struts2自动处理HTTP请求参数到Action字段的类型转换,减轻了开发者的工作负担。 9. **异常处理**:Struts2提供了全局的异常处理机制,可以统一处理应用中的异常,提高代码的健壮性。 10. **国际...

    Struts2之类型转换器的使用案例struts002

    本案例"Struts2之类型转换器的使用案例struts002"深入探讨了如何自定义类型转换器以及在实际应用中的使用。 首先,Struts2框架提供了一系列内置的类型转换器,可以自动处理基本类型和常见类型的数据转换,如String...

    struts2学习笔记(完美总结)——转自OPEN经验库

    在实际项目中,Struts2可以处理类型转换、文件上传下载、拦截器(Interceptor)防止重复提交等问题。Interceptor是Struts2中的重要特性,它允许在Action执行前后插入额外的处理逻辑,如登录验证、日志记录等。深入...

    struts2学习笔记

    5. **类型转换与输入校验**:Struts2在类型转换过程中也会进行基本的校验,如检查非空、数值范围等。 **四.Struts2的核心:拦截器** 拦截器是Struts2的核心组件,它们在Action执行前后介入处理流程。拦截器可以...

    第2讲 --Struts2的类型转换

    总结来说,Struts2的类型转换机制是其核心功能之一,它有效地解决了HTTP请求数据与Action属性之间的类型不匹配问题。理解并掌握Struts2的类型转换,对于提升Java web应用的开发效率和质量具有重要意义。通过学习和...

    struts2 全局类型转换器.rar

    通过这个压缩包,开发者可以学习到如何自定义Struts2的类型转换器,提高应用的灵活性和可维护性。同时,结合博文链接(https://llxhna.iteye.com/blog/1067851)可能会提供更深入的讲解和示例代码,帮助理解并实践这...

Global site tag (gtag.js) - Google Analytics