Struts 技术

先前对DispatchAction不了解,今天查了一些资料,供自己学习参考
来源:http://www.jdon.com/jive/article.jsp?forum=16&thread=19673

1) DispatchAction就是在struts-config中用parameter参数配置一个表单字段名,这个字段的值就是最终替代execute被调用的方法. 例如parameter="method"而request.getParameter("method")="save",其中"save"就是MethodName。struts的请求将根据parameter被分发到"save"或者"edit"或者什么。但是有一点,save()或者edit()等方法的声明和execute必须一模一样。

2) LookupDispatchAction继承DispatchAction, 用于对同一个页面上的多个submit按钮进行不同的响应。其原理是,首先用MessageResource将按钮的文本和ResKey相关联,例如button.save=保存;然后再复写getKeyMethodMap(), 将ResKey和MethodName对应起来, 例如map.put("button.save", "save"); 其配置方法和DispatchAction是一样的, 使用时要这么写:
<html:submit property="method">
<bean:message key="button.save"/>
</html:submit>

3) MappingDispatchAction是1.2新加的, 也继承自DispatchAction. 它实现的功能和上面两个区别较大, 是通过struts-config.xml将多个action-mapping映射到同一个Action类的不同方法上, 典型的配置就是:
<action-mappings>
<action path="/saveUser" type="logic.UserAction" parameter="save"></action>
<action path="/editUser" type="logic.UserAction" parameter="edit"></action>
</action-mappings>
然后UserAction继承MappingDispatchAction,其中有:
public ActionForward save(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
public ActionForward edit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
等方法

可以看到, 不管怎么变化, 其实这些类都是把execute给分解开, 不管是save, edit还是其他什么方法, 其实都是和原来的execute是等价的, save和edit之间没有任何直接的关系, 而事实呢,它们是同一个业务模型的两种不同操作。 我觉得这就是一个问题,对于save和edit这两种请求, 我后台逻辑有可能只是调用service的方法那一句不一样,其他代码是完全一致的(例如错误处理, 日志记录等)。因此我想出了这个小东西,在execute方法内部进行局部分解.上面有人说看iBATIS的代码看到过类似的。的确,iBATIS实现了一个BeanAction,将ActionForm和Acion写到了一个类里,然后通过一个ThreadLocal的局部变量在各个方法之间传递actionMapping, request, response这些参数。其每个方法的声明变得非常简单,返回的也是字符串forward名。

我在很大程度上是受了Clinton Begin的一些启发,但是BeanAction实现的框架稍微有些大,改写了struts的根本模式。而且作者也说,该框架没有经过实际应用的测试,所以我不想用。

楼顶的帖子我?必须用spring的代理,感觉不是很稳定而且大大增加了配置工作。
有人说xxxDao是局部变量,线性不安全。我也是想问问这个,象这种DAO和Service类,其本身一旦建立,是不会进行任何修改的(但是因为要从spring取,所以不能声明为final)。是不是可以理解为提供一些静态方法(例如saveWorld)的工具类呢?这样的话,是不是就不存在线程不安全的问题了?
究竟啥是线性不安全啊!!


下面是使用这个框架的例子。为了简便,去掉了接口层。BaseAction就不写了


===================== TestDAO,真正的业务逻辑实现 =============================
public class TestDAO {
public void editWorld() {
System.out.println("Editing the world");
}

public void saveWorld() {
System.out.println(
"Saving the world");
}
}

===================== TestService 业务逻辑的facade, 通过spring将testDao注入 =============================
public class TestService {
private TestDAO testDao;

public void setTestDao(TestDAO testDao) { this.testDao = testDao; }

public void editWorldTest() {
testDao.editWorld();
}

public void saveWorldTest() {
testDao.saveWorld();
}
}

===================== TestAction =============================
public class TestAction extends BaseAction {

private TestService getTestService() { return (TestService) getBean(
"testService"); };

public ActionForward execute(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws Exception {
TestActionForm form = (TestActionForm) actionForm;
ActionErrors errors = new ActionErrors();

Object[] params={form, request, errors};
// 上面是关键!Object[]不能设置为对象,因为有可能Test2Action的这一行是{form,request,response,messages,context}。这是这个框架灵活性的体现
String forward = dispatchSubAction(form.getMethod(), params, methods);
// 通过method进行分发, 可以采用其他任何变量

saveErrors(request, errors);
return mapping.findForward(forward);
}

//edit,save等方法的参数要和上面的Object[]相对照
public String edit(TestActionForm form, HttpServletRequest request, ActionErrors errors) {
log.info(
"现在是在edit子动作中");
getTestService().editWorldTest();
return
"edit";
}

public String save(TestActionForm form, HttpServletRequest request, ActionErrors errors) {
log.info(
"现在是在save子动作中");
getTestService().saveWorldTest();
return
"save";
}
}
Jason   2005-08-23 12:52:04 阅读:4186  评论:0  引用:0
前言:有人在我的对话中说希望我请把Structs截图文章继续写下去,写到发布的那儿,于是我就写下了这篇Struts的的发布篇,希望能够学习者指明一点方向。


选中项目,打开首选项中设置jboss服务器.


选中项目,点击右键,移动到图中所示,选中add and remove project

Deployments,打开以下图片所示.

点击图片的add,加入服务器,如下图所示

选中jboss服务器,点击完成即可。以后修改的内容服务器自动发布,勿需手工处理.
Jason   2005-08-10 20:59:32 阅读:6983  评论:6  引用:0

接上一篇

如图所示:点击Add.这是加入表单的字段.



如图所示:然后点击jsp,选择如图选项.



如图所示:点击下一步-->点击 Forwards 加入上篇中所建的两个页面。
如:name:errors
path:errors.jsp
点击加入
..........
完成


如图所示:这就是完成几项操作后所产生的几个class和配置,具体如何再进一步深入,那就修行在个人啦!
Jason   2005-07-20 21:16:24 阅读:4414  评论:0  引用:0
接上一篇

如图所示:打开新建-->新建两个jsp页.一个名为errors.jsp,另一个为success.jsp



如图所示:然后点击新建-->其它-->打开Struts1.1 Form,Action&jsp.点击下一步。



如图所示:use case:写上用例图名称 -->然后Form type选择上图已选选项.


(未完待续)
Jason   2005-07-20 21:07:06 阅读:3783  评论:0  引用:0
接上一篇

如图所示:选择项目名称-->点击右键-->myEclipse->选择加入Struts包。



如图所示:选择Struts版本等设置--》完成.



如图所示:这是加入Struts包以后的列表.

(未完待续)
Jason   2005-07-20 21:00:20 阅读:5296  评论:4  引用:0

好久没有学习了!今天决定写一些关于Struts的文章,给广大的初学者一个参考.首先,打开Eclipse,但前提是安装了myEclipse插件,我的版本是eclipse3.0.


如图所示:打开文件-->新建-->其它,找到myeclipse的插件中包.



如图所示:找到J2EE -->选择web project -->点击下一步




如图所示:写上项目的名称(project name)后点击完成.

(未完待续)
Jason   2005-07-20 20:51:26 阅读:7931  评论:3  引用:0
ActionServlet是一个FrontController,它是一个标准的Servlet,它将request转发给RequestProcessor来处理,

  ActionMapping是ActionConfig的子类,实质上是对struts-config.xml的一个映射,从中可以取得所有的配置信息

  RequestProcessor根据提交过来的url,如*.do,从ActionMapping 中得到相应的ActionForn和Action。然后将request的参数对应到ActionForm中,进行form验证。如果验证通过则调用Action的execute()方法来执行Action,最终返回ActionFoward。

  ActionFoward是对mapping中一个foward的包装,对应于一个url

  ActionForm使用了ViewHelper模式,是对HTML中form的一个封装。其中包含有validate方法,用于验证form数据的有效性。ActionForm是一个符合JavaBean规范的类,所有的属性都应满足get和set对应。对于一些复杂的系统,还可以采用DynaActionForm来构造动态的Form,即通过预制参数来生成Form。这样可以更灵活的扩展程序。

  ActionErrors是对错误信息的包装,一旦在执行action或者form.validate中出现异常,即可产生一个ActionError并最终加入到ActionErrors。在Form验证的过程中,如果有Error发生,则会将页面重新导向至输入页,并提示错误。

  Action是用于执行业务逻辑的RequsestHandler。每个Action都只建立一个instance。Action不是线程安全的,所以不应该在Action中访问特定资源。一般来说,应改使用 Business Delegate 模式来对Business tier进行访问以解除耦合。

  Struts提供了多种Action供选择使用。普通的Action只能通过调用execute执行一项任务,而DispatchAction可以根据配置参数执行,而不是仅进入execute()函数,这样可以执行多种任务。如insert,update等。LookupDispatchAction可以根据提交表单按钮的名称来执行函数。
来源:http://www.yesky.com/SoftChannel/72342371961929728/20031210/1752290.shtml
Jason   2005-07-05 13:10:53 阅读:3904  评论:1  引用:0
Struts的优点主要集中体现在两个方面:Taglib和页面导航。
Taglib是Struts的标记库,灵活动用,能大大提高开发效率。另外,就目前国内的JSP开发者而言,除了使用JSP自带的常用标记外,很少开发自己的标记,或许Struts是一个很好的起点。
关于页面导航,我认为那将是今后的一个发展方向,事实上,这样做,使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。
缺点:
层面太多,做小应用不适合,远不如jsp+bean的方式简洁快速....


Jason   2005-04-20 19:40:00 阅读:3985  评论:1  引用:0
Struts是采用Java Servlet/JavaServer Pages技术,开发Web应用程序的开放源码的framework。 采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架。
Struts有如下的主要功能:
一.包含一个controller servlet,能将用户的请求发送到相应的Action对象。
二.JSP自由tag库,并且在controller servlet中提供关联支持,帮助开发员创建交互式表单应用。
三.提供了一系列实用对象:XML处理、通过Java reflection APIs自动处理JavaBeans属性、国际化的提示和消息。
Jason   2005-04-18 18:16:10 阅读:1826  评论:0  引用:0
小圣空间 版权没有 盗版必就