`
jsx112
  • 浏览: 307563 次
  • 性别: 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所在的目录)
分享到:
评论

相关推荐

    struts2配置2.5版

    拦截器:web.xml 配置拦截器&lt;filter&gt; struts2.5的filter-class 与struts2.5以前版本有所不同 &lt;!-- 浏览器访问 http://localhost:8080/MyWeb/helloworld --&gt; --&gt; &lt;?xml version="1.0" encoding=...

    struts-2.3.4.1所需的jar文件

    web.xml &lt;filter-name&gt;struts2&lt;/filter-name&gt; org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter &lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-name&gt;struts2&lt;/filter-name&gt; ...

    struts基于mvc的开发代码

    &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"&gt; &lt;struts-...

    用Struts2新建一个应用的方法步骤

    3.在下在的struts2的解压包中的lib文件夹下,复制commons-logging-1.0.4.jar,freemarker-2.3.8.jar,ognl-2.6.11.jar,tiles-core-2.0.4.jar,xwork-2.0.5.jar,在MyEclipse中右击lib粘贴。 4.新建一个JSP页面。...

    Struts in Action中文版

    2.4.4. Struts如何实现 Model 2, MVC, 和分层............................................................49 2.5. Struts 控制流...............................................................................

    Struts2项目开发流程简明实例

    功能:  在登录页面login.jsp中输入用户名admim和密码123456后,单击登录按钮后跳转到success.jsp页面;  否则页面跳转到login.jsp页面等待用户输入;...6. 创建struts.xml配置Action 7. 部署和运行struts2项目

    第一个struts程序

    1、login.jsp的form表格里的action是在struts.xml中&lt;action name="login" class="check.action.LoginAction"&gt;的name的属性的名字后面加上.action 例如:&lt;form action="login.action" method="post"&gt; 2、web.xml中 ...

    搭建好的一个struts2环境

    为了方便初学者使用Struts2,我配置了一个Struts2空项目,可以直接使用Struts2,IDE使用的是MyEclipse6.5 使用方法: 1.在包com.test.web.action添加类,比如Test1Action.java,该类需要继承ActionSupport 2.在Web...

    struts项目搭建

    Struts作为MVC 2的Web框架,自推出以来不断受到开发者的追捧,得到用广泛的应用。作为最成功的Web框架,Struts自然拥有众多的优点:  MVC 2模型的使用  功能齐全的标志库(Tag Library)  开放源代码 好了...

    struts2+spring2+ibates

    4、写sping的application和applicationservices或者其它配置.(可对些文件分为其它文件,在web.xml中注册即可) 5、配置struts.xml 6、配置sqlmapconfig.xml,如果有include,则配置其它文件. 7、写dao和service类. 8、...

    从零开始创建基于struts1.2 + Hibernate3.0的Web工程

    4.4. 添加formbean和actionbean .......................................11 4.5. 添加menu画面....................................................13 5. 调试工程..............................................

    Struts2入门教程(全新完整版)

    3.初识struts2配置文件 4 (1).web.xml文件 4 (2).struts.xml文件 4 (3).struts.properties(参default.properties) 4 (4)struts-default.xml 4 (5)其它配置文件 4 4.让MyEclipse提示xml信息 4 5.如何...

    客户关系管理系统框架搭建(二)

    * 根据路径创建SysUserGroupAction和在action中增加save方法,放置在cn.itcast.crm.web.action包下 public class SysUserGroupAction extends ActionSupport public String save() throws ...

    struts自我学习过程程序以及说明

    配置dwr.xml和web.xml 运行 http://localhost:5858/start/dwr/ 它会在后台输出一些信息,自己看一下就可以了,就是一些加载项之类的东西或者是其他的一些信息. ajaxvalidate包 AjaxValidation.jsp 配置struts.xml即可...

    javaWeb_struts2框架实现简单用户注册登录

    基于javaWeb MVC模式,借助struts2框架编写,实现用户简单的注册与登录功能。 1.本demo严格按照MVC的分层模式采用myeclipse编写,可直接运行,...当然需要在web.xml中配置核心filter—strutsPrepareAndExecuteFilter.

    java三大框架注解配置

    1、新建web项目,添加struts功能,配置struts.xml: &lt;constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory" /&gt; 修改struts默认的拦截: &lt;filter-name&gt;struts2&lt;/...

    Struts2教程

    Struts2 虽然在大版本号上是第二个版本,但基本上在配置和使用上已经完全颠覆了 Struts1.x 的方式(当然, Struts2 仍然是基于 MVC 模式的,也是动作驱动的,可能这是唯一 没变的东西)。 Struts2 实际上是在 ...

    搭建struts2框架

    struts2框架的详细搭建 &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" ...

    struts2课件

    struts2课件 很好的struts2当输入login.jsp访问jsp页面填写完相关信息并提交给login.action时,它会首先被在web.xml中配置的过滤器监听到,过滤器会去查找strust.xml文件,并结合namespace查找名为login的action,...

    struts2 标签

    struts2 标签 Taglib (Struts2标签库)

Global site tag (gtag.js) - Google Analytics