struts1.x 配置文件之
——struts-config.xml详解
Struts应用采用两个基于XML的配置文件来配置,分别是web.xml和struts-cofig.xml文件:
web.xml文件是配置所有web应用的;
struts-config.xml文件是struts专用的配置文件,事实上也是可以根据需要给这个配置文件起其他名称的.
Web应用的发布描述文件:web应用发布描述文件可以在应用开发者、发布者和组装者之间传递配置信息,Web容器在启动的时候从该文件中读取配置信息, 根据它来装载和配置web应用。文档类型定义DTD对XML文档的格式做了定义,DTD把XML文档划分为元素、属性和实体;每一种XML文档都有独自的 DTD文件,可以从网上下载。<web-app>元素是web.xml的根元素,其他元素必须嵌入在<web-app>元素之内。要注意的是子元素也是有顺序的比如必须是首先<servlet>,然后<servlet-mapping>最后< taglib>。
为Struts应用配置Web.xml文件:首先最重要的一步是配置ActionServlet,这个用<servlet>标签的 servlet-name属性起一个名字叫action,然后用servlet-class属性指定ActionServlet的类.然后用< servlet-mapping>标签的servlet-name属性指定action,在用url-pattern指定接收范围是*.do的请求.不管应用中包含了多少子应用,都只需要配置一个ActionServlet类来处理应用中的不同的功能,其实这就是不必要的,因为Servlet本 身就是多线程的,而且目前Struts只允许配置一个ActionServlet.声明ActionServlet的初始化参数:< servlet>的<init-param>子元素用来配置Servlet的初始化参数.param-name设置config参数 名.param-value设置struts-config.xml的路径参数值.
配置欢迎使用清单:如果客户访问Web的时候值是访问了WEB应用的根目录URL.没有具体的指定文件,Web会自动调用Web的欢迎文件.< welcome-file-list>元素来配置的.通过其中的<welcome-file>欢迎页面</welcome- file>来配置.
配置错误处理:尽管Struts框架功能强大的错误处理机制,但是不能保证处理所有的错误或者异常.当错误发生时,如果框架不能处理这种错误,把错误抛弃 给Web容器,在默认的情况下web容器会想客户端返回错误信息.如果想避免让客户看到原始的错误信息,可以在Web应用发布描述文件中配置< error-page>元素.通过<error-code>404来定义错误的类型.然后通过<location>要处理 错误的JSP页面来对错误进行处理.还可以用<exception-type>来设置异常,然后通过<location>来处理 异常的JSP页面来处理异常.
配置Struts标签库:这个就和以前学到的JSP自定义标签类似,配置元素为<taglib>来配置.<taglib- uri>这个指定标签库的uri,类似起一个名称.<taglib-location>这个是标签库的位置也就是实际所在的路径.通过 这样的方法引入一个标签库,然后在前台JSP页面就可以通过自己定义的URI来调用标签.
Struts的核心是struts-config.xml配置文件,在这个文件里描述了所有的Struts组件。
一、 org.apache.struts.config包
首先研讨一下org.apache.struts.config包:在struts应用 启动的时候会把Struts配置文件信息读取到内存中,并把它们存放在config包中相关的JavaBean类的实例中.包中的每一个类都和 struts配置文件中特定的配置元素对应,ModuleConfig在Struts框架中扮演了十分重要的角色,它是整个config包的核心,在 Struts运行时来存放整个应用的配置信息.如果有多个子应用都会有一个ModuleConfig对象,它和Struts文件根元素的< struts-config>对应.根元素中包含<form-bean><action><forward> 等元素.
二、 struts-config.xml文件的结构
<struts-config>是Struts配置文件的根元素,struts中的所有配置都必须置于该顶层元素(即根元素)之内。与根元素对应的配置类是ModuleConfig类。struts的配置主要有8个,即<struts-config>这个根元素共有8个子元素,它们分别是data-sources、form-bean、 global-exception、global-forwards、action-mapping、controller、message-resources和plug-in。在Struts配置文件中,必须按照DTD指定的顺序(即这里列出来的8个配置的先后顺序)来配置<struts-config>元素的各个子元素,如果颠倒了这些子元素的顺序,会产生错误。
其中第一个配置<data-source>基本上不再需要,以下是其他7个配置:
1. FormBean:在<form-beans>元素中配置。
2. Action映射:在<action-mappings>元素中配置。
3. 全局Forwards:在<global-forwards>元素中配置。
4. 全局异常(Exception):在<global-exceptions>元素中的配置。
5. 控制器(Controller):在<controller>元素中配置。
6. 信息资源:在<message-resources>元素中的配置。
7. 插件:在<plug-in>元素中配置。
下面是一个struts-config.xml文件的主要内容:
<?xml version=”1.0” encoding=”ISO-8859-1”?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
" http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd";>
<struts-config>
<data-sources>
<data-source>
</data-source>
</data-sources><form-beans>
<form-bean / >
</form-beans><global-forwards>
<forward / >
</global-forwards><action-mappings>
<action / >
</action-mappings><controller / >
<message-resources / >
<plug-in />
</struts-config>
再次注意:以上各元素的顺序是非常重要的,你的struts-config.xml配置文件必须按照这个顺序进行配置,否则在你的容器启动的时候就会出错。
三、struts的配置方法
下面来看看这7个元素的配置方法:
1、配置Formbean和Action映射
这两个配置项是Struts配置的核心,一个完整的Struts应用程序都会拥有这两项配置。
每一个Formbean要在<form-beans>元素中定义一个<form-bean>子元素。下面的代码给出了一个标准的Formbean的配置方法:
<form-beans>
<form-bean name="myForm" type="actionform.MyActionForm" />
</form-beans>
其中type属性表示Formbean类的全名(包名+类名),一般type属性值需要指定一个org.apache.struts.action.ActionForm类或其子类;而name属性则是我们我们为该type属性所指向的formbean类所取的一个简短易记的名字而已,同时,下面在配置action映射时也需要用到该名字。type属性值还可以指定一个动态form,如org.apache.struts.action.DynaActionForm,或这个类的子类。
在<form-beans>元素中定义的Formbean一般用于将客户端浏览器提交的数据映射为Java Bean的形式,最终开发人员可以直接使用Java Bean来操作客户端提交的数据。Formbean同时还有验证数据的功能(在validate方法中验证)。Formbean有时还会作为其他用途使用,如使用动态form和LocaleAction类配合使用来进行本地化操作。
每一个Action映射要在<action-mappings>元素中定义一个<action>子元素。Action映射的主要功能是将Struts动作的访问路径(一般以.do结尾)和Struts动作类相对应;同时可以指定一个Formbean(该formbean必须是上面已经在<form-beans>元素中定义过的<form-bean>)来接收和验证客户端提交的数据。下面的代码给出了一个标准的配置Action动作的方法:
<action-mappings>
<action name="myForm" path="/myaction" scope="request" validate="true" type="action.MyAction" input="/mystruts/error.jsp">
<forward name="success" path=" /mystruts/success.jsp" />
</action>
</action-mappings>
<action>元素里的属性比较多,这里需要详细讲解一下:
<action name="myForm" />:这里的name属性值就是前面在<form-bean name="myForm" />中的name属性值,这两个属性值必须相同;<action path="/myaction" />:这里的path属性值指向页面请求中的.do请求,具体的见下面的表单提交的例示;
<action type="action.MyAction" />:这里的type属性值为工程中的MyAction类的全名(包名+类名); 需要注意的是:这里的包名与类名之间不是以斜杠"/"来区分,而是以一个点号"."来区分。
<action scope="request" />:这个指定请求的作用域,可以是request,response和page;
下面是<action />之子元素<forward />元素的说明:
<forward name="success" />:这里的name属性值指向页面请求的一个业务名,具体的见下面的表单提交的例示;
<forward path="/mystruts/success.jsp" />:这里的path属性是当用户请求成功后所转向到的页面。下面以一个表单提交为例:
假定有一个用户登陆页面login.jsp ,用户需要在该页面中输入名字和密码,如果验证通过则进入首页:
<form action="<%= request.getContextPaht()%>/myaction.do?ProcName=success" method=post>
name:<input type="text" length="25" id="name"><br />
password:<input type="password" length="25" id="password"><br />
<input type="submit" value="submit">
</form>
现在来看这个表单form的action属性: action="<%= request.getContextPaht()%>/myaction.do?ProcName=success":这里的myaction.do
会被struts所截住(当然需要在web.xml配置文件中配置一下),struts会获取到myaction这个请求,然后便会在struts-config.xml文件中的Action映射中寻找name="myaction"的<action />,并根据该action配置中的type属性,在工程中找到处理该请求的Action类,根据上面给出的action配置示例,action.MyAction类将会处理该请求(具体的处理方法见struts开发示例——登录)。当该类处理结束,比如在这里,经验证,用户输入的名字和密码正确,然后就在该类的execute()方法中写类似这样的一句代码:return actionMapping.findForward("success");这里的actionMapping对象是org.apache.struts.action.ActionMapping类的一个实例;struts会根据findMapping(String path)方法中的参数"success",去struts-config.xml文件中的<action name="myForm" path="/myaction" type="action.MyAction" />的子元素(即<forward />)中寻找name="success"的forward配置,在这里,即为<forward name="success" path="/mystruts/success.jsp" />这个forward配置。找到之后,根据该配置的path属性,页面将转发到工程中mystruts目录下的success.jsp这个页面中来。
2、配置全局Forwards
每一个全局的Forwards需要在<global-forwards>元素中定义一个<forward>子元素。全局 Forwards可以被所有的Action、异常处理以及一些Struts标签(如<html:link>)访问。下面的代码给出了一个标准的全局Forward的配置方法:
< global-forwards >
< forward name ="myforward" path ="/mystruts/newProduct.jsp" />
</ global-forwards >
这里的<forward />配置中的name属性指向<form-beans />中定义的name="myforward"的<form-bean />,path属性值则表示转发后的页面。
3、配置局部和全局异常(Exception)
在Struts中处理异常的方法非常多,然后,为了使处理异常的方式更灵活。Struts框架允许以配置的方式来处理异常。
Struts中的异常配置可分为局部和全局异常。这两种异常配置的方法完全一样,只是配置代码的位置不同。配置局部异常的<exception>元素在<action>元素中,而全局异常的<exception>元素在<global-exceptions >元素中。局部异常的优先级大于全局异常的优先级。
下面的代码给出了一个标准的全局异常的配置方法:
<global-exceptions >
<exception key="error.name.blank" type="java.lang.Exception" path="/error.jsp"/>
</global-exceptions>
其中key属性表示在属性文件中的key,一但Struts Action的execute方法抛出异常,Struts首先会在局部和全局异常中匹配type属性所指定的异常类型。如果匹配成功,就会跳转到path属性所指的Web资源(在本例中是“/error.jsp”)。如果在error.jsp页面中使用<html:errors/>标签显示错误信息,就会输出key属性所对应的值。
<exception>元素除了可以使用path属性指定要跳转的Web资源外,也可以使用handler属性指定用于处理异常的类。如下面的代码所示:
<global-exceptions>
<exception key="error.email. invalid" type="java.lang.Exception" handler="exceptions.EmailException"/>
</global-exceptions>
其中exceptions.EmailException类必须继承org.apache.struts.action.ExceptionHandler类,而且我们必须覆盖execute方法。
ExceptionHandler类的execute方法的定义如下:
public ActionForward execute( Exception ex, ExceptionConfig ae, ActionMapping mapping,
ActionForm formInstance, HttpServletRequest request,
HttpServletResponse response) throws ServletException{} ;
4、配置控制器(Controller)
控制器可能是这七个配置项上使用最少的一项。它主要用来覆盖一些默认的Struts设置。下面是几个常用的Struts设置:
(1) maxFileSize:指定在文件上传时的最大文件尺寸。可以使用K、M和G作为单位。如maxFileSize="2M"。maxFileSize的值只能是整数,不能是小数,如maxFileSize=1.2M是不合法的。
(2) nocache:告诉Struts是否应该缓冲内容。指定为nocache="true”,Struts将不会缓冲内容。默认值为true。
(3) contentType:指定默认的ContentType字段值,如果要发送的内容的默认格式是HTML,我们可以指定contentType的值为“text/html”。
下面的代码是一个完成的控制器的配置:
<controller maxFileSize="2M" contentType = “text/html” nocache = “false” />
5、配置信息资源
信息资源使用<message-resources>元素进行配置。下面是一个配置信息资源的例子:
<message-resources parameter="struts.application" key="global" />
其中parameter属性表示保存信息资源的属性文件的位置,对于上面的代码来说,属性文件的位置是<Web根目录>"WEB-INF"classes"struts"application.properties。key属性表示application.properties文件的标识。如果没有key属性,这个属性文件就是默认的属性文件。当指定key属性时,在使用这个属性文件时,需要使用相关标签的bundle属性指定这个key值。
属性文件中的值可以使用Struts标签来获取,如属性文件中的一个key是key.msg.submit。那么使用<bean:message>标签获取这个属性文件中的key值的代码如下:
<bean:message key="key.msg.submit" bundle=”global”/>
属性文件也可以用在获得错误信息上,如在validate方法中使用如下的代码来指定错误提示信息:
errors.add("name",new ActionMessage("error.name.blank"));
而在JSP页面中可以使用如下的代码来显示这个错误信息:
<html:errors property="name" bundle="global"/>
6、配置Struts插件
Struts之所以强大,在很大程度上取决于它支持通过插件的方式进行扩展,如前面讲的Validator和Tiles,都是以Struts插件形式发布的。Struts插件使用<plug-in>元素进行配置,如下面的代码所示:
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml, /WEB-INF/validator.xml" />
</plug-in>
其中className属性指定了Struts要调用的插件类名。property属性指定了插件需要的属性名,而value属性指定了相应的属性值。
四、配置JDBC数据源
其配置形式如下:
<data-sources>
<data-source>
<set-property property="driverClass" value="fully qualified path of JDBC driver"/>
<set-property property="url" value="data source URL"/>
<set-property property=”mincount” value="the minimum number of connections to open"/>
<set-property property="password" value="the password used to create connections"/>
<set-property property="user" value="the username used to create connections"/>
</data-source>
</data-sources>
<data-source>的属性及其描述信息如下:
Key 绑定在ServletContext上的DataSource实例的索引键,若不设定则缺省为Action.DATA_SOURCE_KEY,如果在应用程序中有多于一个的DataSource,则必须设置Key的值。
DriverClass 所用的JDBC驱动类(必须的)如:com.microsoft.jdbc.sqlserver.SQLServerDriver
url 所用的JDBC的URL(必须的)如:jdbc:microsoft:sqlserver://xg088:1433
MaxCount 同时打开的最大连结数,缺省值为2(可选的)
MinCount 同时打开的最小连结数,缺省值为1(可选的)
User 连结到数据库的用户名(必须的)
Password 连结到数据库的密码(必须的)
Description 关于DataSource的描述信息(可选的)
ReadOnly 如果设为true,则表示该连结是只读的,缺省为false。(可选的)
LoginTimeout 创建连结的最大允许时间,以秒为单位。(可选的)
AutoCommit 如果为true,则每次execute之后会强制回滚。缺省为true。(可选的)
举例说明:
<data-sources>
<data-source>
<set-property property=”key” value=” value="WILEY_DATA_SOURCE" />
<set-property property="driverClass" value="org.gjt.mm.mysql.Driver" />
<set-property property="url" value="jdbc:mysql://localhost/wileyusers" />
<set-property property="maxCount" value="5"/>
<set-property property="minCount" value="1"/>
<set-property property="user" value="sa"/>
<set-property property="password" value="yourpassword"/>
</data-source>
</data-sources>