`
jsx112
  • 浏览: 314911 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Struts2在web.xml中配置为“/*”和“*.action,*.jsp”的差别

阅读更多

问题:
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可以访问的原因。

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

//Struts2默认将“*.action”或者无后缀的URL当做Action
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)) {
// 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
// request uri如果不包含扩展名的话,则匹配此情况
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是无效的。
在微博管家项目中,采用的是struts2.1.8,出现了jsp、js、css等文件加载失败等问题。通过以下配置解决:
struts.xml:
<constant name="struts.action.extension" value="" />
struts.properties:
struts.locale=zh_CN
struts.i18n.encoding=utf-8
struts.action.extension=,
struts.action.excludePattern = /js.*,/static.*(js和static文件夹是项目中js和css所在的目录)
分享到:
评论

相关推荐

    struts.xml和applicationContext.xml、web.xml的配置

    在Java Web开发中,`struts.xml`, `applicationContext.xml` 和 `web.xml` 是三个至关重要的配置文件,它们各自负责不同的职责,并协同工作来构建一个完整的应用框架。以下是关于这三个配置文件的详细说明。 首先,...

    在web.xml中配置action或.do

    随着技术的发展,虽然现代Web框架如Spring MVC等提供了更为灵活和强大的机制来管理这些操作,但了解如何在`web.xml`中配置action仍然是非常有用的,尤其是在维护旧项目或者特定场景下。 #### 三、配置步骤详解 ...

    struts.xml和struts.properties配置详解

    在Struts中,`struts.xml`和`struts.properties`文件是两个核心的配置文件,它们分别负责定义应用的行为和设置全局属性。 **`struts.xml`配置详解** `struts.xml`是Struts 2框架的核心配置文件,用于定义动作映射...

    Struts框架中struts-config.xml文件配置小结

    而在Struts框架中,`struts-config.xml`文件扮演着至关重要的角色,它是Struts框架的核心配置文件,用于配置应用程序的各种行为和组件。本文将对`struts-config.xml`中的关键元素进行详细解析,并结合实际示例来帮助...

    struts2属性文件struts.xml的配置

    通过以上分析可以看出,`struts.xml`文件是Struts2项目的核心配置文件之一,它不仅定义了项目的全局配置,还具体指定了每个Action的行为和返回结果,是Struts2框架中不可或缺的一部分。开发者可以根据实际需求调整...

    Web.xml中配置Struts[文].pdf

    虽然不是直接在`web.xml`中配置Struts,但Struts2引入了Filter的概念,`struts2-core.jar`包含了一个名为`StrutsPrepareAndExecuteFilter`的Filter,用来处理所有的HTTP请求,替代了Struts1中的ActionServlet。...

    Struts2.5版本struts.xml与web.xml配置的更改方法

    在Struts2框架中,配置文件`struts.xml`和`web.xml`是核心部分,它们定义了应用程序的行为和路由规则。随着版本的更新,配置方式也会有所改变。以下是Struts2.5版本中`struts.xml`和`web.xml`配置的更改方法: **1....

    struts2版本 2.1.6 必须的jar包 和 web.xml 文件的修改

    在Struts2 v2.1.6中,确保所有必需的jar包都被包含在类路径中,并正确配置`web.xml`以启动和配置Struts2框架。这将使你的应用程序能够解析Action、执行业务逻辑,并通过视图呈现结果。在实际开发中,还需要遵循最佳...

    Struts2手动搭建所有的jar包及相应的struts.xml和web.xml

    本教程将详细讲解如何手动搭建一个完整的Struts2环境,包括引入所有必要的jar包以及配置struts.xml和web.xml文件。 首先,我们需要准备Struts2的核心库。Struts2框架依赖于一系列的jar包,这些包包含了从控制器到...

    struts.xml(struts2配置)

    Struts2支持动态方法调用,允许不预先在`struts.xml`中定义Action,而是直接通过URL调用Action类的任何公共方法。 通过理解和灵活运用`struts.xml`配置,开发者能够构建出高效、可维护的Struts2应用。同时,配合...

    配置struts--config.xml详解

    在 Struts 应用程序中,`struts-config.xml` 文件是核心配置文件,它定义了应用的行为、控制器(Actions)、数据源(Form Beans)以及视图(JSP 页面)之间的关系。本文将深入探讨 `struts-config.xml` 的主要元素和...

    struts.xml详细配置

    Struts.xml是Apache Struts框架的核心配置文件,用于定义应用的行为和控制器的映射。它在MVC(Model-View-Controller)设计模式中扮演着关键角色,将用户请求与处理这些请求的业务逻辑和视图组件关联起来。在这个...

    web.xml详解

    `web.xml`是Java Web应用程序的核心配置文件,它遵循Java EE规范中的定义,用于定义Web应用的组件、监听器、过滤器以及它们之间的映射关系。在这个文件中,你可以配置Servlet、过滤器、会话超时、错误页面、欢迎文件...

    webWork,xwork.xml,web.xml配置

    在WebWork的配置中,`xwork.xml`和`web.xml`两个文件起着至关重要的作用。 首先,让我们详细了解一下`xwork.xml`配置文件。这个文件主要负责定义Action类、拦截器(Interceptor)、包(Package)以及相关的参数。...

    Practical.Apache.Struts2.Web.2.0.Projects

    本书"Practical Apache Struts2 Web 2.0 Projects"无疑是一本深入实践的指导书籍,旨在帮助读者掌握Struts2在Web 2.0环境中的应用。 Struts2框架的核心特性包括: 1. **Action和Result**:Action是业务逻辑的载体...

    struts.xml配置文件详解

    在Struts框架中,`struts.xml`配置文件扮演着极其重要的角色。它主要用于定义应用中的各种配置信息,包括但不限于包(Package)、拦截器(Interceptor)、Action以及结果(Result)等。 #### 二、Struts配置文件的...

    struts核心jar包及xml配置文件

    - 在web.xml中配置Struts2的FilterDispatcher,使其成为应用的入口点。 - 在struts.xml中定义Action,包括Action类名、方法名、结果类型等。 - 使用OGNL表达式在Action和JSP之间传递数据。 - 自定义拦截器以实现特定...

    Struts2的DTD配置文件struts-2.3.dtd

    7. **constant**:允许你在配置文件中定义和设置Struts2的常量,这些常量可以改变框架的行为。 在Eclipse中,要启用`struts-2.3.dtd`的代码提示,你需要将DTD文件添加到项目的构建路径中。这通常包括将DTD文件放在...

    struts1[1].2配置详细.doc

    在使用 Struts 1.2 时,配置文件是核心部分,主要包括两个关键文件:`web.xml` 和 `struts-config.xml`。 **一、web.xml 配置** `web.xml` 是 Web 应用的部署描述符,用于配置应用的基本行为和设置。在 Struts 1.2...

Global site tag (gtag.js) - Google Analytics