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, include和type属性是相互排斥的,而且只其一必须被显式指定。该属性是可选项。Org.apache.struts.actions.ForwardAction可用于获取相同的行为。 include 到servlet或JSP资源相关路径,将与响应一起被引用,而不用再实例化和调用Action类。Forward, include和type属性是相互排斥的,而且只其一必须被显式指定。该属性是可选项。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 逗号界定的安全角 {MOD}名列表,允许调用该Action。在请求处理时,RequestProcessor检查用户是否至少有一个属性中标识的角 {MOD}。该属性是可选的。 scope 无论是request还是session,该属性都用于标识放置表单的作用域。该属性只有在name属性出现时才可以被指定。默认值是session suffix 用于将请求参数名与form bean属性名进行匹配。例如,如果form bean中所有的请求均以“_foo”结尾,那么你可以设置suffix属性以使请求参数可以与ActionForm属性相匹配。只有在name属性被指定时,才可以在此处提供一个值。 type 扩展了org.apache.struts.action.Action类的完全限定的Java类名。该属性用于在没有指定forward和include的属性时处理请求。Forward, include和type属性是相互排斥的,而且只其一必须被显式指定。 unknown 一个布尔值,用于说明该action是否被配置为应用程序默认。如果为true,那么该动作可以处理任何不被其它action处理的请求。每一个应用程序只有一个动作映射可以将该属性值设为true。该属性是可选项,默认值是false。这是一个建立默认动作来捕获用户输入的任何无效URL的好地方。该属性名称或者称为“default”更好。 validate 布尔值,用于说明由name属性指定的form bean的validate()方法是否应被优先调用,从而可以调用该动作的execute()方法。该属性是可选的,默认值为true. 8.ActionForm: ActionForm是HTML表单数据的一个容器,可能被保存在Session(默认的)或者request里。如果ActionForm在session里面,有一点必须要明确就是:在用它之前要调用其reset方法去初始化。对于ActionForm的设计和开发有如下的准则: (1)ActionForm本身没有特定的方法要去实现。一个ActionForm bean只能有getter和setter方法,不要在其中包含业务逻辑。 (2)ActionForm对象也提供了一种对数据校验的方法。你只需要实现这它的检验方法,并提供资源中提供的出错信息。Struts会自动的校验数据的正确性。当然,也可以忽略这种校验方法,而在其它地方,如Action对象里再来进行校验。 (3)为每一个form bean里的字段定义一个有getter和setter方法的属性。其方法要符合JavaBean的规范。提供使用Jbuilder提供的工具来定义,这样可以提高效率并且减少出错的几率。 (4)表单中的按钮和其它控件也必须定义一个属性。这样有助于在表单提前时发现是那个按钮或者控件被选择了。需要引起注意的是:FormBean只是一个反映表单数据的数据实体,并不是数据Bean. (5)可以将ActionForm当作HTTP与Action之间的一个防火墙,使用validate方法来保证所有请求的字段都是存在的,并且包含合理的值。一个校验失败的ActionForm不会被提交到Action中去进行处理。 (6)要记住放一个bean的实例在你的表单中,并使用相关的属性。比如,你放一个“customer”bean在你的表单中,其中customer.name这个属性将会被映射成为customer.getName()和customer.setName(string Name)方法。这点可以参考相关的JSP和Tag lib的开发手册。 (7)!!!!警告:如果你放置一个bean的实例在你的表单中,必段考虑其可见性要求。任何一个ActionForm里的可以接受字符串型的public属性都可以被一个URL串来设置其中的值。所以必须对可见性进行考虑,只能让那些必需的字段可见,具体的控制可见性的方法是控制其getter与setter方法的可见性。在可见性的封装下,还能够提供一个相关的滤器,以确保运行期的属性值不被设置成为不适当的值。 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属性。