http://sswh.iteye.com/blog/756922
问题:
1、Struts2在web.xml中配置为“/*”和“*.action,*.jsp”的差别。
2、There is no Action mapped for namespace / and action name ...的问题。
分析(环境是Struts2.1.8.1):
Struts2过滤器的配置有2种方式:
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>*.action</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>*.jsp</url-pattern>
- </filter-mapping>
那么这两种方式的配置,究竟有什么差别呢?
首先,假如配置方式是*.action的话,一般应当同时配置*.jsp,因为如果不通过action而直接访问jsp页面的话,Struts2标签在解析的时候会获取当前线程ThreadLocal中的Dispatcher。而Dispatcher是在Struts过滤器中预设的。代码如下:
- public static ValueStack getStack(PageContext pageContext) {
- HttpServletRequest req = (HttpServletRequest) pageContext.getRequest();
- ValueStack stack = (ValueStack) req.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
- if (stack == null) {
- HttpServletResponse res = (HttpServletResponse) pageContext.getResponse();
- Dispatcher du = Dispatcher.getInstance();
- if (du == null) {
- throw new ConfigurationException("The Struts dispatcher cannot be found. This is usually caused by "+
- "using Struts tags without the associated filter. Struts tags are only usable when the request "+
- "has passed through its servlet filter, which initializes the Struts dispatcher needed for this tag.");
- }
-
除了为当前线程预设Dispatcher以外,Struts2对“/*”的请求,在完成普通的“*.action”过滤的基础上,另外提供2点功能:
第1点用于访问classpath中特定的静态资源;
第2点支持无后缀名的Action请求;
Struts2的标签有时候需要某些CSS、JS文件的支持,比如<s:head/>标签,可能就转换成:
- <link rel="stylesheet" href="/demo/struts/xhtml/styles.css" type="text/css"/>
- <script src="/demo/struts/utils.js" type="text/javascript"></script>
第1点功能带来的好处是可以把这些Struts2框架用到的CSS、JS文件打包在Struts2-core-***.jar文件中分发,使得Struts2的发布包对开发人员而言更加简洁。
下面看一下StrutsPrepareAndExecuteFilter是怎样实现的:
①将Dispatcher预设到线程的ThreadLocal变量上;
②对于Action请求,直接execute.executeAction(request,response,mapping);
③如果是/struts、或者/static开始的资源,则在classpath下查找特定的包下面的匹配资源;
④其他的所有资源(包括直接访问的JSP、以及其他静态资源)转交过滤器链的下一个环节处理:chain.doFilter(request, response);
上面所说的特定包,是指在
- <filter>
- <filter-name>struts2</filter-name>
- <filter-class>
- org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
- </filter-class>
- <init-param>
- <param-name>packages</param-name>
- <param-value>eee</param-value>
- </init-param>
- </filter>
中通过packages参数指定的包、以及 "org.apache.struts2.static template org.apache.struts2.interceptor.debugging static"这4个包。
由于packages可配置,从而,如果有自己的classpath上的资源需要访问,或者需要更改Struts本身的静态资源时,只要把Classpath下相应的package设置在过滤器的初始参数中即可(这一条看上去好像没什么用处)。
上面是使用/*时对静态资源的访问,那么使用*.action时如果需要的话,如何访问静态资源呢?
很简单,只要把需要用到的静态资源解压缩到WebContent/struts目录下即可。
第2点“支持无后缀名的Action请求”经常带来一些混乱,最典型的就是“/*”错误地拦截了其他的映射为无后缀名的Servlet请求。比如DWR、FCKEditor等都存在这种问题。
比如,当访问“/demo/dwr”时,正常情况应该显示当前系统中对外暴露的JS方法的列表,但在Struts2的默认配置下,却得到“There is no Action mapped for namespace / and action name dwr.”
又比如在默认配置下,访问http://localhost:8080/demo/hello.action
和访问http://localhost:8080/demo/hello这两者是等同的。
当然,也只有无后缀名的URL请求才会被Struts2当做是Action,这也是为什么/dwr无法访问,然而/dwr/interface.js可以访问的原因。
具体的,看一下下面的代码就明白了:
-
- protected List<String> extensions = new ArrayList<String>() {{ add("action"); add("");}};
- protected String dropExtension(String name, ActionMapping mapping) {
- if (extensions == null) {
- return name;
- }
- for (String ext : extensions) {
- if ("".equals(ext)) {
-
-
- int index = name.lastIndexOf('.');
- if (index == -1 || name.indexOf('/', index) >= 0) {
- return name;
- }
- } else {
- String extension = "." + ext;
- if (name.endsWith(extension)) {
- name = name.substring(0, name.length() - extension.length());
- mapping.setExtension(ext);
- return name;
- }
- }
- }
- return null;
- }
那么,怎么解决此问题呢?
有2种办法。
第1种很简单,在Struts.properties中定义:
struts.action.extension = action即可解决此问题。
Struts2缺省配置对应于:
struts.action.extension = action,(注意后面有个逗号)
第2种是在Struts.properties中设置:
struts.action.excludePattern = /dwr.*,/webEditor.*(注意,这儿是正则表达式,不是URL匹配模式,所以要写/dwr.*而不是/dwr/*)
这种写法应配置StrutsPrepareAndExecuteFilter,配置FilterDispatcher是无效的。
分享到:
相关推荐
DWR+Struts+spring+hibernate的订货系统,自己添加的dwr功能
【标题】"Web开发实例(DWR+Struts2)"揭示了一个综合性的Web应用程序开发案例,其中结合了Direct Web Remoting (DWR) 和Struts2框架。DWR是一种JavaScript库,它允许在浏览器和服务器之间进行实时、异步的通信,从而...
用户注册和登录是每个系统的必须存在的一部分,基于Dwr+Struts2+Spring+Hibernate写了一个用户登录注册系统。 其中用Dwr去进行用户注册的用户是否存在的验证。 全部业务控制交由Spring去进行处理。事务处理也...
在IT行业中,构建高效、实时的Web应用是关键任务之一,而"DWR+Struts2+JPA推送完整实现"的组合就是一种解决方案,旨在提供动态的、交互式的用户界面和可靠的后台数据处理。这个标题涉及到三个核心的技术:Direct Web...
2. **Direct Web Remoting (DWR)**:DWR允许在浏览器和服务器之间进行实时的Ajax通信,简化了JavaScript与Java之间的交互。通过DWR,开发者可以在客户端直接调用服务器端的方法,而无需手动处理XMLHttpRequest对象。...
【标题】"dwr+struts+hibernate+jquery tomcat日志查询系统"是一个基于Web的应用程序,主要用于实时、高效地查询Tomcat服务器的日志内容,并且具备分页功能,提供良好的用户体验。这个系统整合了多个技术框架,下面...
dwr+spring+struts+hibernate 整合在一起,代码写的不是很好,可以运行!
总结,该例示注释非常详细,演示Spring托管Hibernate和Struts的Action, 以及Spring的事务声明(包括1.x与2.x的用法)与非事务声明的使用方式。 使用DWR可以方便的使用Spring托管的持久层功能。 目的:希望广大Java...
内含 ext+dwr+freemark+jasperreort+ireport+echance+oscache+velocite等技术 展示例子:http://zz563143188.iteye.com/blog/1462413 若要下载chm格式请到http://user.qzone.qq.com/563143188 程序源码下载地址10MB...
2. JavaScript调用`DWR`暴露的Java方法,传递当前选中的菜单ID。 3. Java方法通过`Struts`的动作映射,调用后台服务,查询与该ID相关的二级菜单数据。 4. 数据返回到前端,JavaScript根据接收到的数据更新二级菜单...
1. **SSH+jQuery+DWR+EasyUI 实战**:本文档通过一系列的实战案例展示了如何将 Struts2、Spring3、Hibernate4 与 DWR、jquery2.x 和 easyUI1.3.x 结合起来开发实际的应用。 2. **实战案例详解**: - SSH 架构集成...
总结来说,这个项目可能是一个使用Struts2作为MVC框架,Oracle作为数据库,iBatis作为持久层,DWR实现异步通信,JDOM处理XML数据,而所有组件和依赖被打包成JAR文件的Java Web应用程序。这样的架构设计能够提供高效...
Struts2、Hibernate、Spring 和 DWR 是四个在Java Web开发中非常重要的框架,它们各自在不同的领域提供了强大的功能,并且能够通过整合实现更高效、更灵活的应用开发。接下来,我们将详细探讨这些技术以及它们如何...
此项目结合了DWR(Direct Web Remoting)、Struts、Hibernate和Spring四大技术框架,旨在创建一个动态的三级联动菜单,通过Ajax实现数据的实时更新,提高用户体验。 首先,DWR是一个强大的JavaScript库,它允许...
标题 "Dwr2+Struts2+Spring2+Hiberinate" 暗示了这是一个基于四个关键开源技术构建的Web应用程序示例。这个组合在几年前非常流行,用于开发高效、模块化的Java企业级应用。下面我们将深入探讨这些技术及其在用户管理...
本系统采用的技术栈包括Ext、Direct Web Remoting (DWR)、Struts以及Hibernate,这些技术都是Java Web开发中的重要组件。 Ext是一个基于JavaScript的UI框架,用于构建富客户端应用。它提供了大量的预定义组件,如...
项目描述:本系统是一个典型的RIA风格进销存系统,采用Ext+dwr+Hibernate+struts技术实现。 系统功能模块: 1.基本信息管理:产品信息管理,客户信息管理,供应商信息管理。 2.销售管理:销售管理,与客户...
标题中的"spring+struts+hibernate+dwr+jstl_example.rar"表明这是一个使用了Spring、Struts、Hibernate、Direct Web Remoting (DWR) 和JSP Standard Tag Library (JSTL)技术的示例项目。这个组合是Java Web开发中...
本项目"DWRSpringHibernateStrutsTest"就是一个典型的例子,它整合了Direct Web Remoting (DWR)、Spring框架、Struts框架以及Hibernate ORM工具,以创建一个登录系统。下面我们将详细探讨这些技术以及它们在项目中的...
这四个技术是Direct Web Remoting 2 (DWR2),Struts2,Spring 2.5,以及Hibernate 3,它们在Web开发领域中都有各自的专长和用途。 DWR2 是一个JavaScript库,允许Web应用程序实现实时的双向通信。它简化了浏览器与...