请高手指教关于struts2中默认action的问题

glinenator 2008-09-02 02:58:24
我在web.xml中作了如下配置:
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这就意味着所有的请求都会经过struts2的过滤器,问题就出来了。一旦我这样设置后,网页里对图像,css,javascript的外部引用都会经过这个filter,但是我在struts.xml里并没有对这些静态资源做action mapping,所以导致资源找不到。比如我在浏览器里输入css的url,报错如下:
HTTP Status 404 - There is no Action mapped for action name css/data_maint.css.

我想得到这种效果,所有的请求都会经过struts2 filter处理,对于匹配action mapping的请求,调用action里相应的方法,并返回该动态资源;对于不能匹配action mapping的请求,有两种处理结果:1.该url请求的静态资源确实存在,返回该静态资源;2.该url请求的静态资源不存在,则重定向到一个定制化的出错页面。请问我应该如何配置,或者怎样创建一个默认的action,达到这种效果?

我是新手,望各位大侠指教。
...全文
1339 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhongshilian 2009-04-03
  • 打赏
  • 举报
回复
不明白
glinenator 2008-09-02
  • 打赏
  • 举报
回复
但是如果像你这么做的话,所有对静态资源的请求都会被转到index.jsp,这并不是我想要的。
我想要的结果是对于确实存在的资源,比如css,image,javascript,返回该资源;对于不存在的资源,重定向到一个特定的出错页面,而不是tomcat的404页面。
谢谢解答,有没有其他更好的方法呢?
coolovebinge 2008-09-02
  • 打赏
  • 举报
回复
你设置一个默认的action 或者在最后写个* 然后转向
默认的action
<default-action-ref name="index"/>
<action name="index">
<result>/index.jsp</result>
</action>
这样话 如果找不资源就直接转到jsp了


或者在默认包中最后写个通用的action
<action name="*">
<result>/index.jsp</result>
</action>
glinenator 2008-09-02
  • 打赏
  • 举报
回复
由于我想采用Restful风格的url请求,所以我在struts.xml里做了这样的设置:
<constant name="struts.mapper.class" value="org.apache.struts2.dispatcher.mapper.Restful2ActionMapper">
</constant>
<constant name="struts.enable.SlashesInActionNames" value="true"></constant>
<constant name="struts.action.extension" value=""></constant>
也就说,我的action请求是不带.action后缀的。比如,我要请求id为123的书,那么我输入的url就是:
http://localhost/book/123
而不是
http://localhost/book.action?id=123
所以楼上说的方法可能并不适用。

另外,我把我的struts.xml里这些constant改为默认值后,也试过楼上的方法,即把url-pattern由/*改为*.action,但是在server解析jsp tag时总会抛错:
org.apache.jasper.JasperException: 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. - [unknown location]
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

我在网上搜了一下,似乎是个很常见的问题,不知道大家有没有遇到过这个问题,是怎么解决的?
sailer2008 2008-09-02
  • 打赏
  • 举报
回复
你可以把url-pattern的值改为*.action,这样就不会对所的的请求都要转到struts2,了。对于页面中有struts2标签的jsp都用一个action转向这个jsp而不是直接访问这个jsp.
比如:你直接输入login.jsp转到登录页面,现在你要输入login.action由login.action再转向login.jsp,而不是直接访问login.jsp。这样就会避免不需要过滤的资源也要经过过滤器的问题

67,537

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