struts 中访问不存在的action时,默认的会显示如下页面:
这显然不友好。能不能跳转到统一的action进行处理呢?
struts 可以做到。
struts.xml配置文件如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <constant name="struts.ui.theme" value="simple" /> <constant name="struts.objectFactory" value="spring" /> <constant name="struts.xwork.chaining.copyMessages" value="true" /> <constant name="struts.multipart.maxSize" value="58871540" /><!-- 50 MB --> <constant name="struts.xwork.chaining.copyErrors" value="true" /> <package name="default" namespace="/" extends="struts-default"> <interceptors> <!-- <interceptor name="authorityInterceptor" class="com.shop.jn.interceptor.AuthorityInterceptor"></interceptor> --> <interceptor name="loggerInterceptor" class="com.shop.jn.interceptor.LoggerInterceptor"></interceptor> <interceptor name="loginTimesLimitInterceptor" class="com.shop.jn.interceptor.LoginTimesLimitInterceptor"></interceptor> <interceptor name="jsonIntercept" class="com.shop.jn.interceptor.JSONInterceptor"></interceptor> <!-- minimum interceptor stack --> <interceptor-stack name="minStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="loggerInterceptor"></interceptor-ref> <!-- --> </interceptor-stack> <!-- authority check when access resource --> <interceptor-stack name="authorityStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <!-- <interceptor-ref name="authorityInterceptor"></interceptor-ref> --> <interceptor-ref name="loggerInterceptor"></interceptor-ref> </interceptor-stack> <!-- <interceptor-stack name="loginTimesLimitStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="loggerInterceptor"></interceptor-ref> <interceptor-ref name="loginTimesLimitInterceptor"></interceptor-ref> </interceptor-stack> --> </interceptors> <default-interceptor-ref name="authorityStack"></default-interceptor-ref> <!-- <default-action-ref name="index" /> --> <default-action-ref name="notFound" /> <global-results> <result name="error">/error.jsp</result> <result name="login2">/user/loginInput.jsp</result> </global-results> <action name="notFound" class="com.shop.jn.action.error.NotFoundErrerAction"> <result name="success">/not_found.jsp</result> </action> <!--<global-exception-mappings> <exception-mapping exception="java.lang.Exception" result="error" /> </global-exception-mappings> --><!--<action name="index"> <result type="redirectAction"> </result> </action> --> </package> <package name="goods22" extends="struts-default" namespace="/goods"> <action name="*Goods" class="{1}GoodsAction"> <result type="redirectAction"> <param name="namespace">/goods</param> <param name="actionName">viewGoods</param> </result> <result name="input">/input.jsp</result> </action> <!-- this is a exception ,must not use wildcard --> <action name="viewGoods" class="viewGoodsAction"> <result>/goods/viewGoods.jsp</result> </action> <action name="addInputGoods" class="addInputGoodsAction"> <result>/goods/addGoods.jsp</result> </action> <action name="updateInputGoods" class="updateInputGoodsAction"> <result>/goods/addGoods.jsp</result> </action> </package> <package name="supermarket22" extends="default" namespace="/supermarket"> <action name="*Supermarket" class="{1}SupermarketAction"> <result type="redirectAction"> <param name="namespace">/supermarket</param> <param name="actionName">viewSupermarket</param> </result> </action> <!-- this is a exception ,must not use wildcard --> <action name="viewSupermarket" class="viewSupermarketAction"> <result>/supermarket/viewSupermarket.jsp</result> </action> <action name="updateInputSupermarket" class="updateInputSupermarketAction"> <result>/supermarket/addSupermarket.jsp</result> </action> </package> </struts>
在上述struts.xml文件中,我配置了default-action-ref,默认action的名称是”notFound“,对应的java类是”com.shop.jn.action.error.NotFoundErrerAction“:
package com.shop.jn.action.error; import com.opensymphony.xwork2.ActionSupport; public class NotFoundErrerAction extends ActionSupport { private static final long serialVersionUID = 6218614965524501080L; @Override public String execute() throws Exception { System.out.println("您访问的action 不存在!"); return super.execute(); } }
访问notFound action时,跳转到的页面是:not_found.jsp,
not_found.jsp 内容如下:
<?xml version="1.0" encoding="UTF-8" ?> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Insert title here</title> </head> <body> <h1> <font color="red" >not found</font> </h1> </body> </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 部分代码如下:
<package name="default" extends="struts-default"> <interceptors> <!-- <interceptor name="authorityInterceptor" class="com.shop.jn.interceptor.AuthorityInterceptor"></interceptor> --> <interceptor name="loggerInterceptor" class="com.shop.jn.interceptor.LoggerInterceptor"></interceptor> <interceptor name="loginTimesLimitInterceptor" class="com.shop.jn.interceptor.LoginTimesLimitInterceptor"></interceptor> <interceptor name="jsonIntercept" class="com.shop.jn.interceptor.JSONInterceptor"></interceptor> <!-- minimum interceptor stack --> <interceptor-stack name="minStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="loggerInterceptor"></interceptor-ref> <!-- --> </interceptor-stack> <!-- authority check when access resource --> <interceptor-stack name="authorityStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <!-- <interceptor-ref name="authorityInterceptor"></interceptor-ref> --> <interceptor-ref name="loggerInterceptor"></interceptor-ref> </interceptor-stack> <!-- <interceptor-stack name="loginTimesLimitStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="loggerInterceptor"></interceptor-ref> <interceptor-ref name="loginTimesLimitInterceptor"></interceptor-ref> </interceptor-stack> --> </interceptors> <default-interceptor-ref name="authorityStack"></default-interceptor-ref> <!-- <default-action-ref name="index" /> --> <default-action-ref name="notFound" /> <global-results> <result name="error">/error.jsp</result> <result name="login2">/user/loginInput.jsp</result> </global-results> <action name="notFound" class="com.shop.jn.action.error.NotFoundErrerAction"> <result name="success">/not_found.jsp</result> </action> <!--<global-exception-mappings> <exception-mapping exception="java.lang.Exception" result="error" /> </global-exception-mappings> --><!--<action name="index"> <result type="redirectAction"> </result> </action> --> </package>
方式二:
让所有的package 都继承我自定义的package default
相关推荐
在Struts2框架中,经常需要实现Action之间的跳转,并在跳转过程中传递必要的参数。这种需求在实际开发中非常常见,尤其是在需要根据用户的不同操作来调用不同的业务逻辑时。下面将详细介绍如何在Struts2中实现Action...
资源中示例了一个struts2的配置文件中配置的action的result结果为另外一个action的配置,该跳转的过程中是带所有参赛调整的,在另外一个action中可以接受到当前action的所有参数,此配置文件是我日常开发中的经验...
在"Struts2简单的页面跳转示例"中,我们通常会有一个Action类,这个类需要继承自Struts2提供的ActionSupport类或者自定义一个基类。Action类中的方法对应用户请求的URL,当用户发起请求时,Struts2框架会根据配置...
在使用Struts2的过程中,可能会遇到一个常见的问题,即应用试图跳转到一个不存在的页面,导致用户看到404错误。404错误通常表示服务器无法找到请求的资源,这可能是由于URL配置错误、控制器映射问题或者资源实际不...
这里定义了一个名为 `login` 的 Action,当表单提交到 `/login.action` 时,Struts2 将会调用 `action.LoginAction` 类来处理这个请求。如果 `LoginAction` 返回 `"success"`,那么根据配置的 `redirect-action` ...
本资源提供了关于如何在Struts2中操作同一Action的不同方法并进行页面跳转的详细知识,下面将深入探讨这一主题。 首先,了解Struts2的配置方式。在Struts2的配置文件(如struts.xml或struts.properties)中,我们...
当遇到“Struts2中路径无法跳转的问题”时,这通常与配置、Action类、结果类型或JSP页面的设置有关。以下是一些可能导致问题的关键知识点: 1. **Struts2配置文件**: - 配置文件通常为`struts.xml`,这是定义...
作为一个基于Action和基于拦截器的框架,Struts2提供了丰富的功能,使得开发者能够构建可维护、可扩展的Web应用。下面我们将深入探讨Struts2的主要特性、工作原理以及如何在实际开发中运用。 1. **核心概念**: - ...
如果`form`的范围是`request`,或者当前范围内不存在这样的`form`对象,则会创建一个新的`form`实例。之后,会调用`form`对象的`reset()`方法对表单数据进行初始化处理,然后将表单中的参数填充到`form`对象中。如果...
当用户通过浏览器发送请求时,Struts2会将请求转发给相应的Action处理。 - **执行流程**: - 用户发起HTTP请求。 - 请求被Struts2的前端控制器(FilterDispatcher)拦截。 - FilterDispatcher根据配置找到对应的...
在Struts2框架下使用`<jsp:forward/>`进行页面跳转时,可能会遇到“404 Not Found”错误,即“no found”的问题。这个错误通常是由于配置不正确或者路径解析不准确导致的。 首先,我们需要理解Struts2的工作原理。...
在Struts2中,Action的配置和使用方式有多种,下面将详细介绍Struts2 Action参数的详细说明。 首先,我们来看Action的配置格式。在Struts2的配置文件(通常是struts.xml)中,Action的基本配置结构如下: ```xml ...
5. **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为默认的表达式语言,用于在Action与视图之间传递数据,支持动态属性访问和方法调用。 6. **插件系统**:Struts2拥有丰富的插件库,如Tiles、...
在Struts2中,Action是一个实现了`com.opensymphony.xwork2.Action`接口或者继承自`org.struts2.StrutsAction`的类。这个类包含了处理用户请求的方法,通常被称为execute方法。当一个HTTP请求到达服务器,Struts2...
《Struts2 in Action》中文版是一本深入探讨Struts2框架的专业书籍,该书不仅提供了详尽的理论知识,还包含了大量的实战案例,对于希望掌握Struts2框架的开发者来说,是一本不可或缺的参考书。 ### Struts2框架概览...
错误信息通常为:“There is no Action mapped for namespace / and action name.”,这意味着Struts2在尝试处理请求时找不到对应的Action映射。此外,如果设置了默认的欢迎页面(welcome file),但在启动应用后...
在JSP页面上使用这些标签时,可以添加私有属性,并通过Eclipse等IDE自动生成对应的getter和setter方法,以方便在Action类中访问和处理用户输入。 二、页面跳转 在Struts中,页面跳转主要通过ActionForward或...
本文将深入解析Struts1中的五种不同类型的跳转方法,这包括了完整action、仅有Form的action、仅有Action的action、仅有JSP的action以及两个action对应一个form的情况。 ### 完整的action 在Struts1中,一个完整的...
S2-016 漏洞是由于 Struts2 的 Ognl 表达式语言解析器存在缺陷,从而导致攻击者可以 inject 恶意代码。这个漏洞影响了 Struts2 的所有版本。 S2-017 漏洞是由于 Struts2 的 DefaultActionMapper 的 ...