`
Riddick
  • 浏览: 640799 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Struts2.1.x快速入门(二)

阅读更多

------------------------------------------------------------------

本文转载自--http://yulon.iteye.com/blog/551982

------------------------------------------------------------------

六、Struts2的处理流程与Action的管理方式

       6.1struts2处理请求图

StrutsPrepareAndExecuteFilter是Struts 2框架的核心控制器(相当于strtuts1.x的ActionServlet类的作用),它负责拦截由<url-pattern>/*</url-pattern>指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求。默认情况下,如果用户请求的路径不带后缀或者后缀以.action结尾,这时请求将被转入Struts 2框架处理,否则Struts 2框架将略过该请求的处理。当请求转入Struts 2框架处理时会先经过一系列的拦截器,然后再到Action。与Struts1不同,Struts2对用户的每一次请求都会创建一个Action,所以Struts2中的Action是线程安全的。也正因为如此,Struts2里可以定义成员变量,从而废弃了Struts1.x里的Form Bean.即Struts2的Action已具备了Struts1.x里的Form Bean的功能.

七、动态方法调用和使用通配符定义action

       7.1  动态方法调用

              如果Action中存在多个业务方法时,我们可以使用!+方法名调用指定方法。 我们在HelloWorldAction里添加两个业务方法,如下:

Java代码 复制代码
  1. public String del() {   
  2.     message = "调用del()删除方法";   
  3.     return "success";   
  4. }   
  5.   
  6. public String add() {   
  7.     message = "调用add()添加方法";   
  8.     return "success";   
  9. }  
	public String del() {
		message = "调用del()删除方法";
		return "success";
	}

	public String add() {
		message = "调用add()添加方法";
		return "success";
	}

    如果要访问action的del() 方法,我们可以这样调用:/struts2.1/test/helloworld!del    ,动态方法调用就是那么简单,它实现了跟struts1.x 的DispatchAction一样的作用.

    注意: struts2的官方文档已经不建议我们这样使用,建议我们使用另外一种方式来实现:使用通配符定义action来替代

 

        7.2   使用通配符定义action

                即用*号来表示在动态改变的字符或字符串.在struts.xml的test包中添加一个action,如下:

Xml代码 复制代码
  1. <action name="*User" class="cn.gkit.action.HelloWorldAction" method="{1}" >  
  2.         <param name="message">属性注入</param>  
  3. <result name="success">/WEB-INF/jsp/helloworld.jsp</result>    
  4. </action>  
 <action name="*User" class="cn.gkit.action.HelloWorldAction" method="{1}" >
        	<param name="message">属性注入</param>
	<result name="success">/WEB-INF/jsp/helloworld.jsp</result> 
 </action>

    此时如果要访问action的del() 方法,我们可以这样调用:/struts2.1/test/delUser 即可调用到del()方法.

    知识提示:{1}表示与第一个*号匹配,{1}不但可以在method属性上使用,还可以在其他地方使用,如在<result>使用:

Xml代码 复制代码
  1. <result name="success">/WEB-INF/jsp/{1}.jsp</result>   
<result name="success">/WEB-INF/jsp/{1}.jsp</result> 

   

 八、自定义类型转换器 

        问题引入:对于Date类型的属性,可以接收格式为2009-12-20的请求参数值,并将其自动转换成Date类型.但如果项目需求要接收形如:20091220格式的日期该怎么办,在struts1.x中我们可以通过定义类型转换器来实现,同样在Struts2.x里我们也可以定义类似的转换器,并且比struts1.x的转换器要强大,它实现了双向转换的功能.

 

      8.1   定义局部类型转换器

 

       首先在HelloWorldAction里增加一个java.util.Date 类型的birthday字段,并提供getter和setter方法.如下:

Java代码 复制代码
  1. private Date birthday;   
  2.   
  3. public Date getBirthday() {   
  4.     return birthday;   
  5. }   
  6.   
  7. public void setBirthday(Date birthday) {   
  8.     this.birthday = birthday;   
  9. }  
	private Date birthday;

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

      然后:定义Date类型转换器,定义转器有两种方式:

      第一种是继承com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter类,重写它的convertValue方法,实现如下:

 

Java代码 复制代码
  1. public class DateTypeConverter extends DefaultTypeConverter{   
  2.     @Override  
  3.     public Object convertValue(Map<String, Object> context, Object value,   
  4.             Class toType) {   
  5.         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");   
  6.         try {    
  7.             if(toType == Date.class){//当字符串向Date类型转换时   
  8.                 String[] params = (String[]) value;// Request.getParameterValues()    
  9.                 return dateFormat.parse(params[0]);   
  10.             }else if(toType == String.class){//当Date转换成字符串时   
  11.                 Date date = (Date) value;   
  12.                 return dateFormat.format(date);   
  13.             }   
  14.         } catch (ParseException e) {}   
  15.         return null;   
  16.         }   
  17. }  
public class DateTypeConverter extends DefaultTypeConverter{
	@Override
	public Object convertValue(Map<String, Object> context, Object value,
			Class toType) {
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
		try { 
			if(toType == Date.class){//当字符串向Date类型转换时
				String[] params = (String[]) value;// Request.getParameterValues() 
				return dateFormat.parse(params[0]);
			}else if(toType == String.class){//当Date转换成字符串时
				Date date = (Date) value;
				return dateFormat.format(date);
			}
		} catch (ParseException e) {}
		return null;
		}
}

 

    第二种方式是继承org.apache.struts2.util.strutsTypeConverter类,并实现它的两个抽象方法,实现代码如下:

 

Java代码 复制代码
  1. public class DateTypeConverter extends StrutsTypeConverter {   
  2.     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");   
  3.     @Override  
  4.     public Object convertFromString(Map context, String[] value, Class toType) {   
  5.         String[] params = (String[]) value;// Request.getParameterValues()    
  6.         try {   
  7.             return dateFormat.parse(params[0]);   
  8.         } catch (ParseException e) {}   
  9.         return null;   
  10.     }   
  11.   
  12.     @Override  
  13.     public String convertToString(Map context, Object value) {   
  14.         Date date = (Date) value;   
  15.         return dateFormat.format(date);   
  16.     }   
  17. }  
public class DateTypeConverter extends StrutsTypeConverter {
	SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
	@Override
	public Object convertFromString(Map context, String[] value, Class toType) {
		String[] params = (String[]) value;// Request.getParameterValues() 
		try {
			return dateFormat.parse(params[0]);
		} catch (ParseException e) {}
		return null;
	}

	@Override
	public String convertToString(Map context, Object value) {
		Date date = (Date) value;
		return dateFormat.format(date);
	}
}

    知识提示:查找StrutsTypeConverter的源码发现,它本身也继承了DefaultTypeConverter类.StrutsTypeConverter类使用的一种设计模式是模板方法设计模式。

 

        最后,配置要使用该转换器的action类

        在HelloWorldAction同一包内新建HelloWorldAction-conversion.properties文件.文件名的后半部分是固定不变的

*-conversion.properties,*表示的是对应的Action的简单类名(即不带包名),在该文件里如下定义:

Xml代码 复制代码
  1. birthday=cn.gkit.type.converter.DateTypeConverter  
birthday=cn.gkit.type.converter.DateTypeConverter

 birthday表示要转换的属性,右边对应一个转换器.

此时访问路径:/struts2.1/test/helloworld.action?birthday=20091220,Struts框架就是使用刚才定义的转换器将String类型转换成java.util.Date类型.

 

     8.2  定义全局类型转换器

           全局类型转换器的配置文件名是固定的:xwork-conversion.properties,并将该文件放到src目录,编译后会自动WEB-INF\classes目录下.在该文件里如下定义:

Java代码 复制代码
  1. java.util.Date=cn.gkit.type.converter.DateTypeConverter  
java.util.Date=cn.gkit.type.converter.DateTypeConverter

    左边定义的是要转换的类型,作用了全部Action类.

    注意: 如果同时定义了局部和全局的类型转换器,对于同一个类型,局部会覆盖全局的转换器

分享到:
评论

相关推荐

    Strtus2学习笔记

    #### 四、搭建Struts2.1项目 1. **准备项目所需文件** - 解压Struts2-blank-2.1.6.war - 复制lib目录下的jar文件至项目lib目录 - 需要除junit和spring-test之外的所有文件 - commons-io的jar包用于文件上传和...

    struts2笔记

    - **docs**:包含了Struts2的相关文档,包括快速入门指南、详细文档以及API文档等。 - **lib**:包含了Struts2框架的核心库及第三方插件库。 - **src**:包含了Struts2框架的源代码。 ##### 2.2 必备JAR包 为了在...

    新手如何学习编程.doc

    - **框架应用**:掌握Struts1.x/Struts2.x、Spring、Hibernate等流行框架的使用方法。 - **高级主题**:深入学习搜索引擎Lucene、工作流JBPM、WebService、单点登录等高级主题。 - **新兴技术**:学习Hadoop等大数据...

    webwork快速入门

    ### WebWork快速入门知识点 #### 一、WebWork框架简介 **WebWork**是一个由OpenSymphony组织开发的Java Web应用框架,它采用MVC(Model-View-Controller)架构模式,强调组件化和代码重用。WebWork的最新版本为2.1...

    JavaEE程序员必读图书大推荐参照.pdf

    5. 《Struts 2.1 权威指南》:学习 Struts2 的一本国人写的不错的书。 6. 《Maven 实践》:从 Ant 到 Maven 现在是大势所趋,学习 Maven 是必备的。 7. 《expert one-on-one J2EE Development without EJB中文版》:...

    java书目集

    13. **Struts 2.1**:讲解了Struts 2框架的使用,包括控制器、视图和模型的构建,适合Web应用开发的学习者。 14. **Maven实战**:介绍Maven构建工具的使用,对比Ant,阐述了Maven的项目管理和依赖管理优势。 以上...

    spring官方文档

    - 在Spring 4.x中,官方提供了更多的教程和示例来帮助开发者快速上手。 **3.2 删除过时的包和方法** - 为了保持框架的简洁性和高效性,Spring 4.x移除了许多过时的包和方法。 **3.3 支持Java 8** - Spring 4.x...

    JEECMS3.0.4使用教程

    2.1 3.x模板教程之上传资源:JEECMS提供了便捷的资源上传功能,允许用户上传图片、文档等媒体资源,用于网站内容的展示。 2.2 创建资源:通过后台管理界面,可以创建各种类型的内容资源,包括文章、产品、新闻等,...

    java推荐书籍

    5. **《Struts 2.1权威指南》** - **简介**: Struts 2是Java Web应用开发中常用的MVC框架之一,本书详细介绍了Struts 2的配置、组件和最佳实践等内容。 6. **《Maven实战》** - **简介**: Maven是Java项目构建...

    webwork2.0参考资料

    - **目的**: 通过简单的HelloWorld示例快速入门WebWork。 - **步骤**: - 创建Web项目。 - 添加WebWork的依赖库至项目中。 - 配置`web.xml`文件, 注册Servlet控制器。 - 定义Action类, 实现业务逻辑。 - 配置`...

    Spring攻略(第二版 中文高清版).part2

    6.3 将Spring与Struts 1.x集成 220 6.3.1 问题 220 6.3.2 解决方案 220 6.3.3 工作原理 220 6.4 将Spring与JSF集成 226 6.4.1 问题 226 6.4.2 解决方案 226 6.4.3 工作原理 227 6.5 将Spring与DWR...

    Spring攻略(第二版 中文高清版).part1

    6.3 将Spring与Struts 1.x集成 220 6.3.1 问题 220 6.3.2 解决方案 220 6.3.3 工作原理 220 6.4 将Spring与JSF集成 226 6.4.1 问题 226 6.4.2 解决方案 226 6.4.3 工作原理 227 6.5 将Spring与DWR...

    spring security 参考手册中文版

    2.1什么是Spring Security? 17 2.2历史 19 2.3版本编号 20 2.4获得Spring安全 21 2.4.1使用Maven 21 Maven仓库 21 Spring框架 22 2.4.2 Gradle 23 Gradle存储库 23 使用Spring 4.0.x和Gradle 24 2.4.3项目模块 25 ...

    JavaEE程序员必读图书大推荐

    - **《Struts2.1权威指南》** 星级:★★★★☆ 适合对象:初级,中级 Struts2是一个用于构建Web应用程序的强大框架,本书详细介绍了其最新版本的功能和用法。 - **《Maven实践》** 星级:★★★★☆ ...

    dozer(PDF)

    **3.2 从Dozer 1.x迁移到2.x** 由于版本更新可能会引入不兼容的变更,因此文档中提供了一套详细的迁移指南,帮助开发者顺利过渡到新版本。 总结起来,Dozer是一款非常实用的Java Bean映射工具,通过丰富的配置选项...

    JAVA程序开发技术

    **2.1 流式输入输出概述** - **概念**:流是一种数据传输方式,用于读写文件或网络数据。 - **分类**: - 字节流:处理二进制数据; - 字符流:处理文本数据。 **2.2 字节流** **2.2.1 基本字节流** - **常用类*...

    JAVA上百实例源码以及开源项目源代码

    Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制 Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系...

Global site tag (gtag.js) - Google Analytics