Struts(二)

 

3.Struts框架中的组件

 

(由于ROSE工具还未能下载,只能找来这幅图,它说明了一定问题,特别是ActionErrors,但它并没有将ActionMappingJSPTag Library包含进来,有时间作完替换)

框架中所使用的组件:

ActionServlet

控制器

ActionClass

包含事务逻辑

ActionForm

显示模块数据

ActionMapping

帮助控制器将请求映射到操作

ActionForward

用来指示操作转移的对象

ActionError

用来存储和回收错误

Struts标记库

可以减轻开发显示层次的工作

下面我们看看各自在框架中所扮演的角色和责任。

3.1 Struts配置文件

这是将struts组件结合在一起的东东:struts-config.xml。默认值

/WEB-INF/struts-config.xml。配置文件可以定义:

l         全局转发

l         ActionMapping

l         ActionForm bean

l         JDBC数据源

配置全局转发

全局转发用来在JSP页之间创建逻辑名称映射。转发都可以通过对调用操作映射的实例来获得,例如:

actionMappingInstace.findForward(“logicalName”);

全局转发的例子:(所有的例子我没有进行解释,一是结合表可以理解,二是例子大部分来自系列四的示例,你应该在作完实验后,再来看一便)

<global-forwards>

<forward   name="bookCreated"  path="/BookView.jsp"/>

</global-forwards>

 属性

描述

Name

全局转发的名字

Path

与目标URL的相对路径

 

配置ActionMapping

ActionMapping对象帮助进行框架内部的流程控制,它们可将请求URI映射到Action,并且将Action类与ActionForm bean相关联。ActionServlet在内部使用这些映射,并将控制转移到特定Action类的实例。所有Action类使用perform()方法实现特定应用程序代码,返回一个ActionForward对象,其中包括响应转发的目标资源名称。例如:

<action-mappings>

<action  path="/createBook"

             type="BookAction"

             name="bookForm"

             scope="request"

             input="/CreateBook.jsp">

</action>

<forward name=”failure” path=”/CreateBook.jsp”/>

<forward name=”cancel” path=”/index.jsp”/>

</action-mappings>

属性

描述

Path

Action类的相对路径

Name

与本操作关联的Action bean的名称

Type

连接到本映射的Action类的全称(可有包名)

Scope

ActionForm bean的作用域(请求或会话)

Prefix

用来匹配请求参数与bean属性的前缀

Suffix

用来匹配请求参数与bean属性的后缀

attribute

作用域名称。

className

ActionMapping对象的类的完全限定名默认的类是org.apache.struts.action.ActionMapping

input

输入表单的路径,指向bean发生输入错误必须返回的控制

unknown

设为true,操作将被作为所有没有定义的ActionMappingURI的默认操作

validate

设置为true,则在调用Action对象上的perform()方法前,ActionServlet将调用ActionForm beanvalidate()方法来进行输入检查

通过<forward>元素,可以定义资源的逻辑名称,该资源是Action类的响应要转发的目标。

属性

描述

Id

ID

ClassName

ActionForward类的完全限定名,默认是org.apache.struts.action.ActionForward

Name

操作类访问ActionForward时所用的逻辑名

Path

响应转发的目标资源的路径

redirect

若设置为true,则ActionServlet使用sendRedirect()方法来转发资源

 

配置ActionForm Bean

ActionServlet使用ActionForm来保存请求的参数,这些bean的属性名称与HTTP请求参数中的名称相对应,控制器将请求参数传递到ActionForm bean的实例,然后将这个实例传送到Action类。例子:

<form-beans>

<form-bean name="bookForm" type="BookForm"/>

</form-beans>

属性

描述

Id

ID

className

ActionForm bean的完全限定名默认值是org.apache.struts.action.ActionFormBean

Name

表单bean在相关作用域的名称,这个属性用来将beanActionMapping进行关联

Type

类的完全限定名

 

配置JDBC数据源

<data-sources>元素可以定义多个数据源。

属性

描述

Id

ID

Key

Action类使用这个名称来寻找连接

Type

实现JDBC接口的类的名称

