Struts: Action类编程要点

来源:互联网 发布:软件的可靠性设计 编辑:程序博客网 时间:2024/04/29 14:25

Action类编程要点

 

StrtutsAction接口定义一个单一的必须由Action类实现的方法,就像下面这样:

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException;

 

一个Action类的目标是处理请求,然后返回一个标识JSP页面的ActionForward对象,控制应该重定向这个JSP页面以生成相应的响应。一个典型的Action类将在它的execute( )方法中实现下面的逻辑。

l        验证用户session的当前状态(例如,检查用户已经成功注册)。如果Action类发现用户没有注册,请求应该重定向到显示用户和口令用于注册的JSP页面。这样作是因为用户可能试图重“中间”(例如,从一个书签)进入你的程序,或者因为已经超时,并且servlet容器创建了一个新的session

l        如果验证还没有发生(使用一个实现ValidatingActionForm接口的form bean),则验证这个form bean的属性是必须的。

l        执行业务逻辑来处理请求(例如,再数据库里查询或保存一行)可以用嵌入Action类本身的代码完成,但是,通常应该调用一个业务逻辑bean的一个相应的方法来执行。

l        更新将用来创建下一个用户界面页面的服务器端对象(典型情况下是request范围或session范围内的bean,定义需要在多长时间内保持它们)。

l        返回一个标识相应的JSP页面的适当的ActionForward对象。典型情况下,将通过接收到的ActionMapping对象(如果使用一个局部于这个映射上的逻辑名)或者在controller servlet本身(如果使用一个全局于应用程序的逻辑名)上调用findForward()得到一个对这样一个对象的引用。

 

当为Action类编程时,要记住的设计要点包括一下这些。

l        controller servlet对于所有的请求,仅仅创建一个Action类的实例。这样,在编写Action类时,需要使其能够在一个多线程环境中正确运行,就像必须安全编写一个servletservice()方法一样。

l        帮助线程安全编程的最重要的原则就是在你的Action类中仅仅使用局部变量而不是实例变量。局部变量创建于一个分配给(由你的JVM)每个请求线程的栈中,所以没有必要担心会共享它们。

l        尽管不应该,但是代表系统中Model部分的beans仍有可能抛出异常。应该在execute()方法的逻辑中捕捉所有这样的异常,并且通过执行一下的语句将它们记录在应用程序的日记文件中(包括相应的栈跟踪信息)。servlet.log(“Error message content…”, exception);

l        作为一个通用的规则,分配稀有资源并在来自同一个用户(在用户的session中)的请求间保持它们会导致可能扩展性的问题。你应该在将控制重定向到适当的View组件前释放这样的资源(如果数据库连接)。

 

还有,你需要防止出现非常大的Action类。避免把业务逻辑嵌入到Action类本身,而不是将其写在独立的业务逻辑beans中。但是如果这样做,除了使Action类难以理解和维护外,这种方法也使的难以重用这些业务逻辑代码,因为代码被嵌入到了一个组件(Action类)中并被捆绑运行于Web应用程序环境中。

还要补充一点就是,把试图级的验证工作放在ActionForm来完成,比如输入不能为空、email格式是否正确,而与具体业务相关的验证则放入Action中,这样就可以获得最大的ActionForm重用性的可能。在Action类中如果发现一个问题,可以使用一个请求属性来保存合适的出错信息关键字,然后将控制重定向回输入表单以便错误被纠正。

 

 

摘自《项目实践精解:基于Struts-Sping-HibernateJava应用开发》(作者:梁立新,电子工业出版社,200611月第2次印刷)