开发者社区> 黄威的世界> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

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

相关文章
Struts2里面灵活action跳转
Struts2里面灵活action跳转
0 0
Spring Security4.1.3实现拦截登录后向登录页面跳转方式(redirect或forward)返回被拦截界面
一、看下内部原理 简化后的认证过程分为7步: 用户访问网站,打开了一个链接(origin url)。 请求发送给服务器,服务器判断用户请求了受保护的资源。 由于用户没有登录,服务器重定向到登录页面 填写表单,点击登录 浏览器将用户名密码以表单形式发送给服务器 服务器验证用户名密码。
2714 0
SSH框架整合遇到的错误——Struts2.5 action跳转出现错误
错误信息如图: 刚开始以为是struts2的配置问题,就换了一下action的值,改成了login1之后才发现错误。 表单提交的跳转信息: Struts2.xml中的配置 UserAction.java中的配置   action的跳转方法不能有参数,手误写了参数,导致action找不到login1方法。
900 0
+关注
黄威的世界
我是一个热衷IT技术的人,希望自己不断地设计开发出对别人非常有用的软件。有近7年的java开发经验(包括2年Android开发经验)和一年左右的linux使用经验。擅长Java Web后台开发 ,喜欢研究新的各种实用技术
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载