some tips from mailReader(struts2 's sample project):

Message Resources

In Struts 2, message resources are associated with the Action class being processed. If we check the source, we find a language resource bundle named MailreaderSupport. MailreaderSupport is our base class for all the MailReader Actions. Since all of our Actions extend MailreaderSupport, all of our Actions can use the same resource bundle.

public class MailreaderSupport extends ActionSupport

在本例中提供了继承了ActionSupport的MailreaderSupport类 ,以供其他action来继承,这样,所有的action的国际化定义都可以写在ActionSupport.properites,以到达减少资源文件的数目的目的。同时,可以为在ActionSupport实现一些action的公共行为,比如对于web框架而言,session的处理是必需的,因此MailreaderSupport在这里实现SessionAware接口。 

Link actions not pages:

Actions specify code that we want to be run before a page or other resource renders the response. An accepted practice is to never link directly to server pages, but only to logical action mappings. By linking to actions, developers can often "rewire" an application without editing the server pages.

指定链接时,使用到action的链接,而非到jsp的链接

好处:指定到action的链接,可以充分使用action的xwork拦截器的特性,比如在安全性验证、修改反馈的reponse方面都比较容易,而不用在jsp中进行这些操作 

ByPass the validate

有些情况下,不需要再进行用户输入数据的验证,而是直接执行action中的相关方法,比如取消按钮(跳过validate),将直接返回首页,这时候用户输入的信息对这个方法来说是无意义的。比如下面的情况:

  <s:submit action="Login_cancel" onclick="form.onsubmit=null"
    key="button.cancel"/>

Here we are creating the Cancel button for the form. The button's attribute action="Login_cancel" tells the

framework to submit to the Login's "cancel" method instead of the usual "execute" method. The onclick="form.onsubmit=null" script defeats client-side validation. On the server side, "cancel" is on a special list of methods that bypass validation, so the request will go directly to the Action's cancel method. Another entry on the special-case list is the "input" method.

取消按钮按下时不需要进行数据的合法性验证,因此可以设置为跳过validate,直接调用action的cancel方法

Other Tips

使用MedelDriven ?

使用modelDriven的好处在于可以直接将view的数据赋值到model对象中,省去了在action中逐个注入model属性的过程,可以减少工作量,提高开发速度。但是对于view的界面与model属性不一一对应的情况,就比较麻烦。

其实,根据modelDriven的实现方式,是将model放入堆栈的时候放置到action之上,因此model可以先于action得到注入属性的机会,所以完全可以将这两种方式结合起来使用,即将与model可以直接对应的属性使用modelDriven注入,而不能直接对应的注入到action中,在action中进行处理后,注入model

使用基类,直接将aciton映射到jsp文件

<struts>
	<package name="disease" namespace="/disease" extends="struts-default">
		.....		
		<action name="*" class="com.work.action.BaseSupport"> 
			<result>/pages/disease/{1}.jsp</result>
		</action>
		<!-- Add actions here -->
	</package>
</struts>
这样,凡是指向disease/***.action的链接都会被映射到/pages/disease/下同名的jsp,其中 BaseSupport为所
有action的基类

_input的含义

表示是初始输入页面,用户第一次访问该页面,所以尽管输入项都是空的,或者不合法的,但是也不应该有输入项的合法性验证提示信息出现。

OGNL、ActionContext Map、value statck 的关系

(1)OGNL is the Object Graph Navigation Language,OGNL工作的基础是ActionContext map

(2)value Stack是ActionContext map的根对象,所以对于value statck中的对象,比如action、model对象,不需要使用"#" ,但是对于ActionContext map其他对象的访问,需要使用"#"


                                    |--application
                                    |--session
  ActionContext map---|
                                    |--value stack(root)
                                    |--request
                                    |--parameters
                                    |--attr (searches page, request, session, then application scopes)