第一天下午学习目录列表:
六、Struts2的处理流程与Action的管理方式
七、动态方法调用和使用通配符定义action
八、自定义类型转换器
九、自定义拦截器
十、文件上传(改成一个专题来讲)
六、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代码
public String del() {
message = "调用del()删除方法";
return "success";
}
public String add() {
message = "调用add()添加方法";
return "success";
}
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代码
<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 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代码
<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代码
private Date birthday;
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
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代码
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;
}
}
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代码
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);
}
}
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类使用的一种设计模式是模板方法设计模式,在http://yulon.iteye.com/admin/blogs/550501这里有讲到模板方法模式在项目中的应用.
最后,配置要使用该转换器的action类
在HelloWorldAction同一包内新建HelloWorldAction-conversion.properties文件.文件名的后半部分是固定不变的
*-conversion.properties,*表示的是对应的Action的简单类名(即不带包名),在该文件里如下定义:
Xml代码
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代码
java.util.Date=cn.gkit.type.converter.DateTypeConverter
java.util.Date=cn.gkit.type.converter.DateTypeConverter 左边定义的是要转换的类型,作用了全部Action类.
注意: 如果同时定义了局部和全局的类型转换器,对于同一个类型,局部会覆盖全局的转换器
分享到:
相关推荐
《Struts 2.1权威指南》特点为:1.经验丰富,针对性强 《Struts 2.1权威指南》凝聚了作者大量的实际开发经验和感悟。作者依照读者的学习规律,首先介绍基本概念和基本操作,然后对内容进行深入讲解。 2.讲解具体,...
Struts2.1是Apache软件基金会的开源框架Struts的第二个主要版本,它基于MVC(Model-View-Controller)设计模式,为Java Web应用程序提供了一种强大的开发框架。Struts2的核心目标是简化Web应用的开发过程,提高代码...
struts2.1数据类型转换2struts2.1数据类型转换2struts2.1数据类型转换2struts2.1数据类型转换2struts2.1数据类型转换2struts2.1数据类型转换2struts2.1数据类型转换2struts2.1数据类型转换2
Struts 2.1 是一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架,由Apache软件基金会维护。它旨在提供一个结构化的、可扩展的平台,帮助开发者构建可维护性高、易于扩展的企业级Web应用。在这个...
- **框架定义**:Struts 2.1 是一款基于Java的开源Web应用开发框架,继承了Struts 1.x的优秀特性,并在很多方面进行了改进和优化。它提供了一种构建可扩展且易于维护的Web应用程序的方法。 - **主要特点**: - **...
struts2.1在tomcat下载的包总是报错,根据tomcat官方解释修改后无任何错误,并且已经运行
Struts2.1权威指南 李刚的著作 共四个部分 用7-zip解压
struts2.0升级到struts2.1的工具,自动修改配置文件和页面
Struts2.1是Apache软件基金会的开源框架,主要用于构建基于Java EE的Web应用程序。它在Struts1的基础上进行了重大改进,提供了更强大的MVC(Model-View-Controller)架构支持,增强了动作处理、异常处理、国际化、...
改为使用Convention插件提供“零配置”,Struts 2.1新增了Portlet支持……为了让众多Struts学习者、工作者快速从Struts 2.0的开发升级到Struts 2.1,笔者升级了《Struts 2权威指南》,第二版改写了第一版中所有程序...
改为使用Convention插件提供“零配置”,Struts 2.1新增了Portlet支持……为了让众多Struts学习者、工作者快速从Struts 2.0的开发升级到Struts 2.1,笔者升级了《Struts 2权威指南》,第二版改写了第一版中所有程序...
改为使用Convention插件提供“零配置”,Struts 2.1新增了Portlet支持……为了让众多Struts学习者、工作者快速从Struts 2.0的开发升级到Struts 2.1,笔者升级了《Struts 2权威指南》,第二版改写了第一版中所有程序...
改为使用Convention插件提供“零配置”,Struts 2.1新增了Portlet支持……为了让众多Struts学习者、工作者快速从Struts 2.0的开发升级到Struts 2.1,笔者升级了《Struts 2权威指南》,第二版改写了第一版中所有程序...
改为使用Convention插件提供“零配置”,Struts 2.1新增了Portlet支持……为了让众多Struts学习者、工作者快速从Struts 2.0的开发升级到Struts 2.1,笔者升级了《Struts 2权威指南》,第二版改写了第一版中所有程序...
改为使用Convention插件提供“零配置”,Struts 2.1新增了Portlet支持……为了让众多Struts学习者、工作者快速从Struts 2.0的开发升级到Struts 2.1,笔者升级了《Struts 2权威指南》,第二版改写了第一版中所有程序...
改为使用Convention插件提供“零配置”,Struts 2.1新增了Portlet支持……为了让众多Struts学习者、工作者快速从Struts 2.0的开发升级到Struts 2.1,笔者升级了《Struts 2权威指南》,第二版改写了第一版中所有程序...
改为使用Convention插件提供“零配置”,Struts 2.1新增了Portlet支持……为了让众多Struts学习者、工作者快速从Struts 2.0的开发升级到Struts 2.1,笔者升级了《Struts 2权威指南》,第二版改写了第一版中所有程序...
改为使用Convention插件提供“零配置”,Struts 2.1新增了Portlet支持……为了让众多Struts学习者、工作者快速从Struts 2.0的开发升级到Struts 2.1,笔者升级了《Struts 2权威指南》,第二版改写了第一版中所有程序...
改为使用Convention插件提供“零配置”,Struts 2.1新增了Portlet支持……为了让众多Struts学习者、工作者快速从Struts 2.0的开发升级到Struts 2.1,笔者升级了《Struts 2权威指南》,第二版改写了第一版中所有程序...
改为使用Convention插件提供“零配置”,Struts 2.1新增了Portlet支持……为了让众多Struts学习者、工作者快速从Struts 2.0的开发升级到Struts 2.1,笔者升级了《Struts 2权威指南》,第二版改写了第一版中所有程序...