struts2 访问不存在的action时,自动跳转-阿里云开发者社区

开发者社区> 黄威的世界> 正文

struts2 访问不存在的action时,自动跳转

简介:
+关注继续查看

struts 中访问不存在的action时,默认的会显示如下页面:

 

 

这显然不友好。能不能跳转到统一的action进行处理呢?

struts 可以做到。

struts.xml配置文件如下:

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.3.dtd">  
  5.   
  6. <struts>  
  7.   
  8.     <constant name="struts.enable.DynamicMethodInvocation" value="false" />  
  9.     <constant name="struts.devMode" value="true" />  
  10.     <constant name="struts.ui.theme" value="simple" />  
  11.     <constant name="struts.objectFactory" value="spring" />  
  12.     <constant name="struts.xwork.chaining.copyMessages" value="true" />  
  13.     <constant name="struts.multipart.maxSize" value="58871540" /><!--  
  14.         50 MB -->  
  15.   
  16.     <constant name="struts.xwork.chaining.copyErrors" value="true" />  
  17.   
  18.   
  19.   
  20.     <package name="default" namespace="/" extends="struts-default">  
  21.   
  22.         <interceptors>  
  23.             <!-- <interceptor name="authorityInterceptor"  
  24.                 class="com.shop.jn.interceptor.AuthorityInterceptor"></interceptor> -->  
  25.             <interceptor name="loggerInterceptor"  
  26.                 class="com.shop.jn.interceptor.LoggerInterceptor"></interceptor>  
  27.             <interceptor name="loginTimesLimitInterceptor"  
  28.                 class="com.shop.jn.interceptor.LoginTimesLimitInterceptor"></interceptor>  
  29.             <interceptor name="jsonIntercept"  
  30.                 class="com.shop.jn.interceptor.JSONInterceptor"></interceptor>  
  31.             <!-- minimum interceptor stack -->  
  32.             <interceptor-stack name="minStack">  
  33.                 <interceptor-ref name="defaultStack"></interceptor-ref>  
  34.                 <interceptor-ref name="loggerInterceptor"></interceptor-ref>  
  35.                 <!-- -->  
  36.             </interceptor-stack>  
  37.             <!-- authority check when access resource -->  
  38.             <interceptor-stack name="authorityStack">  
  39.                 <interceptor-ref name="defaultStack"></interceptor-ref>  
  40.                 <!-- <interceptor-ref name="authorityInterceptor"></interceptor-ref> -->  
  41.                 <interceptor-ref name="loggerInterceptor"></interceptor-ref>  
  42.             </interceptor-stack>  
  43.             <!-- <interceptor-stack name="loginTimesLimitStack"> <interceptor-ref   
  44.                 name="defaultStack"></interceptor-ref> <interceptor-ref name="loggerInterceptor"></interceptor-ref>   
  45.                 <interceptor-ref name="loginTimesLimitInterceptor"></interceptor-ref> </interceptor-stack> -->  
  46.         </interceptors>  
  47.         <default-interceptor-ref name="authorityStack"></default-interceptor-ref>  
  48.         <!-- <default-action-ref name="index" /> -->  
  49.   
  50.         <default-action-ref name="notFound" />  
  51.   
  52.         <global-results>  
  53.             <result name="error">/error.jsp</result>  
  54.             <result name="login2">/user/loginInput.jsp</result>  
  55.         </global-results>  
  56.   
  57.         <action name="notFound" class="com.shop.jn.action.error.NotFoundErrerAction">  
  58.             <result name="success">/not_found.jsp</result>  
  59.         </action>  
  60.         <!--<global-exception-mappings> <exception-mapping exception="java.lang.Exception"   
  61.             result="error" /> </global-exception-mappings> --><!--<action name="index"> <result type="redirectAction"> </result> </action> -->  
  62.     </package>  
  63.   
  64.     <package name="goods22" extends="struts-default" namespace="/goods">  
  65.         <action name="*Goods" class="{1}GoodsAction">  
  66.             <result type="redirectAction">  
  67.                 <param name="namespace">/goods</param>  
  68.                 <param name="actionName">viewGoods</param>  
  69.             </result>  
  70.             <result name="input">/input.jsp</result>  
  71.         </action>  
  72.   
  73.         <!-- this is a exception ,must not use wildcard -->  
  74.         <action name="viewGoods" class="viewGoodsAction">  
  75.             <result>/goods/viewGoods.jsp</result>  
  76.         </action>  
  77.         <action name="addInputGoods" class="addInputGoodsAction">  
  78.             <result>/goods/addGoods.jsp</result>  
  79.         </action>  
  80.   
  81.         <action name="updateInputGoods" class="updateInputGoodsAction">  
  82.             <result>/goods/addGoods.jsp</result>  
  83.         </action>  
  84.     </package>  
  85.   
  86.     <package name="supermarket22" extends="default" namespace="/supermarket">  
  87.         <action name="*Supermarket" class="{1}SupermarketAction">  
  88.             <result type="redirectAction">  
  89.                 <param name="namespace">/supermarket</param>  
  90.                 <param name="actionName">viewSupermarket</param>  
  91.             </result>  
  92.         </action>  
  93.         <!-- this is a exception ,must not use wildcard -->  
  94.         <action name="viewSupermarket" class="viewSupermarketAction">  
  95.             <result>/supermarket/viewSupermarket.jsp</result>  
  96.         </action>  
  97.   
  98.         <action name="updateInputSupermarket" class="updateInputSupermarketAction">  
  99.             <result>/supermarket/addSupermarket.jsp</result>  
  100.         </action>  
  101.     </package>  
  102.   
  103. </struts>  

 在上述struts.xml文件中,我配置了default-action-ref,默认action的名称是”notFound“,对应的Java类是”com.shop.jn.action.error.NotFoundErrerAction“:

