注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

我的博客

 
 
 

日志

 
 

Struts使用手册2  

2011-09-02 11:27:30|  分类: JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

4.3 ActionForm

一个ActionForm代表着一个与用户交互的HTML表单。ActionForm中的属性来存储表单中的状态,并且有getter,setter方法来访问他们。ActionForm可以存储在sessionrequest的作用域中(默认的是session.如果ActionForm放在session中记得要实现reset方法,以备每次使用ActionForm时都会初始化。Struts根据请求中的参数设置ActionForm的属性并且把经过校验后的ActionForm传到Actionexecute方法。

 

当你在编写ActionForm时必须坚持如下原则:

1.ActionForm本身没有任何特定的方法被实现。仅仅用来表示它是整个框架中一个特定的角色。ActinForm中只有getter,setter方法,并没有任何商业逻辑。

2.AtionForm提供标准的校验机制。如果你重载了ActionFormvalidate方法,并且在资源属性文件中提供了错误消息,那么Struts就会自动校验表单中的数据。当然你也可以忽略ActionForm中的校验,在Action类中来实现校验。

3.为输入表单中的每一个输入定义属性。输入域的名称和ActionForm中属性的名称必须符合JAVA规范。例如一个输入域的名称username将会导致ActionForm中的setUsername被调用。

4.也可以为Form中的按钮或其他控件定义属性。当提交表单时这将有利于你知道哪个控件被选中了。

5.ActionForm当作HTTPAction之间的防火墙。ActionForm的方法可以校验所有必须的属性已经存在了并且包含合理的值。如果校验失败请求将不会被Action类处理。

6.你可能会放一个Bean的实例在ActinForm中,这样你就会用到嵌套属性引用。例如,你可能有一个“customer”在ActionForm中,然后在页面中用“customer.name”来引用属性。

 

4.3.1 DynaActionForm

 

维护一个具体的ActionForm是要耗费时间的。特别是ActionForm越来越多并且都是校验一些简单的属性时你可能会感觉到一股挫折感。

 

这个瓶颈通过DynaActionForm会有所减轻。通过在Struts的配置文件中列出属性,类型和默认值来替代以前的定义一个新类,并且添加getter/setter方法。例如,在struts-config.xml中添加一个UserForm

<form-bean

    name="UserForm"

    type="org.apache.struts.action.DynaActionForm">

    <form-property

        name="givenName"

        type="java.lang.String"

        initial="John"/>

    <form-property

        name="familyName"

        type="java.lang.String"

        initial="Smith"/>

</form-bean>

DynaActionForm支持的数据类型:

·         java.lang.BigDecimal

·         java.lang.BigInteger

·         boolean and java.lang.Boolean

·         byte and java.lang.Byte

·         char and java.lang.Character

·         java.lang.Class

·         double and java.lang.Double

·         float and java.lang.Float

·         int and java.lang.Integer

·         long and java.lang.Long

·         short and java.lang.Short

·         java.lang.String

·         java.sql.Date

·         java.sql.Time

·         java.sql.Timestamp

你可以指定成这些类型的数组,也可以时MAP的具体实现类。

4.3.2 后端映射ActionForm

DynaActionForm根据配置文件中的属性在初始化的时候来生成ActionForm。但有时候输入表单是动态生成的。因此表单的AtionForm的属性不能提前知道,所以需要一种新的方法。

 

Struts允许你将ActionForm属性存储在MAP中而不是JAVA的原子对象。

public FooForm extends ActionForm {

 

    private final Map values = new HashMap();

 

    public void setValue(String key, Object value) {

        values.put(key, value);

    }

 

    public Object getValue(String key) {

        return values.get(key);

    }

 

}

JSP页面中你可以通过特殊的符号来引用:mapname(keyname)。圆括号在Bean的属性中表明:

1.ActionForm的所有属性使用Sring做索引

2.Struts将使用带String参数的getter/setter方法来获取,设置ActionForm的值。

看如下的例子:

<html:text property="value(foo)"/>

这样你将会调用FooFormgetValue方法来得到键值为”foo”的值。为了创建一个包含动态输入域的表单你会如下做:

<%

        for (int i = 0; i < 10; i++) {

               String name = "value(foo-" + i + ")";

%>

               <html:text property="<%= name %>"/>

               <br/>

<%

        }

%>

 

除了后端映射属性,你还可以创建后端列表属性。

public FooForm extends ActionForm {

 

    private final List values = new ArrayList();

 

    public void setValue(int key, Object value) {

        values.set(key, value);

    }

 

    public Object getValue(int key) {

        return values.get(key);

    }

}

在你的JSP页面中,你需要用特殊的符号来引用值:listname[index]

4.4 Action

Ation有两个根据Servlet环境不同而调用的方法.

The Action class defines two methods that could be executed depending on your servlet environment:

public ActionForward execute(ActionMapping mapping,

                     ActionForm form,

                     ServletRequest request,        

                     ServletResponse response)

throws Exception;

 

public ActionForward execute(ActionMapping mapping,

                     ActionForm form,

                     HttpServletRequest request,

                     HttpServletResponse response)

throws Exception;

因为Struts主要用来创建WEB应用,所以大多数项目只用HttpServletRequestAction主要用来处理请求并且返回对象ActionForward表明控制流将转向哪里(JSP,Action, Tile定义,Velocity模板)      。在MVC/Model2的设计模式里,Action将完成一下逻辑。

1.校验用户Session的状态(用户是否登录)。

2.校验表单Bean的属性。

3.执行该请求所需的逻辑处理。

4.修改Server端对象。以备下一个显示页面要用。

5.返回一个ActionForward对象来表明哪一个页面将用来产生输出。

4.4.1 Action类的设计方针

1.编写多线程安全代码 Controller Servlet只创建一个Action的实例来服务所有的请求,因此你必须编写线程安全的Action 类。下面是写Action类是的两个基本的方针:

只使用局部变量  编写线程安全的Action的最重要一点是不要使用实例变量而用局部变量。因为局部变量在每个线程的堆栈上创建,所以不需要考虑多线程的问题。

 保存资源             当你分配有限的资源时可能会导致资源匮乏的问题。(比如分配JDBC 连接,这时就要尽可能采用链接池的方式)。

 

2.不要抛出异常,尽量Catch

如果你的应用代码会抛出异常请Catch住它,记录他们到应用的Log中并且返回一个ActionFoward

 

避免写很长,很复杂的Action类是明智的。如果你写很多的逻辑在Action类中,这将会使代码很难理解,维护,重用。

4.5 异常处理器

Actionexecute方法抛出异常时,你可以定义一个异常处理器来执行相应的处理。首先你需要一个继承org.apache.struts.action.ExceptionHandler的类并且重载execute方法。Execute方法将处理异常并且返回一个ActionForward来告诉struts下一步将去哪。然后在struts-config.xml中配置异常处理器:

<global-exceptions>

    <exception

      key="some.key"

      type="java.io.IOException"

      handler="com.yourcorp.ExceptionHandler"/>

</global-exceptions>

这个配置说明了当发生一个IOException时,com.yourcorp.ExceptionHandler.execute将会被调用。

 

...........

4.6 插件类

 

Plugin接口继承了Ation。它定义了两个接口init,destroy分别在应用启动和停止时调用。Plugin的一般用法就是在应用启动时来装载应用的特定数据。

 

在运行时,任何被Plugin装载的数据都可以被Action,或商业逻辑层的类所使用,不过Plugin并没有提供访问这些数据的方法。Plugin装载的数据经常以预先定义好的名字放在应用的上下文中供其他组件使用。

4.7 ActionMapping的实现

Controller Servlet需要知道如何将某个URI映射到一个ActionActionMapping中可以找到所需的信息:

Type(类型) Action类的全名。

Name Action使用的Form Bean的名字。

Path - 匹配此映射的请求URI.

Unknown - 如果设置为真,应用的所有请求将有此AtionMapping来处理。

Validate - 设置为真,Action类的validate方法将会被调用。

Forward - 当映射被调用时,控制流将会传递到那个URI

4.8 编写Action Mappings

Controller Servlet怎么知道ActionMapping要做什么呢?编写一个小的JAVA类并且持有一个ActionMapping的实例,通过setter方法来设置属性是可以做到的。不过Struts提供了通过Digester组件解释XML的方式来实现。

 

开发者负责创建一个名字叫struts-config.xml的文件并且把它放在WEB-INF目录下。

 

最外层的XML元素必须是<struts-config>,载它的里面有三个比较重要的元素来描述你的Action:

·         <form-beans>

·         <global-forwards>

·         <action-mappings>

<form-beans>

这部分包含了表单Bean的定义。它将用于创建ActionForm。你将使用<form-bean>来定义每个ActionForm,它有如下属性:

·         name: Bean的唯一标识符.

·         type: ActionForm的类名。

<global-forwards>

这部分包含了全局性的转向定义。转向定义实际上就是Actionexecute方法返回的ActionForward。这些定义将映射逻辑名称到某种资源(如JSP),当我们改变资源名称时就不要改所有引用的地方。你使用<forward>来定义转向,它有如下重要的属性:

·         name: 转向的逻辑名称。

·         path: 资源的上下文路径. 例如: /index.jsp or /index.do

·         redirect: True false (默认). ActionServlet 是不是用重定向(redirect)来取代 转向( forward?

<action-mappings>

这部分包含所有的Action映射。你应该使用<action>来定义每一个映射,它包含如下的属性:

·         path: Action所对应的上下文路径.

·         type: Action.

·         name: Action配套的<form-bean> 元素的名称.

4.8.1 ActionMapping例子

 <struts-config>

    <form-beans>

        <form-bean

            name="logonForm"

            type="org.apache.struts.webapp.example.LogonForm" />

     </form-beans>

    <global-forwards

        type="org.apache.struts.action.ActionForward">

        <forward

            name="logon"

            path="/logon.jsp"

            redirect="false" />

    </global-forwards>

    <action-mappings>

        <action

            path="/logon"

            type="org.apache.struts.webapp.example.LogonAction"

            name="logonForm"

            scope="request"

            input="/logon.jsp"

            unknown="false"

            validate="true" />

    </action-mappings>

</struts-config>

4.9 在页面中使用ActionMapping

在页面中配置AtionMapping是你无法通过其他方式设置时的一种方式,它的使用方法为:

<action path="/view" forward="/view.jsp"/>

4.10 ActionMapping中使用通配符

随着Struts应用的增大,ActionMapping也就越来越多。通配符则可以将几个相似的AtionMapping组合成一个。

解释通配符的最好方法是来看一个例子:

<action   

    path="/edit*"

    type="org.apache.struts.webapp.example.Edit{1}Action"

    name="{1}Form"

    scope="request"

    validate="false">

    <forward

        name="failure"

        path="/mainMenu.jsp"/>

    <forward

        name="success"

        path="/{1}.jsp"/>

</action>

path属性中的*号可以匹配请求URI/editSubscription,, editRegistration和其他任何以/edit开头的URI,但/editSubscription/add将不会被匹配。被匹配的部分将会替换AtionMapping的属性和转向(Forward)中的{1}

 

通配符可以包含如下特殊字符:

*   匹配零个或多个字符但不包括/

**  匹配零个或多个字符串并且包括/

/character    反斜杠字符串是转义字符。

4.11 公共的Log 接口

Struts本身并没有LOG配置,把它交给Commons-Logging是最好的。

5. 配置应用

5.1 概述

在你创建Struts应用之前,应该铺设一个好的基础。在你部署Struts应用之前,这里有几个安装任务你必须完成,它包括在Struts配置文件和WEB应用部署描述文件中定义相关的内容。

5.2 Struts配置文件

在创建控制组件一章中我们讲到了Struts<form-bean><action-mapping>,这些元素在Struts应用的开发中扮演着很重要的角色。其他的配置元素是静态的:只需设置一次。

不变的配置元素是:

·         <controller>

·         <message-resources>

·         <plug-in>

5.2.1  控制器的配置

<controller>允许你配置ActionServlet

·         bufferSize文件上传时的输入缓冲区的字节数. [4096] (可选)

·         className配置Bean的类名. [org.apache.struts.config.ControllerConfig] (可选)

·         contentType响应输出内容的类型.可能被the Action, JSP, 或其他资源 覆盖. [text/html] (可选)

·         forwardPattern - <forward>元素的path属性如果以以斜杠开始时映射到上下文相关的路径时的替换模式。它可以由如下元素组成:

o        $M替换成该模块的前缀.

o        $P替换成<Forward>元素的path属性.

o        $$ -  生成$符号.

$x保留字(x即不是上述字符的其他字符). [$M$P] (可选)

·         inputForward - [false] (可选)

·         locale - [true] (可选)

·         maxFileSize上传文件的大小.可以以K,M,G为单位(分别代表千,兆,1024兆). [250M] (可选)

·         multipartClass - multipart 请求处理类的名称。 [org.apache.struts.upload.CommonsMultipartRequestHandler] (可选)

·         nocache设置HTTP头来设置是否允许缓存. [false] (可选)

pagePattern -

·         processorClass - RequestProcessor 子类的类名. [org.apache.struts.chain.ComposableRequestProcessor] (可选)

·         tempDir处理文件上传时的临时目录.

5.2.2 消息资源配置

Struts本身支持应用的国际化,你可以定义一个或多个<message-resources>在你的配置文件中。

·         className配置Bean的类名. [org.apache.struts.config.MessageResourcesConfig] (可选)

·         factory – MessageResourcesFactory的类名. [org.apache.struts.util.PropertyMessageResourcesFactory] (可选)

·         key - ServletContext 关键值来存储此绑定. [org.apache.struts.action.MESSAGE] (可选)

·         null设置为false,将会使找不到相关资源的键值显示 '???keyname???' 而不是null. [true] (可选)

·         parameter资源绑定的名称. (必须)

5.2.3 插件配置

Struts的配置文件中使用<plug-in>元素来配置插件。<plug-in>只有一个className的属性。它是完成了org.apache.struts.action.PlugIn interface接口的类的类名。插件需要配置它自身,所以可用<set-property>来做。

<plug-in className="org.apache.struts.tiles.TilesPlugin">

    <set-property

        property="definitions-config"

           value="/WEB-INF/tiles-defs.xml"/>

</plug-in>

5.3 为应用配置模块

5.3.1 模块配置文件

 

5.3.2 通知控制器

 

5.3.3 切换模块

 

5.4 WEB应用部署描述符

 

安装应用的最后一步是在web.xml包含Struts组件。

5.4.1 配置ActionServlet实例

配置ActionServlet并加上适当的初始化参数

<servlet>

    <servlet-name>action</servlet-name>

    <servlet-class>

        org.apache.struts.action.ActionServlet

    </servlet-class>

    <init-param>

        <param-name>config</param-name>

        <param-value>

         /WEB-INF/struts-config.xml

        </param-value>

    </init-param>

    <load-on-startup>1</load-on-startup>

</servlet>

5.4.2 配置ActionServlet映射

有两种方法可以定义URL请求将会被Controller Servlet处理:前缀匹配和后缀匹配。

<servlet-mapping>

    <servlet-name>action</servlet-name>

    <url-pattern>/do/*</url-pattern>

</servlet-mapping>

按如上定义,下面就是前缀匹配http://www.mycompany.com/myapplication/do/logon

 

<servlet-mapping>

    <servlet-name>action</servlet-name>

    <url-pattern>*.do</url-pattern>

</servlet-mapping>

按如上定义,下面就是后缀匹配

http://www.mycompany.com/myapplication/logon.do

5.4.3 配置Struts标签库

<taglib>

     <taglib-uri>

     http://struts.apache.org/tags-bean

     </taglib-uri>

     <taglib-location>

     /WEB-INF/struts-bean.tld

     </taglib-location>

</taglib>

<taglib>

     <taglib-uri>

     http://struts.apache.org/tags-html

     </taglib-uri>

     <taglib-location>

     /WEB-INF/struts-html.tld

     </taglib-location>

</taglib>

<taglib>

     <taglib-uri>

     http://struts.apache.org/tags-logic

     </taglib-uri>

     <taglib-location>

     /WEB-INF/struts-logic.tld

     </taglib-location>

</taglib>

<taglib>

     <taglib-uri>

     http://struts.apache.org/tags-tiles

     </taglib-uri>

     <taglib-location>

     /WEB-INF/struts-tiles.tld

     </taglib-location>

</taglib>

<taglib>

     <taglib-uri>

     http://struts.apache.org/tags-nested

     </taglib-uri>

     <taglib-location>

     /WEB-INF/struts-nested.tld

     </taglib-location>

</taglib>

  评论这张
 
阅读(238)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017