web容器为每一个web应用创建一个上下文,上下文映射到服务器webapp下的一个子目录,同样,Struts1.1允许为每一个模块创建一个前缀。
每一个模块可以运行在同一个web应用下,但它们具有不同的前缀,就像具有不同上下文的web应用运行在同一个web容器下一样;
当我们写web应用的时候,通常指的是上下文相对路径,这个路径不包括该应用的上下文名称。
同样,当写Struts应用的时候,通常指的是模块相对路径,这个路径不包括模块名称或前缀.
下面是同一URI的绝对路径、上下文相对路径、模块相对路径
绝对URL:http://localhost/myApp/myModule/myAction.do
域相对路径:/myApp/myModule/myAction.do
上下文相对路径:/myModule/myAction.do
模块相对路径:/myAction.do
我们可以编写Struts应用模块,通过配置运行在任何前缀下;写一个模块与写一个独立的应用没什么两样。
所有的配置只须在web.xml中描述,所以应用模块可以不同的前缀下移动,包括ROOT,而不须要更改任何程序代码。
下面是web.xml中配置的一部分, business、pay都是前缀:
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>config/business</param-name>
<param-value>/WEB-INF/struts-config-business.xml</param-value>
</init-param>
<init-param>
<param-name>config/pay</param-name>
<param-value>/WEB-INF/struts-config-pay.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
在这种情况下,负责business模块的人员和负责pay模块的人员完全可以独立开发,互不干扰。Struts自会调整这些前缀。
Struts将会调整所有在模块中的url,struts-config-business.xml、struts-config-pay.xml中所有的path都是模块相对路径,在 Struts处理的时候将会自动加上前缀构成它们的上下文路径,如struts-config-business.xml的配置:
<action path="/addCo"
validate="true"
scope="request"
name="addCoForm"
forward="/addco.jsp">
</action>
在Struts处理的时候,/addCo将会处理成/business/addCo.do, /addco.jsp将会处理成/business/addco.jsp;
同样的,在business目录下所有静态的HTML、IMG(包括jsp中的IMG)等都是与前缀有关系的。
WEB下对应的目录结构:
└─webapp
│ index.jsp
├─bussiness
│ addco.jsp
├─META-INF
│ MANIFEST.MF
└─WEB-INF
│ struts-config.xml
│ struts-config-business.xml
│ struts-config-pay.xml
│ web.xml
│
├─classes
│ │
如需要更改前缀,只需要更改配置文件web.xml和webapp下相应的目录名即可,无须更改任何代码。