Java代码  收藏代码
  1. package com.shop.jn.action.error;  
  2.   
  3. import com.opensymphony.xwork2.ActionSupport;  
  4.   
  5. public class NotFoundErrerAction extends ActionSupport {  
  6.   
  7.     private static final long serialVersionUID = 6218614965524501080L;  
  8.     @Override  
  9.     public String execute() throws Exception {  
  10.         System.out.println("您访问的action 不存在!");  
  11.         return super.execute();  
  12.     }  
  13. }  

 访问notFound action时,跳转到的页面是:not_found.jsp,

not_found.jsp 内容如下:

Html代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  3.     pageEncoding="UTF-8"%>  
  4. <%  
  5.     String path = request.getContextPath();  
  6.     String basePath = request.getScheme() + "://"  
  7.             + request.getServerName() + ":" + request.getServerPort()  
  8.             + path + "/";  
  9. %>  
  10. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  11. <html xmlns="http://www.w3.org/1999/xhtml">  
  12. <head>  
  13. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
  14. <title>Insert title here</title>  
  15. </head>  
  16. <body>  
  17. <h1>  
  18. <font color="red" >not found</font>  
  19. </h1>  
  20. </body>  
  21. </html>  

 在浏览器中显示界面如下:

 

 

继续说明struts.xml文件:

package goods22继承了struts-default(struts默认的package),命名空间是”/goods“;而package supermarket22 继承了default(default中配置了默认的action),命名空间是”/supermarket“。

default 是我自定义的package。

 

我们在浏览器地址栏中输入:http://localhost:8080/shop_goods/supermarket/xxx.action

上述url对应的action是不存在的!

结果如下:

 达到了我们的需求。

 

但是我 在浏览器地址栏中输入:
http://localhost:8080/shop_goods/goods/xxx.action
  时,结果如下:

没有达到我们的需求,为什么没有跳转到默认action呢?

因为上述url对应的命名空间(namespace)是/goods,而该package 并没有继承default package。访问http://localhost:8080/shop_goods/supermarket/xxx.action 就可以到达默认action,因为supermarket 继承了default package 。

如何解决上述问题呢?

方式一

删除package default 的namespace,这样不论package 目录结构如何只要找不到action,就会跳转到默认daction;

struts.xml 部分代码如下:

