`
KuangYeYaZi
  • 浏览: 55882 次
文章分类
社区版块
存档分类
最新评论

struts2动态方法配置

 
阅读更多

当前使用的版本是2.3.16.3,点击下载http://struts.apache.org/

struts2推荐使用通配符的方式配置,下面的是详细的使用方法:

第一:新建一个web项目,导入里面的相关jar包,并配置web.xml,配置如下。

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">

	<display-name>tea</display-name>
	<!-- 配置欢迎页 -->
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>


	<filter>
		<filter-name>struts2</filter-name>
		<!-- 从struts2开始,采用了StrutsPrepareAndExecuteFilter这个类来作为拦截器入口 -->
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern><!-- 这里为了方便查询是生效了structs2,配置了拦截所有的页面 -->
	</filter-mapping>



</web-app>

 

第二:

新建一个测试调用动态方法的页面。比如index.jsp或者是index.html,文件名 自定义,但是结尾是.jsp或者是.html结尾。下面以index.jsp为例,

在index.jsp页面中放置4个超链接。只要是看点击哪个连接,它调用了Action里面的哪个方法。(一般最后是放3个以上(含),就可以总结出里面的方法是怎么调用的了。),页面代码如下:

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>TestMethod</title>
</head>
<body>
<a href="addDiplay">测试方法1</a>
<a href="goodDiplay">测试方法2</a>
<a href="delDiplay">测试方法3</a>
<a href="serDiplay">测试方法4</a>

</body>
</html>

 

 

第三:新建一个action.Action里面如下:

 

package com.ye;

import com.opensymphony.xwork2.ActionSupport;

public class Show  extends ActionSupport{
	private static final long serialVersionUID = 6724224670598786797L;

	public String add(){
		return "one";  //如果引用的是这个跳转到one.jsp
	}
	
	public String good(){
		return "two";//如果引用的是这个跳转到two.jsp
	}
	
	public String del(){
		return "three";//如果引用的是这个跳转到three.jsp
	}
	
	public String ser(){
		return "four";//如果引用的是这个跳转到four.jsp
	}
}

 

 

 

第四,新建四个页面,只要是跟action里面的方法返回对应的字符串时,跳转到对应的方法里面的页面。代码如下:

one的页面,也就是one.jsp(这里html,jsp页面都可以)l如下:

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>第一个页面</title>
</head>
<body>
我是第一个页面哦
</body>
</html>

 

 

其他三个页面与这个类似,只是改一下<title>和<body>里面的文字而己。

 

第五:创建struts.xml文件,直接放在项目里面的src目录里面即可:

对于struts.xml的动态方法配置说明如下:

============================================================================

说明1:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
	<package name="display"  extends="struts-default">
	
	<!-- 
	 <a href="addDiplay">测试方法1</a>
	 <a href="goodDiplay">测试方法2</a> 
	 <a href="delDiplay">测试方法3</a> 
	 <a href="serDiplay">测试方法4</a> 
	 -->
<!--这里Action里面匹配的是Diplay-->
	 		<action name="*Diplay" class="com.ye.Show" method="{1}">
			<result name="one">/one.jsp</result>
			<result name="two">/two.jsp</result>
			<result name="three">/three.jsp</result>
			<result name="four">/four.jsp</result>
		</action>
	</package>
</struts>

 这里采取*Diplay。当点击index.jsp里面的超连接时(比如点击测试1),它会匹配里面的对应的方法。比如add()这个。*号表示任意匹配,它会直接匹配*号里面的内容,Action里面如果有相应的方法匹配,就执行对应的方法。

 ==============================================================================

 

 

说明2:当我们修改struts.xml里面验证匹配的方式如下时:(比如匹配规则为*lay):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
	<package name="display"  extends="struts-default">
	
	<!-- 
	 <a href="addDiplay">测试方法1</a>
	 <a href="goodDiplay">测试方法2</a> 
	 <a href="delDiplay">测试方法3</a> 
	 <a href="serDiplay">测试方法4</a> 
	 -->
	 		<action name="*lay" class="com.ye.Show" method="{1}">
			<result name="one">/one.jsp</result>
			<result name="two">/two.jsp</result>
			<result name="three">/three.jsp</result>
			<result name="four">/four.jsp</result>
		</action>
	</package>
</struts>

 它会报出如下的错误:

HTTP Status 500 - com.ye.Show.addDip()

type Exception report

message com.ye.Show.addDip()

description The server encountered an internal error that prevented it from fulfilling this request.

exception

java.lang.NoSuchMethodException: com.ye.Show.addDip()
	java.lang.Class.getMethod(Class.java:1670)
	org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.getActionMethod(AnnotationValidationInterceptor.java:75)
	org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:47)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:148)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:93)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:128)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:104)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:148)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:128)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236)
	org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
	org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:468)
	org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
	org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:76)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.57 logs.

Apache Tomcat/7.0.57

 其中最关键的是这种:java.lang.NoSuchMethodException: com.ye.Show.addDip(),也说是exception下面的这个,它的意思是说方法没有找到。(见附件1);

 

 

所以,对于struts的通配符配方式。它是匹配:按先找到匹配规则。不看* 号那部分。比如上面的 Diplay 和 lay  找到之后,就去匹配  * 号里面的内容。如果匹配成功就执行对应的方法。

下面还是以测试连接为例。

 

看匹配规则1 :  *Diplay这个。它依据 Diplay 这个规则去匹配。之后再去匹配*号,当我们点击对应的链接,比如连接1时,也就是这个<a href="addDiplay">测试方法1</a>,它匹配成功。找到了Action里面的add()这个方法。所以它就执行,之后跳转到one.jsp这个页面。

 

看匹配规则 2 : *lay这个。它先依据  lay  这个规则找到对应Action里面的方法。之后去找 * 号里面对应的方法。 当单击<a href="addDiplay">测试方法1</a>等这些连接时。它匹配的方法就是 addDi等这些方法。因为没有找到,所以它就报出了这个没有方法的异常了。

 

所以综合上面的。它通配符的方式后面不含 *  号的它类似于一个筛选器一样。它先打到对应的匹配规则。之后看审核 * 里面的内容。如果有就匹配里面的内容和Action方法定义的一样的方法名。如果存在就执行匹配成功的方法。如果没有它就抛出一个方法没有找到的异常,也就是NoSuchMethod的这处异常信息。

 

 

附件为对应的代码。

  • 大小: 305.1 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Struts2 动态方法调用(十三)

    在Struts2中,动态方法调用(Dynamic Method Invocation,DMI)是一种特性,允许我们通过URL直接调用Action类的方法,而无需在配置文件中显式指定。这在某些情况下提供了更大的灵活性。 在Struts2的动态方法调用中...

    Struts2动态方法调用

    Struts2作为一款流行的Java Web框架,其动态方法调用(Dynamic Method Invocation,DMI)功能为开发者提供了极大的灵活性。在传统的MVC模式中,控制器(Controller)通常通过硬编码的方式处理请求,而动态方法调用则...

    struts2 动态结果集

    总之,Struts2动态结果集是一个强大的功能,能够帮助开发者更灵活地处理Action的返回结果,提高代码的可维护性和可扩展性。通过深入研究和实践,你可以更好地掌握这一特性,提升你的Struts2开发技能。

    Struts2 与Freemarker 的配置方法

    总结来说,Struts2与Freemarker的配置主要是围绕工程的环境搭建、Struts2的web.xml配置、struts.xml配置以及Freemarker模板的编写展开的。通过这种集成,开发者可以利用Struts2的强大控制逻辑和Freemarker的模板能力...

    struts动态方法配置

    Struts配置文件(struts.xml) Struts 2的核心配置文件是struts.xml,它定义了应用程序的结构和行为。在这个示例中,我们看到一个名为"default"的包被定义,其命名空间为"/login",并继承自"struts-default"。这...

    struts2的属性配置

    在`struts.xml`中配置的属性具有较高的灵活性,可以根据应用需求动态调整。 2. **struts.properties配置**: `struts.properties`文件也是用于配置Struts2框架的,同样位于类路径下。相比于`struts.xml`,它更常用...

    struts2 在eclipse 配置成功

    在Eclipse这个流行的Java集成开发环境中配置Struts2,可以帮助开发者更高效地构建动态Web项目。以下将详细介绍如何在Eclipse中成功配置Struts2。 1. **环境准备**: - 首先确保你的系统上已经安装了Java JDK和...

    Struts2包和配置文件

    4. **Interceptor(拦截器)**:拦截器是Struts2的一大特色,它们是按照预定义的顺序执行的一系列方法调用,可以实现如日志、权限检查、数据校验等功能。 5. **Result(结果)**:定义了Action执行后如何展示结果,...

    一个简单的struts2的手动配置

    手动配置Struts2涉及多个步骤,下面我们将深入探讨这个过程。 首先,我们需要在项目的类路径下添加Struts2的核心库。这通常包括`struts2-core`、`struts2-convention-plugin`、`struts2-json-plugin`等依赖,它们...

    struts2核心配置文件

    ### Struts2核心配置文件详解 #### 一、概述 Struts2框架是Java Web开发领域内一个重要的轻量级框架,它简化了基于MVC(Model-View-Controller)设计模式的应用程序开发过程。在Struts2框架中,有两个核心配置文件...

    Struts 2使用注解配置Action

    在传统的Struts 2应用中,我们通常会通过XML配置文件(struts.xml)来定义Action,包括Action类、结果页面、拦截器等信息。然而,随着Java注解的广泛应用,Struts 2也引入了注解配置的方式来简化开发过程,避免了XML...

    struts2配置文件

    通过上述配置,当访问`http://localhost:8080/struts2Test/struts2/login_isLogin.action`时,Struts2框架将调用`LoginAction`的`isLogin`方法,然后显示与`isLogin`结果匹配的`/login.jsp`页面内容。 总的来说,...

    ·Struts2配置文件介绍 超级详细

    ### Struts2配置文件介绍 #### 一、Struts2的核心配置文件 在Struts2框架中,有多个重要的配置文件用于控制应用的行为与结构,其中最核心的是`struts.xml`文件。此外还包括`web.xml`、`struts.properties`、`...

    struts2基本运行环境配置方法

    ### Struts2基本运行环境配置方法 #### 一、引言 在Java Web开发领域,Struts2框架因其简洁的设计模式、丰富的插件支持以及高度的可扩展性而备受开发者青睐。本文将详细介绍如何在MyEclipse环境中配置Struts2的基本...

    struts2 配置dtd 自动提示

    Struts2是一个流行的Java web应用程序框架,用于构建MVC(模型-视图-控制器)架构的应用。...尽管如此,大部分情况下,这种配置方法是有效的,可以帮助开发者更高效地编写和维护Struts2应用的配置文件。

    struts2所有包和配置文件

    上述配置表示,当用户访问“/login”时,Struts2将调用`com.example.action.LoginAction`类的execute方法,根据执行后的返回值(如"success"或"error"),决定转向哪个页面。 Struts2的jar包包括了框架的各个核心...

    Struts2零配置

    Struts2零配置是Struts2框架的一种简化配置方式,旨在减少XML配置文件的使用,提高开发效率。在传统的Struts2应用中,开发者需要在多个XML文件中配置Action、结果页面、拦截器等,而“零配置”则是对这种繁琐配置的...

    Struts2约定优于配置

    Struts2 约定优于配置 Struts2 框架中,有一个非常重要的概念,即约定优于配置。这个概念的核心思想是,通过约定来减少配置的必要性。Struts2 通过约定优于配置,可以自动映射 Action 路径到 Result 页面路径。 ...

    struts2参数配置

    - **Struts配置文件**:是Struts2的核心配置文件,通常位于`/WEB-INF/struts-config.xml`。 - 配置文件中定义了框架的主要行为,如Action映射、拦截器、结果类型等。 - 通过`struts-config.xml`文件,可以灵活地控制...

Global site tag (gtag.js) - Google Analytics