当Web容器首次启动时,会加载并解析web.xml。默认情况下,在Web容器运行时不会检测Web.xml文件的更新并重新加载它。
Struts配置文件也在Web容器首次启动时被加载并解析。出于安全考虑,Web容器在运行时也不会监测Struts配置文件的更新并重新加载。
两个配置文件web.xml和struts-config.xml
一、Web.xml//对ActionServlet类进行配置,web所使用的标签库的位置以及Structs配置文件位置。
1<!DOCTYPE……………………………..>/DTD对该xml文档的格式进行定义,如果下面的xml格式
2不符合该定义,就会报错。
3<web-app>
4 <servlet>
5 <servlet-name>action</servlet-name>
6 <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>//
7 <init-param>
8 <param-name>config</param-name>
9 <param-value>/WEB-INF/struts-config.xml</param-value>//struts配置文件所在的位置
10 </init-param>
11 <load-on-startup>1</load-on-startup>//web容器启动时候的加载顺序,数字越小加载越早
12 <servlet>
13
14 <servlet-mapping>//定义ActionServlet所要处理的url
15 <servlet-name>action</servlet-name>
16 <url-pattern>*.do</url-pattern>//*是通配符,即所有以.do请求的都被拦截
17 </servlet-mapping>
18
19 <welcome-file-list>//欢迎页面,即我们只需要在浏览器输入ip:port/web应用,index.jsp就会被请求
20 <welcome-file>/index.jsp</welcome-file>
21<taglib>//<taglib-url>指定标签库的相对或绝对URL,WEB应用将根据这一URL来访问标签库
22<taglib-uri>/WEB-INF/struts-bean-tld</taglib-ri>
23<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>//标签库所在的位置
21 </welcome-file-list>
22 </web-app>
上面的标签库和欢迎界面路径是相对于web应用的根目录。
二、Struts-conf.xml文件。
其中的<form>中的type的路径是,如果是自己写的form就是相对于classes下的文件所在包名+类名。如写一个HelloFrom.java.packege hello。ant编译在WEB-INF/classes/下,则引用时候写type=“hello.HelloFrom“,不用写成WEB-INF/classes/了。
同理action的type也是类似写法。
Action中的path写的是相对于web项目根目录。如我写一个myproject放在webapps中。我把java文件编译后放在myproject/WEB-INF/classes目录下。在myproject/jsp/1/my.jsp.中有一个From表单请求
<from action=”../hello.action”>………………</from>。//在.jsp,.html中填写的路径有关的都是相对于该jsp所在路径。像这个就是my.jsp所在目录上一级目录,因为用../。请求url是jsp/hello.action。不用写myproject/jsp/hello.action了。
下面讲一下struct-conf.xml文件。
第一是。<from-beans><form-bean name=”HelloForm”type=”hello.HelloForm/”></form-beans>。由hello.HelloForm进行处理用户提交的信息。不一定是通过form标签提交的。可以是<href=”../hello.action/username=’123’“>提交的username信息。在hello.HelloForm中的变量名必须和表单中input的id或name一级<herf>中的变量相同,并且在自己写的hello.HelloForm要实现set和get一级reset和validate方法。
第二是。<action path=”/jsp/hello” type=”hello.HelloAction” name=”HelloForm” scope=”request” validate=”true”
//parameter=”method”
>
<forward name=”SayHello”path=”/hello.jsp”>
Path是响应的url请求,即路径为/jsp/hello.action的被拦截了。Name是对url提交的请求数据进行处理,type是具体的action。Scope是HelloForm的变量生存周期,validate是true执行validate方法。在action类中通过调用ActionMapping mapping.findForward(“SayHello”)就跳转到hello.jsp中页面。
第三、多动作action。一个action只能有一个excute函数。这样太麻烦了。我们可以通过hello extends DispatchAction方式来实现多动作action。
步骤是:1,在form表单提交时候<hidden>提交一个name=”method”(随便写) value=”login“
2,在struts-conf.xml中配置action时候加一个parameter属性,如parameter=”method“(和form中的相同)
3,写action类的时候不是extends Action了,而是extends DispatchAction。然后将extute变成 login。如果有多个value,则写多个方法,从而实现多动作Action。
Action是整个其所在web应用所公用的,即创建一次,不过其方法是多线程调用的。
即上面写的HelloAction一旦创建就放在缓存里了,这我整个myproject所公用。但是其方法extute是多线程调用。