Xml代码  收藏代码
  1. <package name="default"  extends="struts-default">  
  2.   
  3.         <interceptors>  
  4.             <!-- <interceptor name="authorityInterceptor"  
  5.                 class="com.shop.jn.interceptor.AuthorityInterceptor"></interceptor> -->  
  6.             <interceptor name="loggerInterceptor"  
  7.                 class="com.shop.jn.interceptor.LoggerInterceptor"></interceptor>  
  8.             <interceptor name="loginTimesLimitInterceptor"  
  9.                 class="com.shop.jn.interceptor.LoginTimesLimitInterceptor"></interceptor>  
  10.             <interceptor name="jsonIntercept"  
  11.                 class="com.shop.jn.interceptor.JSONInterceptor"></interceptor>  
  12.             <!-- minimum interceptor stack -->  
  13.             <interceptor-stack name="minStack">  
  14.                 <interceptor-ref name="defaultStack"></interceptor-ref>  
  15.                 <interceptor-ref name="loggerInterceptor"></interceptor-ref>  
  16.                 <!-- -->  
  17.             </interceptor-stack>  
  18.             <!-- authority check when access resource -->  
  19.             <interceptor-stack name="authorityStack">  
  20.                 <interceptor-ref name="defaultStack"></interceptor-ref>  
  21.                 <!-- <interceptor-ref name="authorityInterceptor"></interceptor-ref> -->  
  22.                 <interceptor-ref name="loggerInterceptor"></interceptor-ref>  
  23.             </interceptor-stack>  
  24.             <!-- <interceptor-stack name="loginTimesLimitStack"> <interceptor-ref   
  25.                 name="defaultStack"></interceptor-ref> <interceptor-ref name="loggerInterceptor"></interceptor-ref>   
  26.                 <interceptor-ref name="loginTimesLimitInterceptor"></interceptor-ref> </interceptor-stack> -->  
  27.         </interceptors>  
  28.         <default-interceptor-ref name="authorityStack"></default-interceptor-ref>  
  29.         <!-- <default-action-ref name="index" /> -->  
  30.   
  31.         <default-action-ref name="notFound" />  
  32.   
  33.         <global-results>  
  34.             <result name="error">/error.jsp</result>  
  35.             <result name="login2">/user/loginInput.jsp</result>  
  36.         </global-results>  
  37.   
  38.         <action name="notFound" class="com.shop.jn.action.error.NotFoundErrerAction">  
  39.             <result name="success">/not_found.jsp</result>  
  40.         </action>  
  41.         <!--<global-exception-mappings> <exception-mapping exception="java.lang.Exception"   
  42.             result="error" /> </global-exception-mappings> --><!--<action name="index"> <result type="redirectAction"> </result> </action> -->  
  43.     </package>  

 

方式二

让所有的package 都继承我自定义的package default

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SharePoint自动化系列——Error features自动deactivate
转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ SharePoint Content Deployment prerequisite——Error features deactivate automation 对于Content Depl...
831 0
双效合一:DeathStar配合empire进行自动化攻击
本文讲的是双效合一:DeathStar配合empire进行自动化攻击,在我介绍这一攻击方法之前,我先借此机会说明:在你渗透测试中,拿下域管并不是唯一的目标。
1183 0
DataRabbit 轻量的数据访问框架(01) -- ITransactionAccesser
(完全限定类名:DataRabbit.ITransactionAccesser)    在DataRabbit 轻量的数据访问框架 --序 中,我们已经知道,所有的访问器接口都继承了ITransactionAccesser接口。
639 0
【IntelliJ IDEA】spring boot项目在idea实现自动部署
转载参考自:https://www.cnblogs.com/winner-0715/p/6666579.html   spring-boot-devtools是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去。
2156 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4480 0
Cleave.js – 自动格式化表单输入框的文本内容
  Cleave.js 有一个简单的目的:帮助你自动格式输入的文本内容。 这个想法是提供一个简单的方法来格式化您的输入数据以增加输入字段的可读性。通过使用这个库,您不需要编写任何正则表达式来控制输入文本的格式。
1067 0
DataRabbit 轻量的数据访问框架(08) -- DataRabbit 的入口点:TransactionScopeFactory和TransactionScope
(完全限定类名:DataRabbit.Application.TransactionScopeFactory ,DataRabbit.Application.TransactionScope)            关于TransactionScopeFactory首先要提醒以下几点: (1)TransactionScopeFactory是DataRabbit框架的入口点,所有的访问器、分页管理器、大纲操作者都可以从TransactionScopeFactory生成的TransactionScope(事务范围)处获取。
651 0
自动调整速率的Actor设计模式
问题背景 与数据库或者存储系统交互是所有应用软件都必不可少的功能之一,akka开发的系统也不例外。但akka特殊的地方在于,会尽可能的将所有的功能都设计成异步的,以避免Actor阻塞,然而无法避免IO这类的阻塞操作。
972 0
【转】Intellij IDEA 14中使用MyBatis-generator 自动生成MyBatis代码
Intellij IDEA 14 作为Java IDE 神器,接触后发现,非常好用,对它爱不释手,打算离开eclipse和myeclipse,投入Intellij IDEA的怀抱。      然而在使用的过程中会发现Intellij IDEA也有一些不尽如意的地方,难免会有些不爽:Intellij IDEA 的插件库远不及eclipse的丰富。
1710 0
+关注
黄威的世界
我是一个热衷IT技术的人,希望自己不断地设计开发出对别人非常有用的软件。有近7年的java开发经验(包括2年Android开发经验)和一年左右的linux使用经验。擅长Java Web后台开发 ,喜欢研究新的各种实用技术
668
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载