以下摘自网友 spiritsl(梦雨心蓝) 的回复 : 在struts1.1中使用应用模块(Application Modules) Struts 1.1的一个新特性是应用模块的概念。应用模块允许将单个Struts应用划分成几个模块,每个模块有自己的Struts配置文件,
JSP页面,Action等等。这个新特性是为了解决大中型的开发队伍抱怨最多的一个问题,即为了更好的支持并行开发允许多个配置
文件而不是单个配置文件。 在用struts进行大型项目开发中,使用这种新特性将是非常好的选择。 下面我以一个非常简单的例子来展示这一功能。 通常在单模块进行开发时,文件的最一般的目录结构如下:
test/
..../web-inf/
.........../classes
.........../lib
.........../*.tld
.........../struts-config.xml
........... /web.xml
........... /validator-rules.xml
........... /validation.xml
........... ...
..../js
..../css
..../main1.jsp (本例使用的一个简单的jsp页面)
..../*.jsp
... ..
如果我们增加一个单独的模块如:test1,则文件的最一般的目录结构如下:
test/
..../test1 ****
........./main11.jsp (本例使用的一个简单的jsp页面)
........./*.jsp ****
..../web-inf/
.........../classes
.........../lib
.........../*.tld
.........../struts-config.xml
........... /struts-test1-config.xml *****
........... /web.xml
........... /validator-rules.xml
........... /validation.xml
........... ...
.../js
... /css
.../main1.jsp (本例使用的一个简单的jsp页面)
.../*.jsp
... ..
[旁边带有“****”的为新增的一些文件或目录]
以下为变更的几个xml配置文件:
1.struts-config.xml
在原来的action-mapping 增加switchAction 如:
....
....
<action-mappings> <!-- Edit user registration --> <action path="/login"
type="com.ifreeway.rms.v12.action.LoginAction"
scope="request">
<forward name="error" path="/main1.jsp"/>
</action>
<action path="/login1"
type="com.ifreeway.rms.v12.action.LoginAction1"
scope="request">
<forward name="error" path="/main1.jsp"/>
</action>
<action path="/switchdo" type="org.apache.struts.actions.SwitchAction"/> ****
</action-mappings>
....
....
[旁边带有“****”的为新特性中增加的配置]
2.struts-test1-config.xml
添加输入这个模块的actionmapping 如下:
....
....
<action-mappings> <!-- Edit user registration --> <action path="/login3"
type="com.ifreeway.rms.v12.action.LoginAction2"
scope="request">
<forward name="error" path="/main11.jsp"/>
</action>
</action-mappings>
....
....
3.web.xml
....
....
<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/test1</param-name> *****
<param-value>/WEB-INF/struts-test1-config.xml</param-value> *****
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
....
....
[旁边带有“****”的为新特性中增加的配置] 大家可以看到在struts-test1-config.xml中增加了下面代码:
<action path="/switchdo" type="org.apache.struts.actions.SwitchAction"/>
因为在struts1.1中模块之间的导航要使用到org.apache.struts.actions.SwitchAction,如果你查看struts1.1的源代码可以发现
org.apache.struts.actions.SwitchAction需要两个参数:prefix 和 page 下面对这个参数逐一说明:
这两个参数均要以“/”开头
prefix 简单一点就是新增模块的名字,本例为:test1
page 就是在新的strutsconfig配置文件中要使用的actionmapping的名字 就本例为:login3.do 注意:如果是要使用却省模块的调用的话 prefix=空字符串 好了下面给出模块间转换的方法 启动Tomcat
http://localhost:8080/test/switchdo.do?prefix=/test1&page=/login3.do
则调用struts-test1-config.xml下的/login3.do
http://localhost:8080/test/switchdo.do?prefix=&page=/login1.do
则调用struts-config.xml下的/login1.do
http://localhost:8080/test/switchdo.do?prefix=&page=/login.do
则调用struts-config.xml下的/login.do
JSP页面,Action等等。这个新特性是为了解决大中型的开发队伍抱怨最多的一个问题,即为了更好的支持并行开发允许多个配置
文件而不是单个配置文件。 在用struts进行大型项目开发中,使用这种新特性将是非常好的选择。 下面我以一个非常简单的例子来展示这一功能。 通常在单模块进行开发时,文件的最一般的目录结构如下:
test/
..../web-inf/
.........../classes
.........../lib
.........../*.tld
.........../struts-config.xml
........... /web.xml
........... /validator-rules.xml
........... /validation.xml
........... ...
..../js
..../css
..../main1.jsp (本例使用的一个简单的jsp页面)
..../*.jsp
... ..
如果我们增加一个单独的模块如:test1,则文件的最一般的目录结构如下:
test/
..../test1 ****
........./main11.jsp (本例使用的一个简单的jsp页面)
........./*.jsp ****
..../web-inf/
.........../classes
.........../lib
.........../*.tld
.........../struts-config.xml
........... /struts-test1-config.xml *****
........... /web.xml
........... /validator-rules.xml
........... /validation.xml
........... ...
.../js
... /css
.../main1.jsp (本例使用的一个简单的jsp页面)
.../*.jsp
... ..
[旁边带有“****”的为新增的一些文件或目录]
以下为变更的几个xml配置文件:
1.struts-config.xml
在原来的action-mapping 增加switchAction 如:
....
....
<action-mappings> <!-- Edit user registration --> <action path="/login"
type="com.ifreeway.rms.v12.action.LoginAction"
scope="request">
<forward name="error" path="/main1.jsp"/>
</action>
<action path="/login1"
type="com.ifreeway.rms.v12.action.LoginAction1"
scope="request">
<forward name="error" path="/main1.jsp"/>
</action>
<action path="/switchdo" type="org.apache.struts.actions.SwitchAction"/> ****
</action-mappings>
....
....
[旁边带有“****”的为新特性中增加的配置]
2.struts-test1-config.xml
添加输入这个模块的actionmapping 如下:
....
....
<action-mappings> <!-- Edit user registration --> <action path="/login3"
type="com.ifreeway.rms.v12.action.LoginAction2"
scope="request">
<forward name="error" path="/main11.jsp"/>
</action>
</action-mappings>
....
....
3.web.xml
....
....
<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/test1</param-name> *****
<param-value>/WEB-INF/struts-test1-config.xml</param-value> *****
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
....
....
[旁边带有“****”的为新特性中增加的配置] 大家可以看到在struts-test1-config.xml中增加了下面代码:
<action path="/switchdo" type="org.apache.struts.actions.SwitchAction"/>
因为在struts1.1中模块之间的导航要使用到org.apache.struts.actions.SwitchAction,如果你查看struts1.1的源代码可以发现
org.apache.struts.actions.SwitchAction需要两个参数:prefix 和 page 下面对这个参数逐一说明:
这两个参数均要以“/”开头
prefix 简单一点就是新增模块的名字,本例为:test1
page 就是在新的strutsconfig配置文件中要使用的actionmapping的名字 就本例为:login3.do 注意:如果是要使用却省模块的调用的话 prefix=空字符串 好了下面给出模块间转换的方法 启动Tomcat
http://localhost:8080/test/switchdo.do?prefix=/test1&page=/login3.do
则调用struts-test1-config.xml下的/login3.do
http://localhost:8080/test/switchdo.do?prefix=&page=/login1.do
则调用struts-config.xml下的/login1.do
http://localhost:8080/test/switchdo.do?prefix=&page=/login.do
则调用struts-config.xml下的/login.do
解决方案 »
- hibernate sjf4j的使用
- 请教关于在eclipse中配置-Xms100m -Xmx200m的方法
- 跪求 axis2 发布到外网有时报 connection reset 解答
- 请问一下webSphere如何只发布一个文件夹,及发布一个静态html文件,没有war包
- JAVA高手请进!jsp中如何实现数据的逐条删除?
- 欢饮加入java北京技术群(108082811)
- checkbox简单的问题
- ibatis编码问题
- 执行sql语句的问题
- 希望大家一起来讨论一下CMP2.0的一些特性和局限性(PROCEDURE,MAX,SUM等),参与者有分
- 在iReport中同时使用多种字体.
- 在javamail中如何读取邮件的附件内容?
结构:
WebRoot
----test
--------struts-config.xml
--------test.jsp
---WEB-INF
---------struts.config.xml
---------web.xml
这样的结构.....
<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> //========>就是这个地方,用豆号隔开,指向其它的xml文件
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<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/regedit</param-name>
<param-value>/WEB-INF/struts-config-regedit.xml</param-value>
</init-param>
<init-param>
<param-name>config/client</param-name>
<param-value>/WEB-INF/struts-config-client.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>standSys.jsp</welcome-file>
</welcome-file-list>
<taglib>
<taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-template.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-template.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-tiles.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
</taglib>
</web-app>
因为我的其它文件是在不同的目录下面...而不是在同一目录....你说的是这样吧.. <init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml,/WEB-INF/struts-config-regedit.xml,/WEB-INF/struts-config-client.xml</param-value>
</init-param>
我前一页面的一个链接是这样的<html:link page="/regedit">regedit</html:link>
struts-config.regedit.xml里面的内容是这样的...
<form-beans >
<form-bean name="regeditForm" type="com.regedit.forms.regeditForm" />
</form-beans><action-mappings >
<action
attribute="regeditForm"
name="regeditForm"
path="/regedit"
scope="request"
type="com.regedit.actions.regeditAction"
unknown="false"
validate="false" >
<forward
name="success"
path="/regedit/regedit.do"
redirect="false"
contextRelative="false" />
</action>
</action-mappings >
<?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"><!--
This is the Struts configuration file for the example application,
using the proposed new syntax. NOTE: You would only flesh out the details in the "form-bean"
declarations if you had a generator tool that used them to create
the corresponding Java classes for you. Otherwise, you would
need only the "form-bean" element itself, with the corresponding
"name" and "type" attributes.
-->
<struts-config>
<form-beans>
<form-bean name="investForm"
type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="invest_id" type="java.lang.String"/>
<form-property name="invest_subject" type="java.lang.String"/>
<form-property name="invest_content" type="java.lang.String"/>
<form-property name="invest_startdate" type="java.lang.String"/>
<form-property name="invest_enddate" type="java.lang.String"/>
<form-property name="invest_company" type="java.lang.String"/>
<form-property name="invest_email" type="java.lang.String"/>
<form-property name="invest_tel" type="java.lang.String"/>
<form-property name="invest_fax" type="java.lang.String"/>
<form-property name="invest_address" type="java.lang.String"/>
<form-property name="invest_count" type="java.lang.String"/>
<form-property name="invest_place" type="java.lang.String"/>
<form-property name="invest_linkman" type="java.lang.String"/>
<form-property name="invest_memberid" type="java.lang.String"/>
<form-property name="admin_id" type="java.lang.String"/>
<form-property name="invest_valid" type="java.lang.String"/>
<form-property name="pageNum" type="java.lang.String"/>
</form-bean>
另外,在配置文件里还有其他重要的部分.
<!-- ========== Global Forward Definitions ============================== -->
<global-forwards>
<forward name="investStageError" path="stageError" />
<forward name="investError" path="backError" />
</global-forwards>
<!-- ========== Action Mapping Definitions ============================== -->
<action-mappings>
<!-- 信息前台首页 -->
<action path="/default"
type="com.invest.action.DefaultAction"
name="listInvestForm"
validate="false"
scope="request">
<forward name="success" path="default" redirect="true"/>
</action>
关于Struts的Action_mapping
由应用逻辑信息确定ActionMapping
ctionMapping为整个应用确定的“线路图”,在配置文件struts-config.xml对ActionMapping进行定义,通过转发请求(forward)来理顺应用的处理流程,确定应用中每个用户请求对应的动作。 通常我们在开发Struts时,应该先花出其简单的流程图,那个Action对应那个FormBean,将链接到哪个页面,或Forward到哪个Action.基本上有了这张草图,我们在写Action_mapping时,会节省很多时间和去除许多不必要的错误.然后在开发代码的过程中一步一步的具体完善我们的Struts-config.xml. 当一个Action类处理完一个逻辑业务后,它返回forward在ActionMapping中被定义.一个Action返回的forward完全有多种可能,尽管一个Action一般只定义其相关的几个forward。那么,如果有多个Action都可能返回的同一个forward,那么就可以将其定义为全局转发(global forward)。如下:
<!-- ========== Global Forward 定义 -->
<global-forwards>
<!--一个报错的forward-->
<forward name="error" path="/Errorpage.jsp"/>
</global-forwards>
这也就相当于是一个全局的函数或变量等,在整个逻辑运行中起着作用.一旦某个Action有需要forward error时,这个<forward name="error" path="/Errorpage.jsp"/>就会产生作用,进行链接到Errorpage.jsp. 我们在来看下相关的Action元素的属性
<!-- ========== Action Mapping 定义 -->
<action-mappings>
<!-- <action>元素的相关属性 -->
<!--
具体的内容请看一看org.apache.struts.action.ActionMapping的相关文档,你就会了解的更多
path - 当前Action对应的用户请求URI路径
type - 实现当前Action的Java class的完整名字
name - 当前Action中用到的ActionForm的名字,其具体信息在配置文件其他地方另有详细定义
unknown - 如果将该属性设置为true,那么就是声明这个Action将处理整个应用中所有未找到相应处理Action的请求,当然,一个应用系统中也只会有一个Action的unknown属性可以设为true
scope - Action中所用到的ActionForm的生存期,可以为“request”或“session”,随着生存期的设置,该Action也会在相应的时间被创建
input - 该Action中相关ActionForm获取用户输入的输入页面,当将ActionForm设为自动验证输入数据,发现不合法数据返回错误时,将返回该页面
validate - 如果本属性为true则在Action动作之前其对应的ActionForm的validate方法会自动被调用,一般用以验证用户输入的数据
forward 元素 - 定义当前Action相关的ActionForward
--> struts-config.xml就是MVC模式的的Controller。
而Struts中的jsp页面就是MVC模式的的View.
Action&ActionFormBean就是MVC模式的的Module.
所以我们的应该把时间多花些在struts-config.xml上面,以保证每一个Action定义及其相关定义是符合应用的需求的。 由于Action类将是由Struts来调用的。所以它的主要方法应该是一个抽象方法,而由每个继承的子类来具体实现,或者在其中做一些所有Action都会做的通用机制.一些参数的中文意思.
参数mapping:其类型为ActionMapping,将在本Action做跳转选择用
参数actionForm:由Struts根据本次HTTP请求数据填充完成的ActionForm对象
参数request:此Action所有处理的本次HTTP请求(对象)
参数response:此Action输出数据所要用到的HTTP响应(对象)