CSDN博客

img nizhigang2000

读书笔记--Jakarta Struts编程

发表于2004/6/30 23:39:00  2076人阅读

1.转发与重定向:重定向之前存储为请求属性的任何对象都会消失。转发过程中对象可以存储在请求中,并发给下一个资源使用。

2.?struts1.1是否可以有多个ActionServlet

3.关于struts1.1中web.xml的初始化参数

(1)config:到默认的Struts配置文件的上下文相关的路径。默认值是/WEB-INF/struts-config.xml,它作为默认应用程序来使用。

(2)config/sub1:可以使用config/值和子程序前缀来指定附加的子程序.init-param名为config/sub1,其值应为WEB-INFO/struts-sub1-config.xml.这将告知struts配置文件中加载子程序sub1.可以按需要声明多个子程序。

(3)debug:指定servlet的细节调试,用来控制记录的信息量,default = 0

(4)detail:Digester的细节调试量,default = 0;

(5)convertHack:这是struts1.0中的值。如果为true,任何使用Java包装器类类型的ActionForm将被设为null.

3.配置struts程序之controller
  对于1.1而言,controller是个新元素。在1.1版本之前,ActionServlet包含了控件器的功能,而你不得不扩展以重载这一功能,但是1.1版本中Struts已经将大多数的控制器功能移给了RequestProcessor类。ActionServlet仍然接受请求,但是它将要请求处理分派给了RequestProcessor的一个实例,这样允许你公开地全配处理器类并且修改其功能。
4.message-resources元素
5.plug-in元素
6.控制器的作用:可以处理安全,国际化,和日志记录等服务.
  (1)截获客户请求
    (2)将每个请求映射到特定的业务操作
    (3)从业务操作中收集结果并使它们对客户有效 
    (4)根据当然状态和业务操作的结果确定为客户显示的视图

7.Action实例:Action实例应该是线程安全的,所以对于应用程序中的每个Action类只创建一个单独的实例.所有的客户请求共享一个实例,并可以同时调用excute()方法.

Action类的设计准则:

作用:校验输入值,处理相关的控制操作,如保存一条记录到数据库,更新为下一个页面的服务端的对象,如保存在session中的对象。返回一个ActionForward对象来向响应当前用户的请求,等功能。

可以处理安全,国际化,和日志记录等服务.

  (1)截获客户请求

    (2)将每个请求映射到特定的业务操作

    (3)从业务操作中收集结果并使它们对客户有效 

    (4)根据当然状态和业务操作的结果确定为客户显示的视图

原因:由于每个Action类只创建一个实例,所有的客户都请求共享一个实例,并且可以随时调用execute()方法.

设计指导原则:

在设计Action类时要有多线程环境的概念:必须保证Action类的线程安全.有以下几条原则供参考:

(1)只使用本地变量.不要使用对象的实例变量来存储客户特定的状态.如果要使用特定的实例变量来存储状态信息,但不应该是客户或者请求特有.如创建一个org.apache.commons.logging.Log类型的实例变量在logger中存储信息,这是可以的,因为本身logger是线程安全的.

(2)保存资源:作为一般性的准则,分配稀有资源并将其保存在同一用户的request里可能会引出一些问题.例如,如果程序中使用的JDBC并且你分配一个单独的JDBC给每个用户,那么WEB站点死机或者其它的情况下,你就可以出现一些问题.最好是使用”池”概念,并且在控制器进行页面跳转到另一个页面之前释放这些资源.即使你调用的Bean的方法抛出了一个异常,你也必段这样来做.

(2).Don’t throw it, catch it! 对于Acton里的异常,必须将其捕获,并记录日志转向出错的页面,而不能在其中将异常再抛出去.特别是对于JBuilderX里自动生成的Action代码中的“throw new java.lang.UnsupportedOperationException( "Error occured in Action.");”在具体的代码写上去后一定要先将其给删掉。

(3).要避免在写过长和过于复杂的Action类,如果你在Action类里集合了太多的逻辑,那么这个类就要变得很难去理解,维护,不可能再重用它。最好在Action类里只处理一些如下的逻辑如:安全,国际化,日志记录,页面跳转等逻辑,对于其它再复杂的逻辑,最好将其再另外封装一个类来处理,由Action进行调用。

