- 浏览: 165713 次
- 性别:
- 来自: 北京
最新评论
-
jpsb:
...
Spring中 Quartz 调度程序 scheduler JobDetailBean 注入 Service -
jinfreaks1981:
看不明白啊?请解释一下
Struts2 <div> id 动态生成方法 -
huivip:
多谢,刚刚把java7都卸载了,原来是这个原因
IDEA报错: Error: javac: 源版本 1.6 需要目标版本 1.6 -
youfengkai:
多谢,正好遇到问题了
IDEA报错: Error: javac: 源版本 1.6 需要目标版本 1.6 -
wmz110:
,谢谢LZ分享!很好用哦!
PL SQL 8.0.1 注册码
JpetStore中的Action与普通Struts的Action处理方式不一样。遍历JpetStore的src文件夹,并无一个具体的Action,那么它是如何来完成普通Struts的Action工作了?
查
看JpetStore的Struts.xml可以发现,它的Action只有一个,即
“org.apache.stuts.beanaction.Beanaction”。通过Eclipse查看beanaction.jar的源代码,可
以发现Beanaction继承与普通Action,即具备普通的action的功能。那么它无具体Action的奥妙在哪,继续研究
BeanAction的代码,截取BeanAction的excute方法中核心部分代码如下:
private static final String NO_METHOD_CALL = " * " ;
…….
/**/ /* 所有的FormBean都继承于BaseBean */
BaseBean bean = (BaseBean) form;
ActionContext.initCurrentContext(request, response);
if (bean != null ) {
// Explicit Method Mapping
/**/ /* 下面是检查struts.xml配置中是否有parameter属性 */
Method method = null ;
String methodName = mapping.getParameter();
if (methodName != null && ! NO_METHOD_CALL.equals(methodName)) {
try {
/**/ /* 通过反射,根据得到的方法名称取得方法的句柄 */
method = bean.getClass().getMethod(methodName, null );
synchronized (bean) {
/**/ /* 下面是关键一句,调用basebean拥有的接口ActionInterceptor的实现DefaultActionInterceptor,来完成具体方法的调用 */
forward = bean.getInterceptor().intercept( new ActionInvoker(bean, method));
}
……..
/**/ /* 无Parameter属性,检查path路径的最后一个/后的名称,即为调用的方法名 */
// Path Based Method Mapping
if (method == null && ! NO_METHOD_CALL.equals(methodName)) {
methodName = mapping.getPath();
if (methodName.length() > 1 ) {
int slash = methodName.lastIndexOf( " / " ) + 1 ;
methodName = methodName.substring(slash);
if (methodName.length() > 0 ) {
try {
method = bean.getClass().getMethod(methodName, null );
synchronized (bean) {
forward = bean.getInterceptor().intercept( new ActionInvoker(bean, method));
}
……..
/**/ /* 根据调用方法返回的String,得到页面的转移路径 */
return mapping.findForward(forward);
通过研究上面这段代码,我们可知,JpetStore中没有具体Action实现的关键原因即在于下面这几句
method = bean.getClass().getMethod(methodName, null );
synchronized (bean) {
/**/ /* 下面是关键一句,调用basebean拥有的接口ActionInterceptor的实现DefaultActionInterceptor,来完成具体方法的调用 */
forward = bean.getInterceptor().intercept( new ActionInvoker(bean, method));
}
即将原来Action中的excute方法的实现转移到FormBean中,这样实现显得更为简捷,方便。研究ActionInvoke,它的核心代码如下:
try {
return (String) method.invoke(bean, null );
} catch (Exception e) {
throw new BeanActionException( " Error invoking Action. Cause: " + e, e);
}
}
至
此可知,它调用的是formbean中的函数。且从这段代码可知,formbean的这类特殊函数,此处称为action方法,要符合两个特征:1)无参
数;2)返回值为string,此返回string即是Struts-config.xml的全局或局部的forward。
以上是整个beanaction的实现机制。个人感觉此种实现方法对于开发者而言已经类似于ASP.NET的.aspx与.cs开发模式了。下面是通过实例来说明一下BeanAction如何控制formbean的
Struts-config.xml的配置里有3种映射方式,来告诉BeanAction把控制转到哪个form bean对象的哪个方法来处理。
(1)parameter=”*’直接跳转;(2)Parameter中含具体的方法名;(3)Path中最后一个/后的方法名
以这个请求连接为例http://localhost/jpetstore4/shop/viewOrder.shtml
1. URL Pattern
name ="orderBean" scope ="session"
validate ="false" >
< forward name ="success" path ="/order/ViewOrder.jsp" />
</ action >
此种方式表示,控制将被转发到"orderBean"这个form bean对象 的"viewOrder"方法(行为)来处理。方法名取"path"参数的以"/"分隔的最后一部分。
2. Method Parameter
name ="orderBean" parameter ="viewOrder" scope ="session"
validate ="false" >
< forward name ="success" path ="/order/ViewOrder.jsp" />
</ action >
此种方式表示,控制将被转发到"orderBean"这个form bean对象的"viewOrder"方法(行为)来处理。配置中的"parameter"参数表示form bean类上的方法。"parameter"参数优先于"path"参数。
3. No Method call
name ="orderBean" parameter ="*" scope ="session"
validate ="false" >
< forward name ="success" path ="/order/ViewOrder.jsp" />
</ action >
此种方式表示,form bean上没有任何方法被调用。如果存在"name"属性,则struts把表单参数等数据填充到form bean对象后,把控制转发到"success"。否则,如果name为空,则直接转发控制到"success"。
这就相当于struts内置的org.apache.struts.actions.ForwardAction的功能
parameter ="/order/ViewOrder.jsp " scope ="session" validate ="false" >
</ action >
发表评论
-
JDK 版本号对应的数字
2017-05-26 17:03 1186J2SE 8 = 52 (0x34 hex) J2SE ... -
Java在Linux平台编译出错,都是rt.jar惹的祸
2017-04-28 10:20 920给公司项目做集成,发现项目在windows平台下能编译 ... -
Software\JavaSoft\Java Runtime Environment\CurrentVersion has value '1.8', but '
2017-03-31 17:57 1465Registry key 'Software\JavaSoft ... -
内存溢出和内存泄漏
2017-03-05 13:38 289内存溢出和内存泄漏 内存溢出 out of memory,是指 ... -
数组和List 互相转换 List to Array
2013-06-20 10:22 10152数组和List 相互转换, 可以是任意类型的数组 pac ... -
Java中Split函数的用法技巧
2013-05-09 14:27 885在java.lang包中也有String.split()方法, ... -
JavaMail 发邮件程序
2012-02-11 17:49 1014一个简单的发邮件程序 本人测试成功,请放心使用 部分代码修改成 ... -
HttpClient getMethod postMethod response 字体集
2011-12-28 11:25 1237getMethod.getResponseBodyAsStri ... -
多个数据源 JUnit Test 报错处理 No unique bean of type [javax.sql.DataSource]
2011-11-08 17:23 7394ssh多数据源报错处理方法 No unique bean o ... -
appfuse
2011-08-01 17:36 01.按照Appfuse官网的快速指南里面的"Crea ... -
java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.makeAccess
2010-07-11 14:56 2366java.lang.NoSuchMethodError: or ... -
解决Ultraedit32 菜单字体小的问题
2010-01-13 16:19 0解决Ultraedit32 菜单字体小的问题 2009-10- ... -
数据库连接加密 配置文件加密
2010-01-11 17:16 1958重写连接池的setPassword()方法. 写密文解析成明文 ... -
应该记录什么样的日志
2009-06-07 12:39 1082您应该对所有不期望的错误条件 (异常)进行日志. ... -
异常处理
2009-05-22 16:17 1142异常是一种对象,用来表示异常的情况. 分为检查异常和非检查异常 ... -
dbcp连接池实现
2009-03-27 13:39 953DBCP是Apache的一个开源项目: commons.dbc ... -
Java创建Data类型数据
2009-03-04 14:20 1324Java创建Date类型数据 Date createDat ... -
创建Java类中 方法的原则
2009-03-04 14:10 1003多数方法的代码量在一行到六行之间,有些方法在六行到十二 ... -
ClassCastException
2009-01-15 15:28 1020ClassCastException异常是类型转换异常,这种异 ... -
Date类型转换成String (yyyy-MM-dd)
2008-10-11 18:03 2471public String date2String(Date ...
相关推荐
iBATIS JPetStore
iBATIS_JPetStore-4.0.5
ibatis demo,ibatis例子,ibatis示例
此为本人写的一个Castle+ibatis示例代码,使用了Castle中的IOC容器,Facility事务管理,ibatis由Castle进行管理.供大家下载,共同进步!
ibatis经典示例
关于Spring.net + iBatis.net + asp.net MVC 整合的文档,值!
重现经典的ibatis示例项目jpetstore,采用最新的springMVC+mybatis+mysql
Mvc+Ibatis spring框架源码使用
ibatis 完整示例下载少的飞洒发手动阀啊发发发 是大法师法打三分
学习iBatis,快速入门, 源代码包括宠物商店
今天闲来无事 搜索网上资料以及查看源码 配置Ibatis+spring3.2 mvc 整合
spring+ibatis的jpetstore实例工程,包含完整源代码和jar包
Struts+Spring+ibatis开发的Jpetstore宠物商店的开源程序,在SourceForce上下载的,学JAVA WEB开发的人研究的热门开源程序。有需要的同学分享吧!这里提供的是一个下载地址,因为有点大,所以就提供了一个地址,大家...
学习iBatis的必须工具,另有iBatjs经典应用JPetStore源代码
struts+spring+ibatis整合示例,包内有sql及jar包,可直接运行。
学习ibatis很好的例子JPetStore学习ibatis很好的例子JPetStore学习ibatis很好的例子JPetStore学习ibatis很好的例子JPetStore学习ibatis很好的例子JPetStore
ibatis.net的asp.net MVC的实例,集成了Microsoft.unity的IOC
一个简单的struts+spring+ibatis示例的源码,在源码中包含一个简单的分布功能
目前网上罕见的JSF+iBATIS+MySQL示例代码,公司某软件项目所需而做的前期DEMO,只有两个Web页面,用户登录和用户列表,但已经能够说明JSF+iBATIS的典型应用方式。 MyEclipse6.5 项目工程文件,内含SQL建库指令。 ...
由ibatis3.0(mybatis3.0)官网下载示例代码