下面属性需要<set-property>元素定义,在框架1.1版本中已不在使用,但你可用<data-source>元素。例子:

<data-sources>

<data-source id=”DS1”

key=”conPool”

    type=”org.apache.struts.util.GenericDataSource”

<set-property id=”SP1”

autoCommit="true"

description="Example Data Source Configuration"

driverClass="org.test.mm.mysql.Driver"

maxCount="4"

minCount="2"

url="jdbc:mysql://localhost/test"

user="struts"

password="wrox" />

<data-source/>

</data-sources>

属性

描述

desciption

数据源的描述

autoCommit

数据源创建的连接所使用的默认自动更新数据库模式

driverClass

数据源所使用的类,用来显示JDBC驱动程序接口

loginTimeout

数据库登陆时间的限制,以秒为单位

maxCount

最多能建立的连接数目

minCount

要创建的最少连接数目

password

数据库访问的密码

readOnly

创建只读的连接

User

访问数据库的用户名

url

JDBCURL

通过指定关键字名称,Action类可以访问数据源,比如:

javax.sql.DataSource ds = servlet.findDataSource(“conPool”);

javax.sql.Connection con = ds.getConnection();

 

3.2 ActionServlet

框架中的控制器组件是有org.apache.struts.action.ActionServlet类实现的,这个类是javax.servlet.http.HttpServlet类的扩展。

Struts controller基本功能是:
1.
截获用户的Http请求
2.
把这个请求映射到相应的Action类,如果这是此类收到的第一个请求,将初始化实例并

缓寸。
3.
创建或发现一个ActionForm bean实例(看配置文件是否定义),然后将请求过程移植到

bean.
4.
调用Action实例的perform()方法并将ActioForm bean,Action Mapping对象,request

response对象传给它。
如:public ActionForword perform(ActionMapping mapping,
                                 ActionForm form,
                                 HttpServletRequest request,
                                 HttpServletResponse response)
5.perform
返回一个ActionForword对象,此对象连接到相应的jsp页面.

ActionServlet配置

我们需要在web.xml中声明ActionServlet,并且将它配置成启动时进行加载。以下为可以配置的初始化参数:

参数

默认值

描述

application

null

应用程序的资源集合的类

bufferSize

4096

文件上传的缓冲区大小

config

/WEB-INF/struts-config.xml

配置文件的位置和名称

content

Text/html

默认的内容类型

debug

0

程序调试的级别

detail

0

程序调试细节的级别

factory

null

消息资源工厂,用于国际化中解释消息资源

formBean

org.apache.struts.action.ActionFormBean

封装ActionForm bean信息的类的名称

forward

org.apache.struts.action.ActionForward

封装ActionForward对象信息的类的名称

locale

true

true,将在用户会话中存储一个本地对象

mapping

org.apache.struts.action.ActionForward

封装ActionMapping信息的类的名称

maxFileSize

250M

上传文件的最大尺寸

multipartClass

org.apache.struts.action.ActionForward

处理多部分请求的类的名称

noCache

False

HTTP标头是否要设置为禁止缓寸

Null

True

设置为true,对于无效的信息关键字将返回null

tempDir

作为一个servlet参数提供给程序的工作目录

处理下载文件是使用的临时工作目录

validate

True

是否使用新格式的配置文件

vallidating

True

是否对配置文件进行有效性分析

大多数情况下,标准的servlet就能够满足用户需要。

第一次收到特定请求的URI时,ActionServlet将适当的Action类进行实例化,然后ActionServletAction类实例中以servlet为变量名存储一个引用。当被实例化后,Action类会被暂存以备再用。

ActionServlet也提供一些方法,由Action类用来访问数据源和转发目标之类的资源。

ActionServlet方法

ActinServlet提供了一组能够被Action对象使用的方法。

    Struts API的全部信息在struts-documentation.war中可以找到。动态的添加或删除,这些方法只影响应用程序当前的实例:

public void addFormBean(ActionFormBean formBean)

public void removeFormBean(ActionFormBean formBean)

public void addForward(ActionForward actionForward)

public void removeForward(ActionForward actionForward)

public void addMapping(ActionMapping actionMapping)