(4).Struts自带的一些例程中,将比较复杂的逻辑放到了Action里进行处理,这种做法是不能模仿的。对于一些看官方例程来照做的一定要注意。

attribute

请求或会话作域属性名称,在其下,动作的表单bean可以被访问。只有在name属性中指定了表单bean,此处才允许有值。该属性是可选的,没有默认值。若该属性和name属性都包含一个值,该属性具有优先权。

classname

控制动作信息的配置bean的实现方式类。如果没有值被指定,org.apache.struts.action.ActionMapping类即为默认的类。该属性是可选项。

forward

到将要转到的servlet或者JSP资源的应用程序相关的路径,而不是实例化或者调用Action类。Forward, includetype属性是相互排斥的,而且只其一必须被显式指定。该属性是可选项。Org.apache.struts.actions.ForwardAction可用于获取相同的行为。

include

servletJSP资源相关路径,将与响应一起被引用,而不用再实例化和调用Action类。Forward, includetype属性是相互排斥的,而且只其一必须被显式指定。该属性是可选项。org.apache.struts.actions.IncludeAction可用于获取相同的行为。

input

遇到验证错误时,指向控制将返回到输入表单的应用程序相关路径。如果指定了name属性,那么它是必须的,如果没有指定name属性,那么该属性是不允许的。

name

与该动作相关的formbean的名称,该值必须是前面定的过的formbean元素之一的name属性。该属性是可选项,并且没有默认值。

path

请求提交的应用程序相关路径,以“/”开始。如果使用扩展名映射的话,就没有文件名的扩展名。换言之,这是动作的名称,如/addToShoppingCart。该值是必需的,该属性可能更应该被称为“name”,因为它确定的是运作的名称。

parameter

用于通常目的的配置参数,可用于传递由该动作映射选择的附加信息到动作实例。核心框架包不使用此值。如果你在此处提供一个值,那么可在ActionMapping传递到execute()方法时,通过调用getParameter()方法来得到它。

prefix

用于将请求参数名与form bean属性名相匹配。例如,如果form bean中所有的属性均以“pre_”开始,那么你可配置prefix属性,这样请求参数将与ActonForm属性相匹配。只有在name属性指定时才能在此处提供值。

roles

逗号界定的安全角色名列表,允许调用该Action。在请求处理时,RequestProcessor检查用户是否至少有一个属性中标识的角色。该属性是可选的。

scope

无论是request还是session,该属性都用于标识放置表单的作用域。该属性只有在name属性出现时才可以被指定。默认值是session

suffix

用于将请求参数名与form bean属性名进行匹配。例如,如果form bean中所有的请求均以“_foo”结尾,那么你可以设置suffix属性以使请求参数可以与ActionForm属性相匹配。只有在name属性被指定时,才可以在此处提供一个值。

type

扩展了org.apache.struts.action.Action类的完全限定的Java类名。该属性用于在没有指定forwardinclude的属性时处理请求。Forward, includetype属性是相互排斥的,而且只其一必须被显式指定。

unknown

一个布尔值,用于说明该action是否被配置为应用程序默认。如果为true,那么该动作可以处理任何不被其它action处理的请求。每一个应用程序只有一个动作映射可以将该属性值设为true。该属性是可选项,默认值是false。这是一个建立默认动作来捕获用户输入的任何无效URL的好地方。该属性名称或者称为“default”更好。

validate

布尔值,用于说明由name属性指定的form beanvalidate()方法是否应被优先调用,从而可以调用该动作的execute()方法。该属性是可选的,默认值为true.

8.ActionForm:

ActionFormHTML表单数据的一个容器,可能被保存在Session(默认的)或者request里。如果ActionFormsession里面,有一点必须要明确就是:在用它之前要调用其reset方法去初始化。对于ActionForm的设计和开发有如下的准则:

1ActionForm本身没有特定的方法要去实现。一个ActionForm bean只能有gettersetter方法,不要在其中包含业务逻辑。

