开发者社区> 黄威的世界> 正文
阿里云
为了无法计算的价值
打开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】
63 0
Struts Action 控制器
控制器 即,mvc模型的控制器模型,用于接收数据,传递给视图层,和模型层默认使用execute方法 查看相关接口 查看com.opensymphony.xwork2下的Action接口文件如下 /* * Licensed to the Apache Software Foundation (AS...
990 0
Struts2【开发Action】知识要点
前言 前面Struts博文基本把Struts的配置信息讲解完了.....本博文主要讲解Struts对数据的处理 Action开发的三种方式 在第一次我们写开发步骤的时候,我们写的Action是继承着ActionSupport类的.
1046 0
Struts2 Action 动态传参数
Struts2的两个Action之间传参的问题。          需求功能是这样:Action1 获取数据库配置内容,得到相应Model的 动态URL ,这里的URL 有的是Action有的是JSP页面。
926 0
struts1——静态ActionForm与动态ActionForm
      在struts1中,我们可以使用ActionForm来获取从client端提交上来的数据,并通过action配置中的name属性,将某个ActionForm配置到某次请求应答的Action中,作为本次请求应答的数据传输介质,ps,其实还是侧重于数据在客户端的获取,因为赋值部分框架帮我们做好了。
790 0
Struts中ActionForm的初始化步骤
       在ActionServlet接收到某个请求并将这个请求交给具体的某个Action处理之前,struts框架会检查配置文件中对应action的name属性是否设置。
744 0
struts 理解 action
引用:http://topic.csdn.net/u/20080403/15/5fdb7a6b-b3ad-45b7-9752-84ed0ffa8409.html    4# struts里有个ActionServlet,然后这个东西去读取你配置的struts-config.
532 0
+关注
黄威的世界
我是一个热衷IT技术的人,希望自己不断地设计开发出对别人非常有用的软件。有近7年的java开发经验(包括2年Android开发经验)和一年左右的linux使用经验。擅长Java Web后台开发 ,喜欢研究新的各种实用技术
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载