云服务器

商务合作:179001057@qq.com

配置struts应用

xiaoxiao2021-11-25  14


某平台价值19860元的编程课程资料免费领取【点我领取】


配置Struts应用 Struts应用采用两个基于XML的配置文件来配置应用。这两个配置文件为web.xml和struts-config.xml。web.xml实用于所有的JavaWeb应用,它是Web应用的发布描述文件,在Java Servlet规范中对它作了定义。对于Struts应用,在web.xml文件中除了配置Java Web应用的常规信息,还应该配置和Struts相关的特殊信息。 Strus-config.xml文件是Struts应用专有的配置文件,事实上,也可以根据需要给这个配置文件起其他的文件名。 Web应用的发布描述文件 Web应用的发布描述文件可以在应用开发者、发布者和组装者之间传递配置信息。Web容器在启动时从该文件中读取配置信息,根据他来装载和配置Web应用。 所有和Servlet2.3规范兼容的Servlet容器支持以下发布信息:  初始化参数  Session配置  Servlet声明  Servlet映射  应用生命周期的监听类  过滤器定义和映射  MIME类型映射  欢迎文件列表  出错处理页面 当Web应用的JSP文件使用了客户化标签,或者Web容器作为J2EE应用服务器的一部分是,还需要配置以下两个元素:  标签库映射  JNDI引用 Web应用发布描述文件的文档类型定义(DTD) 文档类型定义(DTD,Document Type Definition)对XML文档的格式作了定义。DTD把XML文档(包括Web应用的发布描述文件和Struts配置文件)都划分为以下组件:  元素  属性  实体 每一种XML文档都有独自的DTD文件,2.3版本的Web应用发布描述文件的DTD可以从http://java.sun.com/dtd/index.html上下载。 下面的DTD代码定义了Web应用发布描述文件顶层元素<web-app>: <!ELEMENT web-app(icon?,display-name?,description?, Distribuable?,context-param*,filter*,filter-mapping*, Listener*,servlet*,servlet-mapping*,session-config?, mime-mapping*,welcome-file-list?,error-page*,taglib*, resource-env-ref,resource-ref*,secuity-constraint*,login-config?, security-role*,env-entry*,ejb-ref*,ejb-local-ref*) > <web-app>元素是web.xml的根元素,其他元素(即以上DTD代码中括号以内的元素)必须嵌入在<web-app>元素以内。在上面的DTD代码中,还使用了一系列的个特殊符号来修饰元素,下表对这些符号的作用做了说明。 提示: 子元素之间的顺序由他们在父元素中出现的先后顺序决定。例如:在<web-app>父元素中,<servlet>元素必须出现在<servlet-mapping>元素的前面,<servlet-mapping>元素必须出现在<taglib>元素的前面。 DTD中特殊符号的作用 符 号 含 义 无符号 该子元素在父元素内必须存在且只能存在一次 + 该子元素在父元素在内必须存在,可以存在一次或多次 * 该子元素在父元素中可以不存在,或者存在一次或者多次,它是比较常用的符号 ? 该子元素在父元素内可以不存在,或者只存在一次。它是比较常用的符号 为Struts应用配置web.xml文件 web.xml文件对于配置任何Java Web应用都是必须的。当配置Struts应用时,还应该在web.xml文件中配置和Struts相关的配置选项。本节讲述配置Struts应用的必要步骤。 配置Struts的Actionservlet 首先同时也是最重要的一步是配置ActionServlet。在web.xml中配置ActionServlet有2个步骤。第一步是用<servlet>元素声明ActionServlet. <servlet>元素的DTD定义如下: <! ELEMENT servlet (icon?,servlet-name,display-name?,description?, (servlet-class|jsp-file),init-param*,load-on-startup?, run-as?,security-role-ref*) > 在以上<servlet>的子元素中,经常用到的有<servlet-name>、<servlet-class>和<init-param>。其中,<servlet-name>元素用来定义Servlet的名称,<servlet-class>元素用来指定Servlet的完整类名。以下是声明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/HelloWord.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。 声明ActionServlet的初始化参数 初始化参数用来对Servlet的运行时环境进行初始配置。<servlet>的<init-param>子元素用于配置Servlet初始化参数,例如: <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.actions.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>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> 配置欢迎文件清单 当客户访问Web应用时,如果仅仅给出Web应用的RootURL,没有指定具体的文件名,Web容器会自动调用Web应用的欢迎文件。<welcome-file-list>元素用来设置欢迎文件清单。以下代码声明了两个欢迎文件:welcome.jsp和index.jsp。 <welcome-file-list> <welcome-file>welcome.jsp</welcome-file> <welcome-file>login.jsp</welcome-file> </welcome-file-list> <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。首先,在Struts配置文件中为被调用的Action创建一个全局的转发项,例如: <global-forwards> <forward name=”welcome” path=”HelloWorld.do”/> </global-forwards> 然后创建一个名叫welcome.jsp的jsp文件(也可以采用其他文件名),当该页面被加载时,他把请求转发给以上<forward>元素指定的Action。Welcome.jsp的代码如下: <%@tablib uri=”/WEB-INF/struts-logic.tld” prefix=”logic” %> <html> <body> <logic:forward name=“welcome”/> </body> </html> 最后在web.xml文件中把welcome.jsp文件配置为欢迎文件,代码如下: <welcome-file-list> <welcome-file>welcome.jsp</welcome-file> </welcome-file-list> 配置错误处理 尽管Struts框架提供了强大的通用错误处理机制,但不能保证处理所有的错误或异常。当错误发生时,如果Struts框架不能处理这种错误,就会把错误抛给Web容器。在默认情况下,Web容器会向用户浏览器返回原始错误信息。如果想避免直接让用户看到原始错误信息,可以在Web应用的发布描述文件中配置<error-page>元素。以下代码演示了如何使用<error-page>元素来避免让用户直接看到HTTP 404 或HTTP 500错误。 <error-code>404</error-code> <location>/error/error_404.htm</location> </error-page> <error-page> <error-code>500</error-code> <location>/error/error_500.htm</location> </error-page> 如果在web.xml文件中作了以上配置,当Web容器捕获到HTTP 404或500错误时,将根据错误代码检索<error-page>元素,如果有匹配项,就放回<loation>子元素指定的文件。例如:404错误发生将返回404.htm网页。 也可以为Web容器捕获的Java异常配置<error-page>元素,这时需要设置<exception-type>子元素,它用于指定Java异常类。Web容器可能捕获如下异常:  RuntimeException或Error  ServletExeption或它的子类  IOException或它的子类 在<exception-type>元素中声明的Java异常类必须是以上列举的情况之一。以下代码演示了如何配置ServletExceptio异常和IOException: <error-page> <exception-type>java.lang.NullPointerException</exception-type> <location>/error/error_npe.htm</location> </error-page> <error-page> <exception-type>javax.servlet.ServletException</exception-type> <location>/noRegister.html</location> </error-page> 如果在web.xml文件中作了以上配置,当Web容器捕获到ServletException或IOException异常时,将根据异常类型检索<error-page>元素,如果有匹配项,就返回<location>子元素指定的文件。例如,如果发生ServletExceptio异常,将返回noRegister.html网页。 配置文件 Struts框架在启动时会读入其配置文件,根据它来创建和配置各种Struts组件。Struts配置文件使得开发者可以灵活的组装和配置各个组件,提高了应用软件的可扩展性和灵活性,可以避免硬编码。Struts配置文件是基于XML的,相应的DTD文件为struts-config_1_2.dtd。 org.apache.struts.config包 在Struts1.1种加入了org.apache.struts.config包。在Struts应用启动时,会把Struts配置文件中的配置信息读入到内存中,并把他们存放在config包中相关JavaBean类的实例中。 下图为org.apache.struts.config包中主要类框架图。 Org.apache.struts.config包中的每一个类都和Struts配置文件中特定的配置元素对应,例如,<action>元素和ActionMapping类对应,<forward>元素和ActionForWard类对应。由于一个<action>元素可以包含多个<forward>子元素,因此Actionmapping类和Actionforward类之间存在一堆多的关联关系。 当Struts框架完成了对配置文件的验证和解析后,就把配置文件中的信息存放在这些类的实例中。这些类的实例可以充当配置信息的运行时容器,Struts组件可以方便的通过它们来获取配置信息。 Org.apache.struts.config.ModuleConfig在Struts框架中扮演了十分重要的角色。如上图所示,它是整个orgapache.struts.config包核心,在Struts应用运行时用来存放整个Struts ModuleConfig和Struts配置文件的根元素<struts-config>对应。<struts-config>根元素中包含<form-bean>、<action>和<forward>等一系列子元素,因此ModuleConfig中包含了每个子元素对应的配置类实例。在ModuleConfig的实现类ModuleConfigImp中定义了如下成员变量: protected HashMap actionConfigs =null; protected HasMap dataSources =null; protected HasMap exceptions =null; protected HasMap formBeans =null; protected HasMap forwards =null; protected HasMap messageResources =null; protected AyyayList plugIns =null; protected controllerConfig controllrconfig =null; orgapache.struts.config.configRuleSet类的功能不同于其他类,它包含了解析Struts配置文件所需要的一组规则。在应用启动时,该类负责构造org.apache.struts.config包中其他用于保存配置信息的JavaBean类的实例。 下面分别介绍Struts配置文件中每个元素的用法。 <struts-config>元素 <struts-config>元素是Struts配置文件的根元素,和他对应得配置类为org.apache.struts.config.ModuleConfig类。<struts-config>元素有8个子元素,他的DTD定义如下: <!ELEMENT struts-config(data-sources?,form-beans?,global-exceptions?,global-forwards?,Action-mappings?,controller?,message-resources*,plug-in*) > 在Struts配置文件中,必须按照以上DTD指定的先后顺序来配置<struts-config>元素的各个子元素,如果颠倒了这些子元素在配置文件中的顺序,在Struts应用启动时会生成如下图所示的XML解析错误。 <data-sources>元素 <data-source>元素用来配置应用所需要的数据源。数据源负责建立和特定数据库的连接,许多数据源采用连接池机制实现,以便提高数据库访问性能。Java语言提供了javax.sql.DataSource接口,所有的数据源必须实现该接口。许多应用服务器和Web容器提供了内在的数据源组件,很多数据库厂商业提供了数据源的实现。下图,表现了Web应用通过数据源访问数据库的过程。 <data-sources>元素包含零个、一个多个<data-source>子元素。<data-source>元素用于配置特定的数据源,它可以包含多个<set-property>子元素。<set-property>元素用于设置数据源的各种属性。下面的代码演示了如何在Struts配置文件中配置数据源: <data-source> <data-source type=”org.apache.commons.dbcp.BasicDataSource”> <set-property property=”autoCommit” value=”true”/> <set-property property=”description” value=”MySQL Data Source”/> <set-property property=”driverClass” value=”com.mysql.jdbc.Driver”/> <set-property property=”maxCount” value=”10”/> <set-property property=”minCount” value=”2”/> <set-property property=”user” value=”root”/> <set-property property=”password” value=””/> <set-property property=”url” value=”jdbc:mysql://localhost:3306/mydatabase”/> </data-source> </data-sources> 以上代码使用<data-source>元素配置了MySQL数据库的连接。<data-source>元素的type属性用来指定数据源的实现类。以上代码使用的是Apache软件组织提供的DBCP数据源。开发者应该根据实际应用的需要来选用合适的数据源实现。下表列出了集中比较流行的数据源实现。 可以选则的数据源实现 名称 供应商 URL Poolman 开发源代码软件 http://sourceforge.net/projects/poolman Expresso Jcorporate http://www.jcorporate.com JDBC Pool 开放源代码软件 http://www.bitmechanic.com/jdbcpool/ DBCP Jakata http://jakata.apache.org/commons/index.html 配置了数据源后,就可以在Action类中访问数据源。在org.apache.struts.action.Action类中定义了getDataSource(HttpRequest)方法,他用于获取数据源对象的引用。以下程序代码演示了如何在Action类中访问数据源: Public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse reponse) thows Exception { javax.sql.DataSource dataSource; javax.sql.Conntion myConnection; try{ dataSource = getDataSource(request); myConnection = dataSource.getConection(); }catch(SQLException sqle){ getServlet().log(“Connection.process”,sqle); }finally{ try{ myConnection.close(); }catch(SQLException e){ getServlet().log(“Connection.close”,e); } } } 也可以在配置文件中声明多个数据源,此时需要为每一个数据源分配唯一的key值,通过key值来表示特定的数据源。例如: <data-source> <data-source key=”A” type =”org.apache.commons.dbcp.BasicDataSource”> …属性和前面的配置一样 … </data-sourde> <data-source key=”B” type=”org.apache.commons.dbcp.BasicDataSource”> …属性和前面的配置一样 … </data-source> … </data-sources> 在Action类中通过以下访问特定的数据源: dataSourceA = getDataSource(request,”A”); datasourceB = getDataSource(request,”B”); <form-beans>元素 <form-bean>元素用来配置多个ActionForm Bean。<form-beans>元素包含零个或多个<form-bean>子元素。每个<form-bean>元素又包含多个属性,下表对<form-bean>元素的主要属性作了说明。 <form-bean>元素的属性 属 性 描 述 className 指定和<form-bean>元素对应的配置类,默认值为org.apache.struts.config.FormBeanConfig。如果在这里设置自定义的类,该类必须扩展FormBeanConfig类 name 指定该ActionFormBean的唯一标识符来引用这个bean。该属性是必须的 type 指定ActionForm类的完整类名,该属性是必须的 提示:在配置<form-bean>元素的type属性是必须给出ActionForm类的完整类名,即应该把类的包名也包含在内。 以下是代码示例: <form-beans> <form-bean name=”lognForm” type=”myTest.forms.LogonForm”/> </form-beans> 如果配置动态ActionForm Bean,还必须配置<form-bean>元素的<form-property>子元素。<form-property>元素用来指定表单字段,他有四个属性,如表所示。 <form-property>元素属性 属 性 描 述 className 指定和<form-property>元素对应的配置类,默认值为org.apache.struts.config.FormPropertyConfig initial 以字符串的形式设置表单字段的初始值,如果没有设置该属性,则基本类型的表单字段的默认值为0,对象类型的表单字段默认值为null name 指定表单字段的名字。该属性是必须的 type 指定表单字段的类型。如果表单字段为java类,必须给出完整的类名。该属性是必须的 下面代码演示了如何使用<form-property>元素来配置动态ActionForm Bean: <form-bean name=”userForm” type=”org-apache.sturts.action.DynaActionForm”> <form-property name=firstname” type=”java.lang.String”/> <form-property name=”age” type=”java.lang.Interger” initial=”18”/> </form-bean> <global-exceptions>元素 <global-exceptions>元素用于配置异常处理。<global-exceptions>元素可以包含零个或者多个<exception>元素。 <exception>元素用来设置Java异常和异常处理类org.apache.struts.apache.ExceptionHandler之间的映射。下表对<exception>元素的属性作了说明。 <exception>元素的属性 属 性 描 述 className 指定和<exceptin>元素对应的配置类。默认值为org.apache.struts.config.ExceptionConfig handler 指定异常处理类。默认值为org.apache.struts.action.ExceptionHandler key 指定在Resource Bundle中描述该异常来的消息key path 指定当异常发生时的转发路径 scope 指定ActionMessage实例的存放范围,可选值包括request和session。此项的默认值为request type 指定所需要处理的异常类的名字,此项是必须的 bundle 指定Resource Bundle 以下是配置global-exception>元素的示例: <global-exceptions> <exception key=”global.error.invalidlogin” path=”/security/signs.jsp” scope=”request.jsp” type=”mywebshop.exceptions.InvalidLoginException”/> </global-exceptions> <golbal-forwards>元素 <global-forwords>元素用来声明全局转发关系。<global-forwards>元素有零个或者多个多个<forward>组成。<forward>元素用于把一个逻辑名映射到特定的URL。通过这种方式,Action类或者JSP文件无需指定实际的URL,只要指定逻辑名就能实现请求转发或者重定向,这可以减弱控制组件和试图组件之间耦合,并且有助于维护JSP文件。下图演示了如何通过<forword>元素来实现Web组件之间的相互转发. 对<forward>元素的属性作了描述 属 性 描 述 className 和<forward>元素对应的配置类,默认值为org.appache.struts.action.ActionForward contextRelative 如果此项为true,表示path属性以”/”开头时,给出的是相对上下文的URL。此项的默认值是false Name 转发路径的逻辑名,此项是必须的 Path 转发或重定向的URL,此项是必须的。必须以“/”开头 Redirect 此项为true是,表示重定向 controller元素 <controller>元素用于配置ActionServlet,下表对<controller>元素的属性做了描述。 <set-property>属性 属性 描述 bufferSize 指定上载文件的输入缓冲的大小。该属性为可选项,默认值为4096 className 指定<controller>元素对应的配置类。默认值为org.apache.struts. config.ControllerConfig 。 contentType 指定响应结果的内容类型和字符编码。该属性为可选项,默认值为text/html 。 如果在Action和JSP网页中也设置了内容类型和字符编码,将会覆盖该设置。 locale 指定是否把Locale 对象保存到当前用户的Session 中。默认值为false 。 processorClass 指定负责处理请求的类的完整类名。默认值为org. apache.struts.action.RequestProcessor。如果把此项设置为自定义的类,那么应该保证该类扩展了org. apache.struts.action.RequestProcessor类。 tempDir 指定处理文件上载的临时工作目录。如果此项没有设置,将采用Servlet容器为Web应用分配临时工作目录。 nochache 如果为true,在响应结果中将加入特定的头参数:Pragma,Cache-Control和Expires,防止页面被存储在客户浏览器的缓存中。默认值为false。 如果应用包含多个子应用,可以在每个子应用的struts配置文件中配置<controller>元素。这样,尽管这些子应用共享同一个ActionServlet对象,但是它们可以使用不同的RequestProcessor类。 以下是<controller>元素的配置代码示例: <controller contentType=”text/html; charset=UTF-8” locale=”true” processorClass=”CustomRequestProcessor”/> message-resources元素 < message-resources >元素用来配置Resource Bundle,Resource Bundle用于存放本地化消息文本。下表对< message-resources >元素的属性做了描述。 < message-resources >属性 属性 描述 className 和<message-resources>元素对应的配置类。默认值为org.apache.struts. config.MessageResourcesConfig factory 指定消息资源的工厂类。默认值为org. apache.struts.util.PropertyMessageResourcesFactory 类。 key 指定Resource Bundle 存放在ServletContext 对象中时采用的属性key 。默认值为由Globals. MESSAGES_KEY 定义的字符串常量。只允许有一个Resource Bundle 采用默认的属性key 。 null 指定MessageResourcs 类如何处理未知的消息key 。如果此项为true ,将返回空字符串。如果此项为false ,将返回类似“???global.label. missing ???”的字符串。该属性为可选项,默认值为true 。 parameter 指定Resource Bundle的消息资源文件名。例如,如果此项设为“pack1.pack2.ApplicationResources”,那么对应的实际资源文件的存放路径为:WEB-INF/classes/padk1/pack2/ ApplicationResources.properties。 以下是< message-resources >元素的配置代码示例,第一个元素采用默认的key 属性,表示默认的Resource Bundle。同一个配置文件只允许有一个默认的Resource Bundle,所以第二个元素必须显示地设置key 属性: < message-resources null=”false” parameter=”defaultResources ”/> < message-resources key=”images ” null=”false” parameter=” imageResources ”/> 许多Struts 客户化标签都通过bundle 属性来指定Resource Bundle,标签的bundle属性和< message-resources >元素的key 属性匹配,例如: <bean: message key=”msgKey”/> <bean: message key=”msgKey”bundle =”images”/> 在以上代码中,第一个<bean: message>标签没有指定bundle 属性,表示从默认的Resource Bundle中读取消息文本,第二个<bean: message>标签的bundle 属性为”images ”,它和key 属性为”images ”的< message-resources >元素匹配。 plug-in元素 <plug –in >元素用于配置struts插件。下表对< plug –in >元素的属性做了描述。 <plug –in >属性 属性 描述 className 指定struts插件类。插件类必须实现org. apache.struts. action. pluIn 接口。 <plug –in>元素可以包含零个或多个<set-property>子元素。以下是<plug –in>元素的配置代码示例: <plug –in className=” org. apache.struts. Validator. ValidatorPlugIn”> <set-property Property=”pathnames” Value=”/WEB-INF/validator-rules.xml, /WEB-INF/validation.xml ”/> </plug –in> 以上代码配置了ValidatorPlugIn插件,它用于初始化Validator验证框架。 相关资源:Struts 原理 与 应用