Struts应用的配置
Struts的配置是两个文件web.xml以及struts配置文件
1.web.xml
配置ActionServlet,其方法与配置普通的Servlet一致,涉及的元素是<servlet> (名称,类,参数),<servlet-mapping> (servlet所要处理的URL),<taglib> (客户化标签库)
这里 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 >
< init-param >
< param-name > config/moduleA </ param-name >
< param-value > /WEB-INF/struts-moduleA.xml </ param-value >
</ init-param >
</ servlet >
< servlet-mapping >
< servlet-name > action </ servlet-name >
< url-pattern > *.do </ url-pattern >
</ servlet-mapping > 可以看到,<servlet>标签与<servlet-mapping>相对应,由于Struts只支持配一个ActionServlet,因此只能出现一对。
ActionServlet支持用户类,只需要改变这里的<servlet-class>即可使用自定义类;
<servlet>/<init-param>标签中,config代表Struts配置文件所在的位置,这里需要注意 config/moduleA的写法,它代表着一个模块moduleA以及支持该模块的配置文件
<init-param>可以具有多个,在这里可以保存一些客户化的参数,使用servlet.getInitParameter("paramname")的方式即可以取得。
<url-parttern>代表该servlet所要处理的URL,支持通配符,*.do代表所有以 .do 为后缀的请求都交由该servlet来处理
标签库配置
< taglib >
< taglib-uri > /WEB-INF/struts-html.tld </ taglib-uri >
< taglib-location > /WEB-INF/struts-html.tld </ taglib-location >
</ taglib > <taglib-uri>:指定标签库的相对或绝对URI地址,即在JSP页面中引用标签时,需与之对应;
<taglib-location>:指定标签库的物理位置,即实际存放在什么地方。
欢迎文件配置
< welcome-file-list >
< welcome-file > welcome.jsp </ welcome-file >
< welcome-file > index.html </ welcome-file >
</ welcome-file-list > <welcome-file>:web应用的欢迎文件,即只输入了应用的根目录时响应的文件,按先后顺序查找;
该元素不能被配置成Action,如果有此需要的话则应在这里配置一个JSP,并在JSP里面<logic:forward name="key" />进行跳转
错误代码配置
< error-page >
< error-code > 404 </ error-code >
< location > /common/404.html </ location >
</ error-page > <error-page>:指定web出错后的处理页面,常见的错误多是404:找不到目录或文件,500:服务器内部错误;
<error-code>:指定需要处理的错误号;
<location>:指定出错后跳转的处理页面,这里可以设置JSP页面。
异常捕获配置
< error-page >
< exception-type > javax.servlet.ServletException </ exception-type >
< location > /common/system_error.jsp </ location >
</ error-page > 捕获的异常:
RuntimeException 或 Error
ServletException
IOException
2.Struts配置文件
Struts配置的相关类位于org.apache.struts.config包中,其中ModuleConfig接口是整个树的顶点,各种配置信息都放入ModuleConfig的实现类中(由于存在着多模块,因此会有多个实现)。因此从ModuleConfig接口中可以取得各种配置信息,当然需要先通过selectModule()来选择需要操作的具体实现。
还需要注意的一点就是在Struts配置文件里面DTD文件严格定义了各个元素出现的先后顺序。
datasources元素
< data-sources >
< data-source type ="org.apache.commons.dbcp.BasicDataSource" >
< set-property property ="dirverClassName" value ="com.microsoft.jdbc.sqlserver.SQLServerDriver" />
< set-property property ="url" value ="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=addressbook;" />
< set-property property ="username" value ="sa" />
< set-property property ="password" value ="i am ddm" />
< set-property property ="autoCommit" value ="false" />
< set-property property ="readOnly" value ="false" />
< set-property property ="minCount" value ="2" />
< set-property property ="maxCount" value ="20" />
< set-property property ="description" value ="SQL Server2000" />
</ data-source >
< data-source key ="datasource.other" type ="" >
</ data-source >
</ data-sources > <data-sources>:配置应用的数据源,可以包含多个<data-source>子标签
<data-source>:数据源的参数,由于可以有多个数据源,因此<data-source>有一个属性 key 用于区分,如果没有 key 属性,Struts将此做为缺省的数据源,该缺省数据源实际上也是有 key 值的,对应于Globals.DATA_SOURCE_KEY的值,实际值是 "org.apache.struts.action.DATA_SOURCE"字串。
:key 属性的值不允许重复,自行指定key属性后,在Action中操作为 this.getDataSource(request,key),在其它地方则需要从ServletContext(application范围)中用 (DataSource)getAttribute(key),参数key的值与该属性值完全相同,因此在配置文件中该属性应该具有一定的区别性,如"datasource.other"等,以避免在引用时出现麻烦,另外如果在配置文件中各个data-source都配置了key属性,那么在应用仅能通过对应的key值进行调用,而不会存在着缺省数据源("org.apache.struts.action.DATA_SOURCE");
:使用Myeclipse插件配DBCP时还需要手工修改 几处 。
这里 form-beans元素(普通)
< form-beans >
< form-bean name ="loginForm" type ="com.ddm.struts.addressbook.form.LoginForm" />
</ form-beans > <form-beans>:配置ActionForm,可以包含多个<form-bean>子标签
<form-bean>:ActionFormBean的参数。
className:该标签对应的配置类,Struts中与之对应的类是"org.apache.struts.config.FormBeanConfig",有需要时也可自行指定
name:该ActionForm的唯一标识符
type:ActionForm的类名
form-bean元素(动态)
< form-bean name ="userForm" type ="org.apache.struts.action.DynaActionForm" >
< form-property name ="firstName" type ="java.lang.String" />
< form-property name ="lastName" type ="java.lang.String" />
< form-property name ="age" type ="java.lang.Integer" initial ="18" />
</ form-bean > <form-bean>:动态的ActionForm的type="org.apache.struts.action.DynaActionForm"或子类;
<form-property>:配置ActionForm的成员属性
name:属性名称
type:属性类型,必须是对象类型。如果是Java简单数据类型需要使用包装类
inital:初始值,可缺省,与类的属性可以不用初始化的特性相同
另:这个动态ActionForm还很有些名堂,现在只能逐步推进了
这里 global-exceptions元素
< global-exceptions >
< exception
className ="org.apache.struts.config.ExceptionConfig"
handler ="org.apache.struts.action.ExceptionHandler"
key ="global.error.login"
bundle ="bundle01"
path ="/err.jsp"
scope ="request"
type ="com.ddm.struts.addressbook.LoginException"
/>
</ global-exceptions > <global-exception>:配置全局异常处理,可以包含多个<exception>子标签,其配置方法与局部(Action)异常配置相同,但是作用域不同,类似于Java类的成员属性与同名方法形参作用域之间的关系,对照想想setter就清楚了
<exception>:配置异常处理
className:与<exception>标签对应的配置类,缺省是"org.apache.struts.config.ExceptionConfig";
handler:异常处理类,缺省是"org.apache.struts.action.ExceptionHandler";
key:描述异常的消息在资源文件中的key;
bundle:资源文件,可缺省;
path:Struts捕获到指定类型的异常后,转发的处理路径;
scope:ActionMessages实例的存放范围,缺省为"request",还可取值"session";
type:异常的类型
这里 global-forwards元素
< global-forwards >
< forward
className ="org.apache.struts.action.ActionForward"
contextRelative ="false"
name ="login"
path ="/login.jsp"
redirect ="false"
/>
< forward
name ="toModuleA"
contextRelative ="true"
path ="/moduleA/index.do"
redirect ="true"
/>
</ global-forwards > <global-forwards>:配置全局forward,可包含多个<forward>子标签。
<forward>:配置forward
className:与<forward>标签对应的配置类,缺省为"org.apache.struts.action.ActionForward";
contextRelative:缺省值为"false",表示path相对于应用;当取值为"true"时,表示path属性给出的是相对于当前上下文的URL,如果配置用于子模块之间切换的forward,则此项需设为"true";
name:名称;
path:转发的路径,必须以"/"打头
redirect:缺省值为"false",表示请求转发,取值"true"时,表示重定向,子模块切换用的forward,此项需设为"true"
action-mappings元素
<action-mappings>
<action
className="org.apache.struts.action.ActionMapping"
attribute="loginForm"
input="/login.jsp"
name="loginForm"
path="/login"
scope="request"
validate="true"
parameter="36"
roles=""
unknown="false"
type="com.ddm.struts.addressbook.action.LoginAction"
forward=""
include=""
>
<exception
key="global.error.login"
path="/err.jsp"
type="com.ddm.struts.address.LoginException"
/>
<forward name="loginSuccess" path="/menu.jsp" />
<forward name="loginFaile" path="/login.jsp" />
</action>
</action-mappings> <action-mappings>:配置Action,可包含多个<action>子标签
<action>:配置Action
className:标签对应的配置类,缺省为"org.apache.struts.action.ActionMapping"
attribute:name属性所对应的ActionForm实例的 key ,通过这个attribute操作它,如 (LoginForm)request.getAttribute("loginForm"); ;
input:输入URL,转发到该 Action 时如果 ActionForm.validate() 检验失败,Action 将把请求转发到该URL,请看 ;
name:与Action对应的ActionForm的 name ,与<form-bean>标签的name属性相匹配;
path:Action的访问路径,必须以"/"打头,不需要后缀
scope:与Action对应的ActionForm的存在范围,缺省是"session",可取值"request";
validate:是否需要调用ActionForm的 validate() 方法进行检验,缺省是"true",可取值"false",ActionForm将不会对提交的数据进行表单校验;
parameter:可附加的参数,在Action中可以用 mapping.getParameter() 来获取;
roles:指定允许调用该Action的安全角色,与容器设置的安全角色匹配,由容器来判断;
unknown:表示是否处理用户发出的所有无效的Action URL,默认为"false";
type:Action的类名;
forward:指定转发的URL,相当于使用ForwardAction
include:指定包含的URL,相当于使用IncludeAction
<exception>:Action局部异常捕获,参看<global-exceptions>小节
<forward>:Action局部forward,参看<global-forwards>小节
注意:
<action>标签的type,forward,include三种属性互斥。
controller元素
<controller
className="org.apache.struts.config.ControllerConfig"
contentType="text/html;charset=UTF-8"
locale="true"
nochache="false"
proccessorClass="org.apache.struts.action.RequestProcessor"
/> <controller>:配置ActionServlet
className:标签的配置类,缺省为"org.apache.struts.config.ControllerConfig";
contentType:指定响应结果的内容类型和字符编码,如果在Action和JSP中设置将会覆盖掉该设置;
locale:指定是否把 Locale 对象保存到session中,默认值为"false";
nochache:是否在客户端缓存,缺省为"false",可选"true",struts将在响应中加入特定的头参数以防止页面被缓存
processorClass:指定负责处理 Request 的类,缺省为"org.apache.struts.action.RequestProcessor",如果有多模块则应在各模块指定自己的处理类;
bufferSize:指定上传文件的输入缓冲,默认为"4096";
tempDir:指定处理上传文件的临时工作目录,Servlet容器可以自行分配。
message-resources元素
<message-resources
className="org.apache.struts.config.MessageResourcesConfig"
factory="org.apache.struts.util.PropertyMessageResourcesFactory"
key="org.apache.struts.action.MESSAGE"
null="true"
parameter="com.ddm.struts.addressbook.ApplicationResources"
/> <messge-resources>:配置资源文件,这个标签与以上的几个有点不同,他本身可以存在多个
className:标签的配置类,缺省为"org.apache.struts.config.MessageResourcesConfig";
factory:资源的工厂类,缺省为"org.apache.struts.util.PropertyMessageResourcesFactory";
key:指定 Resource Bundle 存放在 ServletContext 中的 key,缺省为Globals.MESSAGES_KEY的值 "org.apache.struts.MESSAGE" ,可以自行指定key,使用如resource.bundle01加以区别,可通过 (MessageResources)servletContext.getAttribute(key) 拿到,Struts提供的客户化标签中常常可以见到一个 bundle 属性,该属性即对应于这里的 key 值;
null:指定如何处理未知的消息,缺省为"true",返回空字串,可选"false",将返回类似"???key???"的字串;
parameter:资源文件的存放路径。
plug-in元素
<plug-in className="com.ddm.struts.addressbook.bean.UserBean">
<set-property property="path" value="/WEB-INF/user.xml" />
</plug-in> <plug-in>:配置插件,className属性指定具体的插件类,struts配置文件中可配置多个插件,初始化顺序由书写顺序决定;
<set-property>:设置插件的属性,可具有多个,该插件类必须实现与本属性对应的setter/getter,在Struts初始化时自动set。
插件必须实现 org.apache.struts.action.PlugIn 接口,该接口具有两个方法:
public void init(ActionServlet servlet,ApplicationConfig config) throws ServletException; init方法将于Struts应用启动时被调用,是一个初始化客户资源的接口,而且由Struts传入的参数也便于设置各种环境。
public void destroy(); destroy方法于Struts应用关闭时调用,是一个释放客户资源的接口。
多应用模块的配置
多应用模块的划分有助于应用的并行开发,提高效率。
步骤:
1.为每个子应用创建单独的 Struts 配置文件;
2.在 web.xml 中配置每个子应用的信息,参看 这里 ;
3.应用中实现切换:<forward> 或 在<action>标签中使用 SwitchAction 来实现切换