`
zyc1006
  • 浏览: 133824 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

dwr+struts2

阅读更多

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种方式:

 

Xml代码   收藏代码
  1. <filter-mapping>  
  2.     <filter-name>struts2</filter-name>  
  3.     <url-pattern>/*</url-pattern>  
  4. </filter-mapping>  


Xml代码   收藏代码
  1. <filter-mapping>  
  2.     <filter-name>struts2</filter-name>  
  3.     <url-pattern>*.action</url-pattern>  
  4. </filter-mapping>  
  5. <filter-mapping>  
  6.     <filter-name>struts2</filter-name>  
  7.     <url-pattern>*.jsp</url-pattern>  
  8. </filter-mapping>  


那么这两种方式的配置,究竟有什么差别呢? 
首先,假如配置方式是*.action的话,一般应当同时配置*.jsp,因为如果不通过action而直接访问jsp页面的话,Struts2标签在解析的时候会获取当前线程ThreadLocal中的Dispatcher。而Dispatcher是在Struts过滤器中预设的。代码如下: 

Java代码   收藏代码
  1. public static ValueStack getStack(PageContext pageContext) {  
  2. HttpServletRequest req = (HttpServletRequest) pageContext.getRequest();  
  3. ValueStack stack = (ValueStack) req.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);  
  4. if (stack == null) {  
  5.     HttpServletResponse res = (HttpServletResponse) pageContext.getResponse();  
  6.     Dispatcher du = Dispatcher.getInstance();  
  7.     if (du == null) {  
  8.         throw new ConfigurationException("The Struts dispatcher cannot be found.  This is usually caused by "+  
  9.         "using Struts tags without the associated filter. Struts tags are only usable when the request "+  
  10.         "has passed through its servlet filter, which initializes the Struts dispatcher needed for this tag.");  
  11.     }  
  12.     //略...  



除了为当前线程预设Dispatcher以外,Struts2对“/*”的请求,在完成普通的“*.action”过滤的基础上,另外提供2点功能: 
第1点用于访问classpath中特定的静态资源; 
第2点支持无后缀名的Action请求; 
Struts2的标签有时候需要某些CSS、JS文件的支持,比如<s:head/>标签,可能就转换成: 

Jsp代码   收藏代码
  1. <link rel="stylesheet" href="/demo/struts/xhtml/styles.css" type="text/css"/>  
  2. <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); 
上面所说的特定包,是指在 

Xml代码   收藏代码
  1. <filter>  
  2.     <filter-name>struts2</filter-name>  
  3.     <filter-class>  
  4.     org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  
  5.     </filter-class>  
  6.     <init-param>  
  7.         <param-name>packages</param-name>  
  8.         <param-value>eee</param-value>  
  9.     </init-param>  
  10. </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可以访问的原因。 

具体的,看一下下面的代码就明白了: 

Java代码   收藏代码
  1. //Struts2默认将“*.action”或者无后缀的URL当做Action  
  2. protected List<String> extensions = new ArrayList<String>() {{ add("action"); add("");}};  
  3. protected String dropExtension(String name, ActionMapping mapping) {  
  4. if (extensions == null) {  
  5.     return name;  
  6. }  
  7. for (String ext : extensions) {  
  8.     if ("".equals(ext)) {  
  9. // This should also handle cases such as /foo/bar-1.0/description. It is tricky to distinquish /foo/bar-1.0 but perhaps adding a numeric check in the future could work  
  10. // request uri如果不包含扩展名的话,则匹配此情况  
  11.         int index = name.lastIndexOf('.');  
  12.         if (index == -1 || name.indexOf('/', index) >= 0) {  
  13.             return name;  
  14.         }  
  15.     } else {  
  16.         String extension = "." + ext;  
  17.         if (name.endsWith(extension)) {  
  18.             name = name.substring(0, name.length() - extension.length());  
  19.             mapping.setExtension(ext);  
  20.             return name;  
  21.         }  
  22.     }  
  23. }  
  24. return null;  
  25. }  


那么,怎么解决此问题呢? 
有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+Struts+spring+hibernate的订货系统,自己添加的dwr功能

    web开发实例(DWR+Struts2)

    【标题】"Web开发实例(DWR+Struts2)"揭示了一个综合性的Web应用程序开发案例,其中结合了Direct Web Remoting (DWR) 和Struts2框架。DWR是一种JavaScript库,它允许在浏览器和服务器之间进行实时、异步的通信,从而...

    用户注册和登录是每个系统的必须存在的一部分,基于Dwr+Struts2+Spring+Hibernate写了一个用户登录注册系统

    用户注册和登录是每个系统的必须存在的一部分,基于Dwr+Struts2+Spring+Hibernate写了一个用户登录注册系统。  其中用Dwr去进行用户注册的用户是否存在的验证。  全部业务控制交由Spring去进行处理。事务处理也...

    dwr+struts2+jpa推送完整实现

    在IT行业中,构建高效、实时的Web应用是关键任务之一,而"DWR+Struts2+JPA推送完整实现"的组合就是一种解决方案,旨在提供动态的、交互式的用户界面和可靠的后台数据处理。这个标题涉及到三个核心的技术:Direct Web...

    EXT + DWR + Struts + Hibernate + Spring Demo

    2. **Direct Web Remoting (DWR)**:DWR允许在浏览器和服务器之间进行实时的Ajax通信,简化了JavaScript与Java之间的交互。通过DWR,开发者可以在客户端直接调用服务器端的方法,而无需手动处理XMLHttpRequest对象。...

    dwr+struts+hibernate+jquery tomcat日志查询系统

    【标题】"dwr+struts+hibernate+jquery tomcat日志查询系统"是一个基于Web的应用程序,主要用于实时、高效地查询Tomcat服务器的日志内容,并且具备分页功能,提供良好的用户体验。这个系统整合了多个技术框架,下面...

    dwr+spring+struts+hibernate(1)

    dwr+spring+struts+hibernate 整合在一起,代码写的不是很好,可以运行!

    Spring 2.0 + Struts 1.2 + Hibernate 3.2 + DWR 2.0 的JavaEE应用示例

    总结,该例示注释非常详细,演示Spring托管Hibernate和Struts的Action, 以及Spring的事务声明(包括1.x与2.x的用法)与非事务声明的使用方式。 使用DWR可以方便的使用Spring托管的持久层功能。 目的:希望广大Java...

    ssh整合例子(spring3 + struts2 + hibernate4+dwr+ext+json)

    内含 ext+dwr+freemark+jasperreort+ireport+echance+oscache+velocite等技术 展示例子:http://zz563143188.iteye.com/blog/1462413 若要下载chm格式请到http://user.qzone.qq.com/563143188 程序源码下载地址10MB...

    dwr+struts 三级菜单

    2. JavaScript调用`DWR`暴露的Java方法,传递当前选中的菜单ID。 3. Java方法通过`Struts`的动作映射,调用后台服务,查询与该ID相关的二级菜单数据。 4. 数据返回到前端,JavaScript根据接收到的数据更新二级菜单...

    DWR+jquery2.x+easyUI1.3.x开发富客户端应用

    1. **SSH+jQuery+DWR+EasyUI 实战**:本文档通过一系列的实战案例展示了如何将 Struts2、Spring3、Hibernate4 与 DWR、jquery2.x 和 easyUI1.3.x 结合起来开发实际的应用。 2. **实战案例详解**: - SSH 架构集成...

    JAR包+sql+oracle+dwr+jdom+ibatis+struts2

    总结来说,这个项目可能是一个使用Struts2作为MVC框架,Oracle作为数据库,iBatis作为持久层,DWR实现异步通信,JDOM处理XML数据,而所有组件和依赖被打包成JAR文件的Java Web应用程序。这样的架构设计能够提供高效...

    struts2+hibernate+spring+dwr整合

    Struts2、Hibernate、Spring 和 DWR 是四个在Java Web开发中非常重要的框架,它们各自在不同的领域提供了强大的功能,并且能够通过整合实现更高效、更灵活的应用开发。接下来,我们将详细探讨这些技术以及它们如何...

    DWR+Struts+Hibernate+Spring 三级联动菜单

    此项目结合了DWR(Direct Web Remoting)、Struts、Hibernate和Spring四大技术框架,旨在创建一个动态的三级联动菜单,通过Ajax实现数据的实时更新,提高用户体验。 首先,DWR是一个强大的JavaScript库,它允许...

    Dwr2+Struts2+Spring2+Hiberinate

    标题 "Dwr2+Struts2+Spring2+Hiberinate" 暗示了这是一个基于四个关键开源技术构建的Web应用程序示例。这个组合在几年前非常流行,用于开发高效、模块化的Java企业级应用。下面我们将深入探讨这些技术及其在用户管理...

    Ext+Dwr+Struts+Hibernate_进销存管理系统数据库完整

    本系统采用的技术栈包括Ext、Direct Web Remoting (DWR)、Struts以及Hibernate,这些技术都是Java Web开发中的重要组件。 Ext是一个基于JavaScript的UI框架,用于构建富客户端应用。它提供了大量的预定义组件,如...

    Ext+dwr+Hibernate+struts进销存管理系统终于完工(含源码)

    项目描述:本系统是一个典型的RIA风格进销存系统,采用Ext+dwr+Hibernate+struts技术实现。 系统功能模块: 1.基本信息管理:产品信息管理,客户信息管理,供应商信息管理。 2.销售管理:销售管理,与客户...

    spring+struts+hibernate+dwr+jstl_example.rar_JSTL example_dwr_dw

    标题中的"spring+struts+hibernate+dwr+jstl_example.rar"表明这是一个使用了Spring、Struts、Hibernate、Direct Web Remoting (DWR) 和JSP Standard Tag Library (JSTL)技术的示例项目。这个组合是Java Web开发中...

    DWR+spring+struts+hibernat整合登陆

    本项目"DWRSpringHibernateStrutsTest"就是一个典型的例子,它整合了Direct Web Remoting (DWR)、Spring框架、Struts框架以及Hibernate ORM工具,以创建一个登录系统。下面我们将详细探讨这些技术以及它们在项目中的...

    dwr2+struts2+spring2.5+hibernate3登陆网站

    这四个技术是Direct Web Remoting 2 (DWR2),Struts2,Spring 2.5,以及Hibernate 3,它们在Web开发领域中都有各自的专长和用途。 DWR2 是一个JavaScript库,允许Web应用程序实现实时的双向通信。它简化了浏览器与...

Global site tag (gtag.js) - Google Analytics