public void removeMapping(ActionMapping actionMapping)

根据名称查找对象:

public ActionFormBean findFormBean(String name)

public ActionForward findForward(String name)

public ActionMapping findMapping(String name)

用来处理数据源:

  public void addDataSource(String key , DataSource ds)

  public DataSource findDataSource(String key)

我们还可以:

l         使用destroy()方法结束ActionServlet

l         使用reload()方法从struts配置文件将信息重新加载。

 

3.3 ActionMapping

将特定请求映射到特定Action的相关信息存储在ActionMapping中,ActionServeltActionMapping传送到Action类的perform()方法,Action将使用ActionMappingfindForward()方法,此方法返回一个指定名称的ActionForward,这样Action就完成了本地转发。若没有找到具体的ActionForward,就返回一个null.

public ActionForward findForward(String name)

可在映射中动态添加ActionForward:

public void addForward(ActionForward forward)

可返回与映射关联的表单bean:

public String getName()

可返回映射的属性域(会话或请求)

  public String getScope()

 

3.4 Action

Action类真正实现应用程序的事务逻辑,它们负责处理请求。在收到请求后,ActionServlet会:

l         为这个请求选择适当的Action

l         如果需要,创建Action的一个实例

l         调用Actionperform()方法

如果ActionServlet不能找到有效的映射,它会调用默认的Action(在配置文件中定义)。如果找到了ActionServlet将适当的ActionMapping类转发给Action,这个Action使用ActionMapping找到本地转发,然后获得并设置ActionMapping属性。根据servlet的环境和被覆盖的perform()方法的签名,ActionServlet也会传送ServletRequest对象或HttpServletRequest对象。

所有Action类都扩展org.apache.struts.action.Action类,并且覆盖类中定义的某一个perform()方法。有两个perform()方法:

处理非HTTP(一般的)请求:

public ActionForward perform(ActionMapping action,

AcionForm form,

ServletRequest request,

ServletResponse response)

    throws IOException,ServletException

处理HTTP请求:

public ActionForward perform(ActionMapping action,

AcionForm form,

HttpServletRequest request,

HttpServletResponse response)

    throws IOException,ServletException

Action类必须以“线程安全”的方式进行编程,因为控制器会令多个同时发生的请求共享同一个实例,相应的,在设计Action类时就需要注意以下几点:

l         不能使用实例或静态变量存储特定请求的状态信息,它们会在同一个操作中共享跨越请求的全局资源

l         如果要访问的资源(如JavaBean和会话变量)在并行访问时需要进行保护,那么访问就要进行同步

Action类的方法

除了perform()方法外,还有以下方法:

可以获得或设置与请求相关联的区域:

public Locale getLocale(HttpServletRequest request)

public void setLocale(HttpServletRequest request,Locale locale)

为应用程序获得消息资源:

public MessageResources getResources()

检查用户是否点击表单上的“取消”键,如果是,将返回true:

public Boolean isCancelled(HttpServletRequest request)

当应用程序发生错误时,Action类能够使用下面方法存储错误信息:

public void saveErrors(HttpServletRequest request,ActionErrors errors)

ActionError实例被用来存储错误信息,这个方法在错误关键字下的请求属性列表中存储ActionError对象。通过使用在struts标记库中定义的自定义标记,JSP页能够显示这些错误信息,稍后我们就介绍。

 

3.5 ActionForm

框架假设用户在应用程序中为每个表单都创建了一个ActionForm bean,对于每个在struts-config.xml文件中定义的bean,框架在调用Action类的perform()方法之前会进行以下操作:

l         在相关联的关键字下,它检查用于适当类的bean实例的用户会话,如果在会话中没有可用的bean,它就会自动创建一个新的bean并添加到用户的会话中。

l         对于请求中每个与bean属性名称对应的参数,Action调用相应的设置方法。

l         Action perform()被调用时,最新的ActionForm bean传送给它,参数值就可以立即使用了。

ActionForm类扩展org.apache.struts.action.ActionForm类,程序开发人员创建的bean能够包含额外的属性,而且ActionServlet可能使用反射(允许从已加载的对象中回收信息)访问它。

