<load-on-startup>1</load-on-startup>这个在web.xml里,平时很少注意的,今天发现还是得关注下他的
前段时间练习SSH的组合,结果以前写的代码运行很好的,就从Tomcat5 换到了Tomcat6就出问题 了,老是说找不到某 个bean,最终的就是修改了下上面的那个参数就OK 了
Tomcat加载一个web应用的时候,我们 在WEB-INF/目录里有可能放了很多是应用文件,但是web.xml才是javaee规范 了的标准配置文件,因此,很多 框架都是把自己的配置文件放在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>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>1</load-on-startup>
</servlet>
Struts把中心控制器放这了,<load-on-startup>1</load-on-startup>参数让这个先加载,eclipse默认生成的好象这个参数是0,结果当我把Spring集成进去的时候,由于我的struts-config.xml文件里配置是这样的
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<data-sources />
<form-beans >
<form-bean name="addRoleForm" type="cn.edu.ctgu.ghl.struts.form.AddRoleForm" />
<form-bean name="departmentForm" type="cn.edu.ctgu.ghl.struts.form.DepartmentForm" />
<form-bean name="employeeForm" type="cn.edu.ctgu.ghl.struts.form.EmployeeForm" />
<form-bean name="consumerForm" type="cn.edu.ctgu.ghl.struts.form.ConsumerForm" />
<form-bean name="wageForm" type="cn.edu.ctgu.ghl.struts.form.WageForm" />
</form-beans>
<global-exceptions />
<global-forwards >
<forward name="login" path="/login.jsp" />
<forward name="failure" path="/admin/failure.jsp" />
</global-forwards>
<action-mappings >
<action
attribute="addRoleForm"
input="/admin/addRole.jsp"
name="addRoleForm"
path="/admin/addRole"
scope="request"
>
<forward name="failure" path="/admin/failure.jsp" />
<forward name="success" path="/admin/listRole.jsp" />
</action>
<action
attribute="departmentForm"
input="/admin/deparment.jsp"
name="departmentForm"
parameter="action"
path="/admin/department"
scope="request"
type="cn.edu.ctgu.ghl.struts.action.DepartmentAction">
<forward name="failure" path="/admin/failure.jsp" />
<forward name="addDepartment" path="/admin/department.jsp" />
<forward name="updateDepartment" path="/admin/department.jsp" />
<forward name="updateSuccess" path="/admin/listDepartment.jsp" />
<forward name="listDepartment" path="/admin/listDepartment.jsp" />
<forward name="removeSuccess" path="/admin/listDepartment.jsp" />
<forward name="addSuccess" path="/admin/listDepartment.jsp" />
<forward name="noRight" path="/admin/failure.jsp" />
</action>
<action
attribute="employeeForm"
input="/admin/employee.jsp"
name="employeeForm"
parameter="action"
path="/admin/employee"
scope="request"
type="cn.edu.ctgu.ghl.struts.action.EmployeeAction" >
<forward name="addEmployee" path="/admin/employee.jsp" />
<forward name="listEmployee" path="/admin/listEmployee.jsp" />
<forward name="addEmployeeSuccess" path="/admin/success.jsp" />
<forward name="employeeInfo" path="/admin/employeeInfo.jsp" />
<forward name="updateEmployee" path="/admin/employee.jsp" />
<forward name="updateEmployeeSuccess" path="/admin/success.jsp" />
<forward name="noRight" path="/admin/failure.jsp" />
<forward name="searchEmployee" path="/admin/searchEmployee.jsp" />
<forward name="redeploy" path="/admin/redeploy.jsp" />
<forward name="attendance" path="/admin/attendance.jsp" />
</action>
<action
attribute="consumerForm"
input="/login.jsp"
name="consumerForm"
parameter="action"
path="/consumer"
scope="request"
type="cn.edu.ctgu.ghl.struts.action.ConsumerAction" >
<forward name="loginSucess" path="/index.jsp" />
<forward name="updatePassword" path="/updatePassword.jsp" />
</action>
<action
attribute="wageForm"
input="/admin/wage.jsp"
name="wageForm"
parameter="action"
path="/admin/wage"
scope="request"
type="cn.edu.ctgu.ghl.struts.action.WageAction" >
<forward name="addWage" path="/admin/wage.jsp" />
<forward name="listWage" path="/admin/listWage.jsp" />
<forward name="success" path="/admin/success.jsp" />
</action>
</action-mappings>
<!-- 这里的controller的作用是请求处理器,配置了controller就不必在每个action里设置type属性了 -->
<controller>
<set-property property="processorClass"
value="org.springframework.web.struts.DelegatingRequestProcessor" />
</controller>
<message-resources parameter="cn.edu.ctgu.ghl.struts.ApplicationResources" />
<!-- =======在这的配置也初始化一个Spring的bean容器,而且这个容器是以在ContextLoaderServlet里初始化的为父的,
所以这个容器里的bean可以访问ContextLoaderServlet里初始化容器里的bean======== -->
<plug-in
className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/action-servlet.xml" />
</plug-in>
</struts-config>
而在action-servlet.xml里的配置的bean要访问在web.xml里配置的bean ,web.xml里有contextConfigLocation,确定了Spring配置文件路径,/WEB-INF/webApplicationContext.xml,/WEB-INF/dataAccessContext.xml
这两个文件里的bean 应该可以认为是在同一个容器中的,而在struts-config.xml里配置的action-servlet.xml则是以这个容器为父容器的,也正是这样,所以在action-servlet.xml里配置的bean 才能够访问WEB-INF/webApplicationContext.xml,/WEB-INF/dataAccessContext.xml里配置的bean 的,如此说来要让action-servlet.xml里的bean 能访问到父容器里的bean ,那么WEB-INF/webApplicationContext.xml,/WEB-INF/dataAccessContext.xml这个里的bean就应该在action-servlet.xml里的bean 前加载。所以这里对较低版本的tomcat来说就得用<load-on-startup>0</load-on-startup>参数来控制加载顺序了,高版本的可以直接用
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
这也是推荐的方法
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/webApplicationContext.xml,/WEB-INF/dataAccessContext.xml
</param-value>
</context-param>
<!-- 注意,这个地方如果用 listener org.springframework.web.context.ContextLoaderListener老是出错,网上说好像和tomcat版本有关-->
<!-- tomcat5.523用listener org.springframework.web.context.ContextLoaderListener-->
<!--
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
-->
<!-- tomcat5.520用org.springframework.web.context.ContextLoaderServlet-->
<servlet>
<servlet-name>SpringContextServlet</servlet-name>
<servlet-class>
org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>