我配置了STRUTS两个应用模块 文件目录如下
/destiny (ces.jsp)
/destiny/WEB-INF (struts_config.xml admin.xml)
/destiny/manage
/destiny/manage/admin (login.jsp top.htm)WEB。XML配置如下 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>ainrio</display-name>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>com.ainrio.MyActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>config/manage/admin</param-name>
<param-value>/WEB-INF/admin.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<taglib>
<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
</web-app>
同时在 STRUTS——CONFIG。XML文件中有如下配置<struts-config>
<action-mappings>
<action forward="/ces.jsp" path="/test" />
<action path="/gonext" type="org.apache.struts.actions.SwitchAction" />
</action-mappings>
<message-resources parameter="ApplicationResources" />
</struts-config>ADMIN。XML配置如下
<struts-config>
<action-mappings>
<action forward="/top.htm" path="/next" />
</action-mappings>
<message-resources key="admin" parameter="admin" />
</struts-config>login.jsp文件如下:<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<bean:message key="login_welcome" bundle="admin" />
现存在如下问题
访问 :http://localhost:8080/destiny/test.do 正常
http://localhost:8080/destiny/manage/admin/next.do 正常
http://localhost:8080/destiny/gonext.do?prefix=/manage/admin&page=/login.jsp 正常
但是使用http://localhost:8080/destiny/manage/admin/login.jsp 却报错说找不到资源文件 错误提示如下 :
javax.servlet.ServletException: Cannot find message resources under key admin
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:848)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:781)
org.apache.jsp.manage.admin.login_jsp._jspService(org.apache.jsp.manage.admin.login_jsp:69)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)我想既然能够使用 http://localhost:8080/destiny/manage/admin/next.do 访问成功
那么 ADMIN。XML应该是成功的被解析了 但是为什么读属性文件却会出错呢?
STRUTS版本为1.2 我对多模块配置不是很了解 比如说使用
http://localhost:8080/destiny/gonext.do?prefix=/manage/admin&page=/login.jsp
这种方式切换到 子模块中后 是不是所有的请求都是按照子模块的XML配置文件去执行了? 还需要在每个请求前加上 prefix=/*&page=/* 吗?
/destiny (ces.jsp)
/destiny/WEB-INF (struts_config.xml admin.xml)
/destiny/manage
/destiny/manage/admin (login.jsp top.htm)WEB。XML配置如下 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>ainrio</display-name>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>com.ainrio.MyActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>config/manage/admin</param-name>
<param-value>/WEB-INF/admin.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<taglib>
<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
</web-app>
同时在 STRUTS——CONFIG。XML文件中有如下配置<struts-config>
<action-mappings>
<action forward="/ces.jsp" path="/test" />
<action path="/gonext" type="org.apache.struts.actions.SwitchAction" />
</action-mappings>
<message-resources parameter="ApplicationResources" />
</struts-config>ADMIN。XML配置如下
<struts-config>
<action-mappings>
<action forward="/top.htm" path="/next" />
</action-mappings>
<message-resources key="admin" parameter="admin" />
</struts-config>login.jsp文件如下:<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<bean:message key="login_welcome" bundle="admin" />
现存在如下问题
访问 :http://localhost:8080/destiny/test.do 正常
http://localhost:8080/destiny/manage/admin/next.do 正常
http://localhost:8080/destiny/gonext.do?prefix=/manage/admin&page=/login.jsp 正常
但是使用http://localhost:8080/destiny/manage/admin/login.jsp 却报错说找不到资源文件 错误提示如下 :
javax.servlet.ServletException: Cannot find message resources under key admin
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:848)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:781)
org.apache.jsp.manage.admin.login_jsp._jspService(org.apache.jsp.manage.admin.login_jsp:69)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)我想既然能够使用 http://localhost:8080/destiny/manage/admin/next.do 访问成功
那么 ADMIN。XML应该是成功的被解析了 但是为什么读属性文件却会出错呢?
STRUTS版本为1.2 我对多模块配置不是很了解 比如说使用
http://localhost:8080/destiny/gonext.do?prefix=/manage/admin&page=/login.jsp
这种方式切换到 子模块中后 是不是所有的请求都是按照子模块的XML配置文件去执行了? 还需要在每个请求前加上 prefix=/*&page=/* 吗?
解决方案 »
- 网页数据排序问题,帮忙修改
- JAVA 调出浏览文件窗口
- 今天去面试,被问到一些架构方面的问题不太清楚,望大家帮帮我????
- 一个简单 Iterator 的问题
- 如何用Java,jsp实现上传office文件,并以pdf格式在web上浏览,且只能打印
- 请问 在IE 中不能用 IP 访问局域网的其他机器 网上邻居可以 也可以ping 通过代理也可以上网
- smartupload升级处理?? 编译??在线等
- html中文问题!急!在线等!解决后马上结账!!!
- 我翻译的关于如何在jb6中编译servlet,初学者可以进来看看。
- 用Jspsmartupload来upload文件的(no stack trace available)问题
- struts多模块的配置问题...
- 求一个java代码的管理工具`!详情请进~!谢谢~!
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>config/xxx</param-name>
<param-value>/WEB-INF/xxx.xml</param-value>
</init-param>
这样写叫多模块,而
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml,/WEB-INF/xxx.xml</param-value>
</init-param>
就不是多模块了,如果有人建议你改成这样,千万别信,呵呵。为什么这么说,因为多模块的根本作用是让servlet容器(比如TOMCAT)给你的多个模块每个模块一个ServletContext,也就是说相当于你的程序是多个同时在运行。而第二种写法其实还是只有一个config。说的明白点,你有几个Struts config,就相当于有几个模块同时运行,而这样,方面不同的用户快速访问不同的模块。在来说为什么使用第一种写法后,你会出现各种个样的问题,比如转发出错。现在解决大家的疑问,首先/xxx跟xxx是一样的效果。都表示当前目录。
有的时候,你会发现这样写链接使正常的,而有的时候又不是正常的,比如:
有的时候这样要写<html:link action="xxx.do....,
而有的时候要这样<html:link action="yyy/xxx.do....
这是因为你的请求所在的路径发生了变法。比如你现点击<html:link action="yyy/xxx.do....
,进入了一个页面,然后你在点<html:link action="yyy/xxx.do....就会报错,因为此时你的页面上下文不一样了。此时你已经进入了yyy,所以你只需要点<html:link action="xxx.do....,就可以了。如果上述仍不能解决你的问题,你可能还要该你的struts 配置文件,在你的forword里加上contextRelative="true",如下:
<forward
name="updateDept"
path="/src_department/updateDept.jsp"
contextRelative="true" />设为true表示在路径属性中指定的资源,在路径以"/"字符起始情况下,应该被解释为与web应用程序相关。多试试吧,我也是试了一个通宵才搞定的。
-------------------------------
因为多模块的根本作用是让servlet容器(比如TOMCAT)给你的多个模块每个模块一个ServletContext,也就是说相当于你的程序是多个同时在运行。而第二种写法其实还是只有一个config,也就是说只有servlet容器只给了一个ServletContext给你的应用程序。说的明白点,你有几个Struts config,就相当于有几个模块同时运行,而这样,方面不同的用户快速访问不同的模块。
----------------------------------
兄弟,我说错了,杀了我吧。
纠正如下,ServletContext是只有一个的,但会创建多个ApplicationConfig对象。每个ApplicationConfig负责处理对应的模块,而且默认的配置文件对应的ApplicationConfig对象是最先被创建的,并不是我之前说的所有config对象同时被创建,
对不起啊,本人刚接触JAVA,接触J2EE刚1个多月,说错了,请大家与原谅。
现在把Sturt初始化过程说一下,是书上的原话,大家可以参考《jakarta struts编程》,Struts创始人推荐的书。
----------------------------------------
Sturts初始化过程取决于在web.xml文件中配置的初始化参数,servlet容器在首次启动或servlet的第一次请求到达时加载Struts ActionServlet。在这两种情况下,要保证init()方法被调用,并且必须在servlet处理任何请求之前完成。当init()被调用时,Struts框架包执行所有必要的初始化工作。,其步骤如下:1.初始化框架包的内部消息绑定。这些消息用来把信息,警告,和出错消息输出到日志文件。org.apache.struts.action.ActionResources绑定用来获得内部消息。
2.从web.xml文件加载控制ActionServlet类不同行为的初始化参数。这些参数包括config、debug、detail、convertNull。
3.从web.xml文件加载、初始化servlet名称和servlet映射信息。这些值将在提交HTML表单时,用于框架包输出正确的URL地址。在初始化过程中,框架包所使用的DTD会被注册。在下一步中DTD将用来验证配置文件。
4.加载、初始化默认应用程序的Struts配置数据,这些数据是配置初始化参数指定的。默认的Struts配置文件被解析,一个ApplicationConfig对象被创建并存储在ServletContext中。默认应用程序的ApplicationConfig对象和一个org.apche.struts.action.APPLICATION的值被存储在ServletContext中。
5.根据每个消息资源元素中指定的键属性,每个在默认应用程序的Struts配置文件中指定的消息源都将被加载、初始化并存储在ServletContext的适当位置。如果没有键被指定,消息源将存储在键值org.apche.struts.action.MESSAGE中。仅有一个消息源能当作默认值存储因为键值必须是唯一的。
6.在Struts配置文件中声明的每个数据源被加载和初始化。如果没有指定datasource元素,这一步将直接跳过。
7.加载并初始化在Struts配置文件中指定的每个插件。每个指定的插件都将调用init()方法。
8.一旦默认的应用程序正确的初始化,servlet init()方法将确定是否有应用程序模块被指定,如果有则对每一个模块重复第4歩到第7歩的步骤。
我正在深入学习Struts,不是学怎么用,而是学习它的内部机制,有共同兴趣的朋友可访问我的博客:http://www.blog.163.com/xiaoqulai/
大家一起探讨。我每天都会更新,希望大家给出意见。