ActionForm类提供了另一种处理错误的手段,提供两个方法:

Public ActionErrors validate(ActionMappin mapping,

ServletRequest request)

Public ActionErrors validate(ActionMappin mapping,

HttpServletRequest request)

你应该在自己的bean里覆盖validate()方法,并在配置文件里设置<action>元素的validatetrue。在ActionServlet调用Action类前,它会调用validate(),如果返回的ActionErrors不是null,则ActinForm会根据错误关键字将ActionErrors存储在请求属性列表中。

如果返回的不是null,而且长度大于0,则根据错误关键字将实例存储在请求的属性列表中,然后ActionServlet将响应转发到配置文件<action>元素的input属性所指向的目标。

如果需要执行特定的数据有效性检查,最好在Action类中进行这个操作,而不是在ActionForm类中进行。

方法reset()可将bean的属性恢复到默认值:

  public void reset(ActionMapping mapping,HttpServletRequest request)

    public void reset(ActionMapping mapping,ServletRequest request)

典型的ActionFrom bean只有属性的设置与读取方法(getXXX,而没有实现事务逻辑的方法。只有简单的输入检查逻辑,使用的目的是为了存储用户在相关表单中输入的最新数据,以便可以将同一网页进行再生,同时提供一组错误信息,这样就可以让用户修改不正确的输入数据。而真正对数据有效性进行检查的是Action类或适当的事务逻辑bean

 

3.6 ActionForward

目的是控制器将Action类的处理结果转发至目的地。

Action类获得ActionForward实例的句柄,然后可用三种方法返回到ActionServlet,所以我们可以这样使用findForward():

l         ActionServlet根据名称获取一个全局转发

l         ActionMappin实例被传送到perform()方法,并根据名称找到一个本地转发

另一种是调用下面的一个构造器来创建它们自己的一个实例:

public ActionForward()

public ActionForward(String path)

public ActionForward(String path,Boolean redirect)

 

3.7 错误处理

struts提供了两个类来处理错误:ActionErrorsActionError,它们都扩展org.apache.struts.actionActionErrors保存着ActionError对象的集合,其中每一个代表了独立的错误信息。每个ActionError都包含了关键字,能够映射到资源文件中存储的错误信息,而这个资源文件是在ActionServlet初始化参数中指定的。

ActionError

ActionError类定义了一组重载的构造器来创建错误信息,第一个构造器方法使用一个字符串作为参数,例如:

      ActionError error = new ActionError(“error.Invalid”);

实例error映射到应用程序资源文件中的一个错误消息:

      error.invalid=<b>Invalid Number</b>

如果在JSP页使用<html:error>,用户就会看见加粗的Invalid Number

另一种使用了java.text.MessageFormat类,可在消息中指定替换字符串,例如:

error.invalid=<b>Invalid Number{0}</b>

创建一个错误消息:

ActionError error = new ActionError(‘error.invalid’,new Double(-1));

JSP页显示:Invalild Number –1

    还有获得特定消息的错误关键字:

public String getKey()

    还有获得替换字符串数组:

public String[] getValues()

 

ActionError

ActionError类从不独立进行错误处理,它们总是被存储在ActionErrors对象中。ActionErrors对象保存ActionError类的集合以及它们特定的属性值,我们可以使用自己定义的属性值,或是使用ActionErrors.GLOBAL_ERROR.

下面是典型Action类的perform()中错误处理情况:

MyForm form = (MyForm) form;

if (number == -1) {

ActionErrors errors = new ActionErrors();

ActionError error = new ActionError(“error.Invalid”,new Double(-1));

errors.add(ActionErrors.GLOBAL_ERROR,error);

saveErrors(req,errors);

String input = mapping.getInput();

Return new ActionForward(input);

      }

ActionErrors有如下有用方法:

方法

描述

clear()

清除所有错误信息

empty()

如果ActionErrors对象是空的,它返回true

get()

返回错误信息。若无参数,所有信息将作为一个Iterator对象返回

properties()

返回包含属性名称的Iterator,这些属性至少有一个错误

size()

返回错误的数目(整型数)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值