2ActionForm对象也提供了一种对数据校验的方法。你只需要实现这它的检验方法,并提供资源中提供的出错信息。Struts会自动的校验数据的正确性。当然,也可以忽略这种校验方法,而在其它地方,如Action对象里再来进行校验。

3)为每一个form bean里的字段定义一个有gettersetter方法的属性。其方法要符合JavaBean的规范。提供使用Jbuilder提供的工具来定义,这样可以提高效率并且减少出错的几率。

4)表单中的按钮和其它控件也必须定义一个属性。这样有助于在表单提前时发现是那个按钮或者控件被选择了。需要引起注意的是:FormBean只是一个反映表单数据的数据实体,并不是数据Bean.

5)可以将ActionForm当作HTTPAction之间的一个防火墙,使用validate方法来保证所有请求的字段都是存在的,并且包含合理的值。一个校验失败的ActionForm不会被提交到Action中去进行处理。

6)要记住放一个bean的实例在你的表单中,并使用相关的属性。比如,你放一个“customerbean在你的表单中,其中customer.name这个属性将会被映射成为customer.getName()customer.setName(string Name)方法。这点可以参考相关的JSPTag lib的开发手册。

7!!!!警告:如果你放置一个bean的实例在你的表单中,必段考虑其可见性要求。任何一个ActionForm里的可以接受字符串型的public属性都可以被一个URL串来设置其中的值。所以必须对可见性进行考虑,只能让那些必需的字段可见,具体的控制可见性的方法是控制其gettersetter方法的可见性。在可见性的封装下,还能够提供一个相关的滤器,以确保运行期的属性值不被设置成为不适当的值。

Form-bean元素的属性:

classname

如果你不想使用标题配置bean,rog.apache.struts.config.FormBeanConfig,可以指定自己的类。它必须是FormBeanConfig类的扩展。该属性是可选项,如果不指定,框架包将使用FormBeanConfig类的一个实例。

dynamic

如果type标识的类是org.apache.struts.action.DynaActionForm的实例或者其子类,该值应被设为true,否则为false。该属性是可选的,其默认值是false。它已被否定,框架现在将会自动确定它。

name

用于在整个框架包中引用该bean的唯一标识,该值是必须的,并且在子程序中是唯一的。

type

继承了Struts ActionForm类的完全限定的Java类名。若该址指定为org.apache.struts.action.DynaActionForm,那么Struts将动态的生成DynaActoinForm的一个实例。该属性是必须的。

Form-property元素属性:

classname

如果你不想使用标准配置bean org.apache.struts.config.FormPropertyConfig,你可以指定自己的类,该属性不是必需的。

initial

表示该属性初始化值的字符串,如果不指定,原始值将会被始化为0,而对象则会初始化为null。该属性不是必需的。

name

该属性描述的属性的JavaBean属性名。该属性是必须的。

type

bean的属性实现方式类完全限定的Java类名,后面的可选项“[]”表明该属性是被索引的。该属性是必需的。

 

9 关于异常处理

exception元素的属性:

 

Classname

控件异常信息的配置bean实现方式类。如果指定,必须是org.apache.struts.config.ExceptionConfig的子类,如果不指定,其默认值就是ExceptoinConfig。

handler

处理异常的异常处理程序的完全限定的Java类名。如果没有指定值,将使用默认类org.apache.struts.action.ExceptionHandler.如果指定必须是ExceptionHandler类的子类。

key

在资源包中为子程序指定的消息键。ActionError实例使用该值。

path

异常发生时资源的应用程序相对路径所转向的路径。该属性是可选的,如果此处没有指定值,那么框架包会默认设为action映射的input属性。

scope

存放ActionError实例的scope级别的标识符。属性值必须是request或者session。该属性是可选项,如果不指定,默认值为request。

type

将要被处理的异常的完全限定的Java类名,该属性是必需的,因为框架包不能假定异常,而需要它来确定。

bundle

标识本元素的key属性的资源绑定ServletContext属性。

0 0

相关博文

我的热门文章

img
取 消
img