配置Struts的ActionServlet
web.xml文件对于配置任何Java Web 应用都是必须的。当配置Struts应用时,还应该在web.xml文件中配置和Struts相关的配置选项。
首先,同时也是最重要的一步是配置ActionServlet。在web.xml中配置ActionServlet有两个步骤。第一步是用<servlet>元素来声明ActionServlet。
<servlet-name>元素用来定义Servlet的名称
<servlet-class>元素用来定义指定的完整类型名。
以下是声明ActionServlet的代码:
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
</servlet>
配置ActionServlet的下一步为配置<servlet-mapping>元素,它用来指定ActionServlet可以处理哪些URL。以下代码对ActionServlet做了完整的配置:
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
这里应该注意的是,<servlet>元素中的<servlet-name>子元素必须和<servlet-mapping>元素中的<servlet-name>子元素匹配。以上代码的<url-pattern>属性为“*.do”,表明ActionServlet负责处理所有以“.do”扩展名结尾的URL。例如,如果用户请求的URL为http://localhost:8080/helloapp/HelloWorld.do,Web容器将把该请求转发给ActionServlet。
此外,还可以按以下方法设置<url-pattern>属性:
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>/do/*</url-pattern>
</servlet-mapping>
以上代码的<url-pattern>属性为“/do/*”,表明ActionServlet负责处理所有以“/do”为前缀的URL。例如,如果用户请求的URL为http://localhost:8080/helloapp/do/HelloWorld,Web容器将把该请求转发给ActionServlet。
提示
不管应用中包括多少子应用,都只需配置一个ActionServlet。有些开发者希望设置多个ActionServlet类来处理应用中不同的功能,其实这是不必要的,因为Servlet本身支持多线程。而且,目前的Struts框架只允许在应用中配置一个ActionServlet。
声明ActiongServlet的初始化参数
初始化参数用来对Servlet的运行时环境进行初始化配置。<servlet>的<init-param>子元素用于配置Servlet初始化参数,例如:
<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>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<init-param>子元素用于声明Servlet初始化参数,其格式以“参数名/参数值的形式成对出现。例如,以上代码为ActionServlet配置了初始化参数config,config参数是配置Struts的ActionServlet专有的,它用来设置Struts配置文件的相对路径。
配置欢迎文件清单
<welcome-file-list>
<welcome-file>welcome.jsp</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
当客户访问Web应用时,如果仅仅给出Web的Root URL,没有指定具体的文件名,Web容器就会自动调用Web应用的欢迎文件。<welcome-file-list>元素用来设置欢饮文件清单。上面代码声明了两个欢迎文件:welcome.jsp和index.jsp。
<welcome-file-list>元素中可以包含多个<welcome-file>子元素,当Web容器调用Web应用的欢迎文件时,首先寻找第一个<welcome-file>指定的文件。如果 这个文件存在,将把 这一个 文件返回给客户;如果这个文件不存在,Web容器将依次寻找 下一个欢迎文件,直到找到为止;如果<welcome-file-list>元素中指定的所有文件都不存在,服务器将向客户端返回“HTTP 404 Not Found”的出错信息。
由于在<welcome-file-list>元素中不能配置Servlet映射,因此不能直接把Struts的Action作为欢迎文件。但有方法可以实现在欢迎文件中调用Struts Action。(75页)
配置错误处理
当错误发生时,如果Struts框架不能处理这种错误,就把错误抛给Web容器。在默认情况下,Web容器会向用户浏览器直接返回原始的错误信息。如果想避免直接让用户看到原始的错误信息,可以在Web应用的发布描述文件中配置<error-page>元素。以下代码演示了如何使用<error-page>元素来避免让用户直接看到HTTP 404 或 HTTP 500错误。
<error-page>
<error-code>404</error-code>
<location>/common/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/common/500.jsp</location>
</error-page>
如果在web.xml文件中做了以上配置,当Web容器捕获到HTTP 404 或 HTTP 500错误时,将根据错误代码检索<error-page>元素,如果有匹配项,就返回<location>子元素指定的文件。例如,如果发生HTTP 404错误,将返回404.jsp网页。
也可以为Web容器捕获的Java异常配置<error-page>元素,这时需要设置<exception-type>子元素,它用于指定Java异常类。Web容器可能捕获如下异常:
RuntimeException
ServletException或它的子类
IOException或它的子类
在<exception-type>元素中声明的Java异常类必须是以上所列举的情况之一。以下代码演示了如何配置ServletException异常和IOException:
<error-page>
<exception-type>java.servlet.ServletException</exception-type>
<location>/common/system_error.jsp</location>
</error-page>
<error-page>
<exception-type>java.io.IOException</exception-type>
<location>/common/system_ioerror.jsp</location>
</error-page>
如果在web.xml文件中做了以上配置,当Web容器捕获到ServletException或IOException异常时,将根据异常类型检索<error-page>元素,如果有匹配项,就返回<location>子元素指定的文件。例如,如果发生ServletException异常,就放回system_error.jsp网页。
配置Struts标签库
Struts框架提供了一些实用的客户化标签库。如果在应用中使用了这些标签库,那么必须在Web应用发布描述文件中配置它们,配置元素为<taglib>。以下代码演示了如何使用<taglib>元素来配置客户化标签库:
<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>和<taglib-location>。 <taglib-uri>元素指定标签库的相对或者绝对URI地址,Web应用将根据这一URI来访问标签库;<taglib-uri>元素指定标签库描述文件在文件资源系统中的物理位置。
如果Web应用中没有使用Struts标签库,就没有必要在web.xml文件中配置它。此外也可以按上述方式在web.xml文件中配置用户自定义的客户化标签库,例如:
<taglib>
<taglib-uri>/WEB-INF/mytaglibs.tld</taglib-uri>
<taglib-location>/WEB-INF/mytaglibs.tld</taglib-location>
</taglib>