当前使用的版本是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的这处异常信息。
附件为对应的代码。
相关推荐
在Struts2中,动态方法调用(Dynamic Method Invocation,DMI)是一种特性,允许我们通过URL直接调用Action类的方法,而无需在配置文件中显式指定。这在某些情况下提供了更大的灵活性。 在Struts2的动态方法调用中...
Struts2作为一款流行的Java Web框架,其动态方法调用(Dynamic Method Invocation,DMI)功能为开发者提供了极大的灵活性。在传统的MVC模式中,控制器(Controller)通常通过硬编码的方式处理请求,而动态方法调用则...
总之,Struts2动态结果集是一个强大的功能,能够帮助开发者更灵活地处理Action的返回结果,提高代码的可维护性和可扩展性。通过深入研究和实践,你可以更好地掌握这一特性,提升你的Struts2开发技能。
总结来说,Struts2与Freemarker的配置主要是围绕工程的环境搭建、Struts2的web.xml配置、struts.xml配置以及Freemarker模板的编写展开的。通过这种集成,开发者可以利用Struts2的强大控制逻辑和Freemarker的模板能力...
Struts配置文件(struts.xml) Struts 2的核心配置文件是struts.xml,它定义了应用程序的结构和行为。在这个示例中,我们看到一个名为"default"的包被定义,其命名空间为"/login",并继承自"struts-default"。这...
在`struts.xml`中配置的属性具有较高的灵活性,可以根据应用需求动态调整。 2. **struts.properties配置**: `struts.properties`文件也是用于配置Struts2框架的,同样位于类路径下。相比于`struts.xml`,它更常用...
在Eclipse这个流行的Java集成开发环境中配置Struts2,可以帮助开发者更高效地构建动态Web项目。以下将详细介绍如何在Eclipse中成功配置Struts2。 1. **环境准备**: - 首先确保你的系统上已经安装了Java JDK和...
4. **Interceptor(拦截器)**:拦截器是Struts2的一大特色,它们是按照预定义的顺序执行的一系列方法调用,可以实现如日志、权限检查、数据校验等功能。 5. **Result(结果)**:定义了Action执行后如何展示结果,...
手动配置Struts2涉及多个步骤,下面我们将深入探讨这个过程。 首先,我们需要在项目的类路径下添加Struts2的核心库。这通常包括`struts2-core`、`struts2-convention-plugin`、`struts2-json-plugin`等依赖,它们...
### Struts2核心配置文件详解 #### 一、概述 Struts2框架是Java Web开发领域内一个重要的轻量级框架,它简化了基于MVC(Model-View-Controller)设计模式的应用程序开发过程。在Struts2框架中,有两个核心配置文件...
在传统的Struts 2应用中,我们通常会通过XML配置文件(struts.xml)来定义Action,包括Action类、结果页面、拦截器等信息。然而,随着Java注解的广泛应用,Struts 2也引入了注解配置的方式来简化开发过程,避免了XML...
通过上述配置,当访问`http://localhost:8080/struts2Test/struts2/login_isLogin.action`时,Struts2框架将调用`LoginAction`的`isLogin`方法,然后显示与`isLogin`结果匹配的`/login.jsp`页面内容。 总的来说,...
### Struts2配置文件介绍 #### 一、Struts2的核心配置文件 在Struts2框架中,有多个重要的配置文件用于控制应用的行为与结构,其中最核心的是`struts.xml`文件。此外还包括`web.xml`、`struts.properties`、`...
### Struts2基本运行环境配置方法 #### 一、引言 在Java Web开发领域,Struts2框架因其简洁的设计模式、丰富的插件支持以及高度的可扩展性而备受开发者青睐。本文将详细介绍如何在MyEclipse环境中配置Struts2的基本...
Struts2是一个流行的Java web应用程序框架,用于构建MVC(模型-视图-控制器)架构的应用。...尽管如此,大部分情况下,这种配置方法是有效的,可以帮助开发者更高效地编写和维护Struts2应用的配置文件。
上述配置表示,当用户访问“/login”时,Struts2将调用`com.example.action.LoginAction`类的execute方法,根据执行后的返回值(如"success"或"error"),决定转向哪个页面。 Struts2的jar包包括了框架的各个核心...
Struts2零配置是Struts2框架的一种简化配置方式,旨在减少XML配置文件的使用,提高开发效率。在传统的Struts2应用中,开发者需要在多个XML文件中配置Action、结果页面、拦截器等,而“零配置”则是对这种繁琐配置的...
Struts2 约定优于配置 Struts2 框架中,有一个非常重要的概念,即约定优于配置。这个概念的核心思想是,通过约定来减少配置的必要性。Struts2 通过约定优于配置,可以自动映射 Action 路径到 Result 页面路径。 ...
- **Struts配置文件**:是Struts2的核心配置文件,通常位于`/WEB-INF/struts-config.xml`。 - 配置文件中定义了框架的主要行为,如Action映射、拦截器、结果类型等。 - 通过`struts-config.xml`文件,可以灵活地控制...