Struts2配置文件通配符的使用说明
- 格式:docx
- 大小:13.35 KB
- 文档页数:2
一、Struts2配置文件Struts2相关的配置文件有web.xml,struts.xml,struts.properties,struts-default.xml,velocity.properties,struts-default.vm。
其中web.xml,struts.xml是必须的,其它的配置文件可选择。
它们在web应用中的功能如下:web.xml:包含所有必须的框架组件的web部署描述符。
Struts.xml:配置包含result/view类型、action映射、拦截器等的Struts2的主要配置文件。
Struts.properties:配置struts2的框架属性。
Struts-default.xml:在文件在struts-action-x.x.jar中,该文件是应该被包含在struts.xml中的缺省配置。
Welocity.properties:重写了velocity的配置文件。
Struts-default.vm:相对于velocity的缺省配置。
二、Struts2配置元素Struts2核心的配置文件是缺省的struts.xml。
必要的时候,缺省的配置文件可以包含其它的配置文件;struts文件可以放入jar中,并自动插入应用程序,这样每个模块可以包含自己的配置文件并自动配置。
在Freemarker和V elocity 模块中,模板也能从classpath中加载,所以整个模块可以作为一个简单的jar文件被包含。
Struts.xml配置文件可以包含Interceptor、Action类和Results。
Struts.xml配置元素说明:1、PackagesPackages:packages把actions、results、results types、interceptors和interceptor-stacks组装到一个逻辑单元中,从概念上讲,packages就像一个对象,可以被其它子包从写,而且可以拥有自己独立的部分。
1.web.xml文件主要完成对StrutsPrepareAndExecuteFilter的配置(在以前的版本中是对FilterDispatcher配置,新版本同样支持用FilterDispatcher配置),它的实质是一个过滤器,它负责初始化整个Struts框架并且处理所有的请求。
这个过滤器可以包括一些初始化参数,有的参数指定了要加载哪些额外的xml 配置文件,还有的会影响struts框架的行为。
除了StrutsPrepareAndExecuteFilter外,Struts还提供了一个ActionContexCleanUp类,它的主要任务是当有其它一些过滤器要访问一个初始化好了的struts框架的时候,负责处理一些特殊的清除任务。
2.struts.xml文件框架的核心配置文件就是这个默认的struts.xml文件,在这个默认的配置文件里面我们可以根据需要再包括其它一些配置文件。
在通常的应用开发中,我们可能想为每个不同的模块单独配置一个struts.xml文件,这样也利于管理和维护。
这也是我们要配置的主要文件3.struts.properties(参default.properties)在Struts框架使用了很多属性,我们可以通过改变这些属性来满足我们的需求。
要改变这些属性,只需在struts.properties文件中指定属性的key和value即可。
属性文件可以放在任何一个包含在classpath中的路径上,但是通常我们都把它放在/WEB-INF/classes目录下面。
我们可以在struts-default.properties文件中找到一个属性的列表。
4.struts-default.xml此文件是struts2框架默认加载的配置文件,它定义了struts2一些核心bean和拦截器,它会自动包含(included)到struts.xml文件中(实质是通过<package extends="struts-default">),并为我们提供了一些标准的配置。
Struts2⽂件配置介绍Struts2⽂件配置介绍struts2structs.xml⽂件配置标签package标签<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""/dtds/struts-2.3.dtd"><struts><!-- 配置post请求以及repsone的编码格式 --><constant name="struts.i18n.encoding"value="UTF-8"></constant><!-- 配置请求路径的扩展名 --><constant name="struts.action.extension"value="action,,"></constant><!-- 开启热部署 --><constant name="struts.devMode"value="true"></constant><package name="index"namespace="/"extends="struts-default"><action name=""class="erAction"method="toLogin"><result name="toLogin">/WEB-INF/view/login.jsp</result></action></package><include file="com/forward/test/web/action/struts.xml"></include></struts>配置web应⽤的不同模块,⼀般在⼀个功能模块下配置⼀个package,在当前的package下配置这个模块的多个action name属性给不同的模块起不同的名字,随便写,不重复即可namespace属性给不同的模块设置访问的根路径,可以配置成/extends属性表⽰继承, struts-default 是struts2给我们提供的⼀个packageaction标签action 标签表⽰配置⼀个请求name 属性表⽰请求路径的后缀,⼀般表⽰功能模块中的具体请求,name的名字就代表访问路径的名称class 属性表⽰当有请求过来的时候调⽤的是哪个类中的⽅法,配置全类名method 表⽰class 请求调⽤的是class 中的哪个⽅法,指的是具体的⽅法名result标签result 结果配置,⽤于设置不同的⽅法返回值,可以配置不同的返回值对应不同的视图name 属性表⽰结果处理名称,与action中的返回值对应type 属性表⽰指定哪个result 类来处理显⽰的页⾯,默认是内部转发,可以在struts-default 的⽂件中进⾏查看标签体表⽰相对路径,相对于web应⽤开始常量配置默认的常量配置在structs核⼼包中修改常量配置⽅式及加载顺序对于常量的配置, 默认加载的是structs核⼼包中的default.properties,如果通过以下3种进⾏配置,就会按照默认–>1–>2–>3 的顺序加载,后⾯设置的常量会覆盖之前设置的常量1. 在structs.xml⽂件中,在structs的根标签下,书写constant 标签进⾏配置,在项⽬中主要使⽤这种⽅式2. 在src下创建structs.properties⽂件,将内容复制到此⽂件进⾏修改3. 在web.xml⽂件中,配置context-param 第⼀种⽅式第⼆种⽅式第三种⽅式常⽤常量设置struts.i18n.encoding=UTF-8 ⽤于配置接收参数和向外输出中⽂的编码格式⼀般设置为UTF-8struts.action.extension=action, 指定访问action的路径的后缀名,使⽤, 表⽰可以有两个后缀名,可以是action也可以是没有后缀名struts.devMode = false 指定structs是否是以开发模式运⾏,能够⽀持修改配置⽂件后进⾏热部署,所以我们可以将其设置为true动态⽅法调⽤如果⼀个业务模块有多个⽅法,我们可以使⽤动态⽅法调⽤省略action的配置,设置动态⽅法调⽤有两种⽅法⽅法⼀开启动态⽅法调⽤<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>配置action的时候不写method在访问的时候输⼊⽹址http://localhost:8080/webapp/namespace/name!method ⽅法⼆ 通配符⽅式关闭动态⽅法调⽤对于⽅法名可以使⽤⼀个* 通配符,在后⾯的class和method可以使⽤{索引} 来读取前⾯的内容访问路径localhost:8080/webapp/namespace/class_methodstructs2中的默认配置<constant name ="struts.enable.DynamicMethodInvocation" value ="true"></constant><package name ="helloWorld" namespace ="/User" extends ="struts-default"><action name ="d_" class ="com.zhiyou100.struts.web.action.demo3.Demo3Action" ><result name ="success">/hello World.jsp </result></action> </package><package name ="demo3" namespace ="/User" extends ="struts-default"><action name ="*_*" class ="com.zhiyou100.struts.web.action.demo3.{1}" method ="{2}"><result name ="success">/helloWorld.jsp </result></action></package>method的默认值executeresult的默认值是successresult的type的默认值是dispatcherclass的默认值是ActionSupport 其中有execute ⽅法返回值是success配置package下的默认的action,当访问当前包下,如果找不到指定action,就会⾃动寻找默认的action <package name="default"namespace="/user"extends="struts-default"><default-action-ref name="demoAction"></default-action-ref><action name="demoAction"class="erAction"><result>/WEB-INF/view/404.jsp</result></action></package>结果跳转的⽅式结果的跳转⽅式可以通过result的type属性进⾏设置转发转发到指定页⾯对于type属性,默认是dispatcher ,就是转发到响应界⾯,可以不⽤进⾏配置转发到指定action对于type属性需要设置为chain ,并在其下⽅配置<param> 标签<result name="error"type="chain"><param name="namespace">/</param><param name="actionName"></param></result>重定向重定向到指定界⾯对于type属性,设置为redirect ,就是重定向到界⾯,如果需要进⾏重定向就必须进⾏此处的设置<result name="error"type="redirectAction"><param name="namespace">/</param><param name="actionName"></param></result>。
struts2注解使用从struts2.1开始,struts2不再推荐使用Codebehind作为零配置插件,而是改为使用Convention插件来支持零配置,和Codebehind相比,Convention 插件更彻底,该插件完全抛弃配置信息,不仅不需要是使用struts.xml文件进行配置,甚至不需要使用Annotation进行配置,而是由struts2根据约定自动配置。
如何使用Convention1. 将struts-Convention-plugin-2.1.6.jar文件复制到WEB-INF/lib路径下2. 对于Convention插件而言,它会自动搜索位于action,actions,struts,struts2包下的所有java类,Convention插件会把如下两种java类当成Action 处理:1)所有实现了com.opensymphony.xwork2.Action的java类2)所有类名以Action结尾的java类3. Convention插件还允许设置如下三个常量:1)struts.Convention.exclude.packges:指定不扫描哪些包下的java类,位于这些包结构下的java类将不会自动映射成Action;2)struts.convention.package.locators:Convention插件使用该常量指定的包作为搜寻Action的根包。
对于actions.fore.LoginAction类,按约定原本应映射到/fore/login;如果将该常量设为fore,则该Action将会映射到/login 3)struts.convention.action.packages:Convention插件以该常量指定包作为根包来搜索Action类。
Convention插件除了扫描action,actions,struts,struts2四个包的类以外,还会扫描该常量指定的一个或多个包,Convention会试图从中发现Action类。
struts2中struts.xml配置⽂件详解struts.xml的常⽤配置<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "/dtds/struts-2.3.dtd"><struts><!-- 所有匹配*.action的请求都由struts2处理 --><constant name="struts.action.extension" value="action"/><!-- 是否启⽤开发模式 --><constant name="struts.devMode" value="true"/><!-- struts配置⽂件改动后,是否重新加载 --><constant name="struts.configuration.xml.reload" value="true"/><!-- 设置浏览器是否缓存静态内容 --><constant name="struts.serve.static.browserCache" value="false"/><!-- 请求参数的编码⽅式 --><constant name="struts.i18n.encoding" value="utf-8"/><!-- 每次HTTP请求系统都重新加载资源⽂件,有助于开发 --><constant name="struts.i18n.reload" value="true"/><!-- ⽂件上传最⼤值 --><constant name="struts.multipart.maxSize" value="104857600"/><!-- 让struts2⽀持动态⽅法调⽤ --><constant name="struts.enable.DynamicMethodInvocation" value="true"/><!-- Action名称中是否还是⽤斜线 --><constant name="struts.enable.SlashesInActionNames" value="false"/><!-- 允许标签中使⽤表达式语法 --><constant name="struts.tag.altSyntax" value="true"/><!-- 对于WebLogic,Orion,OC4J此属性应该设置成true --><constant name="struts.dispatcher.parametersWorkaround" value="false"/><package name="basePackage" extends="struts-default"></package></struts><?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "/dtds/struts-2.0.dtd" ><struts><!-- include节点是struts2中组件化的⽅式可以将每个功能模块独⽴到⼀个xml配置⽂件中然后⽤include节点引⽤ --><include file="struts-default.xml"></include><!-- package提供了将多个Action组织为⼀个模块的⽅式package的名字必须是唯⼀的 package可以扩展当⼀个package扩展⾃另⼀个package时该package会在本⾝配置的基础上加⼊扩展的package的配置⽗package必须在⼦package前配置name:package名称extends:继承的⽗package名称abstract:设置package的属性为抽象的抽象的package不能定义action 值true:falsenamespace:定义package命名空间该命名空间影响到url的地址,例如此命名空间为/test那么访问是的地址为http://localhost:8080/struts2/test/XX.action --><package name="com.kay.struts2" extends="struts-default" namespace="/test"><interceptors><!-- 定义拦截器name:拦截器名称class:拦截器类路径--><interceptor name="timer" class="com.kay.timer"></interceptor><interceptor name="logger" class="com.kay.logger"></interceptor><!-- 定义拦截器栈 --><interceptor-stack name="mystack"><interceptor-ref name="timer"></interceptor-ref><interceptor-ref name="logger"></interceptor-ref></interceptor-stack></interceptors><!-- 定义默认的拦截器每个Action都会⾃动引⽤如果Action中引⽤了其它的拦截器默认的拦截器将⽆效 --><default-interceptor-ref name="mystack"></default-interceptor-ref><!-- 全局results配置 --><global-results><result name="input">/error.jsp</result></global-results><!-- Action配置⼀个Action可以被多次映射(只要action配置中的name不同)name:action名称class: 对应的类的路径method: 调⽤Action中的⽅法名--><action name="hello" class="com.kay.struts2.Action.LoginAction"><!-- 引⽤拦截器name:拦截器名称或拦截器栈名称--><interceptor-ref name="timer"></interceptor-ref><!-- 节点配置name : result名称和Action中返回的值相同type : result类型不写则选⽤superpackage的type struts-default.xml中的默认为dispatcher--><result name="success" type="dispatcher">/talk.jsp</result><!-- 参数设置name:对应Action中的get/set⽅法--><param name="url"></param></action></package></struts>⼀个Action内包含多个请求处理⽅法的处理Struts1提供了DispatchAction,从⽽允许⼀个Action内包含多个请求处理⽅法。
struts2通配符的使用详解(5篇)第一篇:struts2通配符的使用详解struts2的配置文件是 struts.xml..在这个配置文件里面可以使用通配符..其中的好处就是,大大减少了配置文件的内容..当然,相应付出的代价是可读性..使用通配符的原则是约定高于配置.在项目中,我们有很多的命名规则是约定的...我们使用通配符那就必须有一个统一的约定.否则通配符将无法成立看下面的例子.(1)先看我们的action配置/user_{1}.jsp 带红字的解释下,第一个带“*” 表示的是后面匹配任意字符...这个很容易理解{1}表示的是第一个“*”的内容...注意,这里的大括号,比如,如果是user_add.那么{1}就是表示add..当然,这里只有一个“*”.你可以有两个,甚至三个四个..比如这样写*_* 这样就是两个“*”.那么我们也可以用{1},{2}来分别的表示他们.(2)对应的action 内容package com.test.action;importcom.opensymphony.xwork2.ActionSupport;@SuppressWarnings (“serial”)public class UserAction extends ActionSupport { public String add(){ return SUCCESS;} public String delete(){ return SUCCESS;} public String update(){ return SUCCESS;} public String select(){ return SUCCESS;} } 因为是举例子,所以每个方法里面都没实现内容(3)其他就是几个jsp页面.其中user_*.jsp页面没什么好说的,就是显示一句话.比如user_add.jsp就是显示“这是添加页面” 其他的类似.就是为了让我们看到已经跳转到对应的页面.index.jsp写一下<%@ page language=“java” contentType=“text/html;charset=UTF-8”pageEncoding=“UTF-8”%> <% Str ing path = request.getContextPath();String basePath = request.getScheme()+“://”+request.getServerName()+“:”+request.getServerPort()+path+“/”;%>”>添加页面删除页面修改页面查找页面第二篇:action通配符首先,看一个struts2的配置文件:Java代码1.2.3./Student{1}_success.jsp4.5.这里,“{1}”表示第1个*,例如,当请求以下路径时:引用*为add,因此method=“add”,返回的页面为/Studentadd_success.jsp 即实际调用的是StudentAction中的add 方法。
2.Struts2配置⽂件1.配置⽂件的加载顺序0. 需要掌握* 加载了哪些个配置⽂件(重点的)* 配置⽂件的名称是什么* 配置⽂件的位置* 配置⽂件的作⽤1. Struts2框架的核⼼是StrutsPrepareAndExecuteFilter过滤器,该过滤器有两个功能* Prepare -- 预处理,加载核⼼的配置⽂件* Execute -- 执⾏,让部分拦截器执⾏2. StrutsPrepareAndExecuteFilter过滤器会加载哪些配置⽂件呢?* 通过源代码可以看到具体加载的配置⽂件和加载配置⽂件的顺序* init_DefaultProperties(); -- 加载org/apache/struts2/default.properties* init_TraditionalXmlConfigurations(); -- 加载struts-default.xml,struts-plugin.xml,struts.xml* init_LegacyStrutsProperties(); -- 加载⾃定义的struts.properties.* init_CustomConfigurationProviders(); -- 加载⽤户⾃定义配置提供者* init_FilterInitParameters() ; -- 加载web.xml3. 重点了解的配置⽂件* default.properties -- 在org/apache/struts2/⽬录下,代表的是配置的是Struts2的常量的值* struts-default.xml -- 在Struts2的核⼼包下,代表的是Struts2核⼼功能的配置(Bean、拦截器、结果类型等)* struts.xml -- 重点中的重点配置,代表WEB应⽤的默认配置,在⼯作中,基本就配置它就可以了!!(可以配置常量)* web.xml -- 配置前端控制器(可以配置常量)* 注意:* 前3个配置⽂件是struts2框架的默认配置⽂件,基本不⽤修改。
struts2注解总结----@Action和@Result除了使⽤配置⽂件配置之外,还能够使⽤注解来配置以下是⼀些经常使⽤的注解介绍:@Action/@Actions:@Action指定⼀个类为action,相应配置⽂件⾥的<action>....</action>标签,当中能够配置例如以下属性1. results:配置返回的结果集属性,相当于struts2中的<result>列表,能够在{}中配置属性,详细例如以下2. value:配置action的名字,相当于<action>中的name属性3. interceptorRefs:配置拦截器@Action能够定义在类上,也能够定义在⽅法上例如以下(@Result的作⽤后⾯讲,也能够和后⾯的配合着看)@Action(value = "testAction",results = {@Result(name="success",location="/success.jsp")})public class testAction extends ActionSupport {@Overridepublic String execute() throws Exception {return SUCCESS;}}这就相当于例如以下的xml配置<action name="testAction" class="struts2.action.testAction"><result name="success">/success.jsp</result></action>在xml配置中假设name不写,那么默认就是success,在注解中也是,假设results中的name不写。
为Struts 2.0做好准备Struts作为MVC 2的Web框架,自推出以来不断受到开发者的追捧,得到用广泛的应用。
作为最成功的Web框架,Struts自然拥有众多的优点:∙MVC 2模型的使用∙功能齐全的标志库(Tag Library)∙开放源代码但是,所谓“金无赤金,人无完人”,Struts自身也有不少的缺点:∙需要编写的代码过多,容易引起“类爆炸”∙单元测试困难这些缺点随着Web的发展越来越明显。
这就促生了Struts 2.0,它的诞生能很好的解决上述问题。
好啦,废话就不多说了,现在就让我们感受一下的Struts 2.0的魅力吧。
1.搭建开发和运行环境1.到Apache下载Struts2.0包2.打开Eclipse3.2新建Web工程点击菜单File\New\Project,出现如图1所示对话框图1 新建工程对话框选择Web\Dynamic Web Project,点击“Next”,出现图2对话框在“Project Nam e”中键入Struts2_HelloWorld,点击“New”,出现以下对话框选择“Apache\Apache Tom at v5.5”,点击“Next”,出现以下对话框图4新建服务器运行时对话框点击“Finish”,关闭对话框。
3.将Struts 2.0 lib下的jar文件加到工程的构建路径(build path)图5 Struts 2.0的lib目录按ctr+a全选,复制,再转到Eclipse窗口,在“Project Explorer”子窗口中选中Struts2_HelloWorld\WebContent\WEB-INF\lib,然后粘贴。
经过Eclipse自动刷新“Project Explorer”子窗口,刚才所粘贴的jar文件应该会出现在Struts2_HelloWorld\Java Resources: src\Libraries\Web App Libraries下,如图6所示:图6 Project Explorer子窗口4.打开web.xml文件,将其修改为以下代码:<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-app PUBLIC "-//Sun Microsystem s, Inc.//DTD Web Application 2.3//EN" "/dtd/web-app_2_3.dtd"><web-app><display-nam e>Struts 2.0 Hello World</display-nam e><filter><filter-name>struts2</filter-nam e><filter-class>org.a pache.struts2.dispatcher.FilterDispatcher</filter-class></filter><filter-m apping><filter-name>struts2</filter-nam e><url-pattern>/*</url-pattern></filter-m apping><welcom e-file-list><welcom e-file>index.ht ml</welcom e-file></welcom e-file-list></web-app>5.新建struts.xml文件右键点击,Struts2_HelloWorld\Java Resources: src,出现如图7所示菜单图7 新建Other菜单点击“Other”,出现新建对话框,如图8所示图8 新建对话框点击“Next”,出现新建文件对话框,如图9所示图9 新建文件对话框在“File nam e”中键入sturts.xml,点击“Finish”,然后将struts.xml的内容修改为:<!DOCTYPE struts PUBLICn 2.0//EN""/dtds/struts-2.0.dtd"><struts><include file="struts-default.xml"/>6.新建index.ht ml文件右键点击Struts2_HelloWorld\WebContent,出现如图10所示的菜单图10 新建Other菜单点击“Other”,出现新建对话框,如图11所示选择Web\HTML,点击“Next”出现如图12所示的对话框图12 新建HTML页面对话框在“File Name”中键入index.ht ml,点击“Next”,出现如图13所示的对话框图13 模板选择对话框点击“Finish”,将index.ht ml的内容修改为以下内容:/EN"><ht ml><head>UTF-8"><t itle>Hello World</title></head><body><h3>Hello World!</h3></body></ht ml>7.将应用程序打包到tom cat上右键点击Struts_HelloWorld,出现如图14所示的菜单图14 工程菜单点击“Export\WAR file”,出现如图15所示的对话框图15 输出对话框选择“Web\WAR file”,点击“Next”,出现如图16所示的对话框图16 输出路径对话框输入war文件的路径(如%tom cat%\webapps\Struts2_HelloWorld.war),点击“Finish”关闭对话框。
Struts 2框架有两个核心配置文件,struts.xml和struts.properties,其中struts.x ml文件主要负责管理应用中的Action映射,以及该Action包含的Result定义等。
除此之外,Struts 2框架还包含一个struts.properties文件,该文件定义了Struts 2框架的大量属性,开发者可以通过改变这些属性来满足应用的需求。
struts.properties文件是一个标准的Properties文件,该文件包含了系列的key-value对象,每个key就是一个Struts 2属性,该key对应的value就是一个S truts 2属性值。
struts.properties文件通常放在Web应用的WEB-INF/classes路径下。
实际上,只要将该文件放在Web应用的CLASSPATH路径下,Struts 2框架就可以加载该文件。
其实,struts.properties文件的内容均可在struts.xml中以<constant na me="" value=""></constant>加下面将该文件的配置参数详细列举出来,方便大家查看;struts.configuration该属性指定加载Struts 2配置文件的配置文件管理器。
该属性的默认值是org.apache. Struts2.config.DefaultConfiguration,这是Struts 2默认的配置文件管理器。
如果需要实现自己的配置管理器,开发者则可以实现一个实现Configuration接口的类,该类可以自己加载Struts 2配置文件。
struts.locale指定Web应用的默认Locale。
struts.i18n.encoding指定Web应用的默认编码集。
该属性对于处理中文请求参数非常有用,对于获取中文请求参数值,应该将该属性值设置为GBK或者GB2312。
struts2 action method 通配符父类方法在Struts2中,可以使用通配符来匹配action方法。
如果一个Action类继承自另一个Action类,并且想要在子类中复用父类的方法,则可以使用通配符来匹配父类的方法。
例如,假设有一个父类Action类如下:```javapublic class BaseAction {public String execute() {// 执行一些共同的逻辑return "success";}}```然后,有一个子类Action类如下:```javapublic class ChildAction extends BaseAction {// 子类中可以复用父类的方法public String save() {// 执行一些子类特定的逻辑return "success";}}```在Struts2的配置文件中,可以使用通配符来匹配父类的execute方法:```xml<action name="childAction_*" class="com.example.ChildAction" method="{1}"><result>/result.jsp</result></action>```上述配置中,name属性使用了通配符"childAction_*",其中"_"表示匹配一个字符,{1}表示将匹配到的字符作为方法名传递给action类。
这样,当请求的URL匹配到"childAction_save"时,Struts2会调用ChildAction类的execute方法,从而复用父类的execute 方法,最后返回"success"结果。
Struts2的通配符配置⽅式Struts2的Action类很有意思,你可以使⽤3种⽅式来实现具体的Action类:1. 让你的Action类继承⾃ActionSupport类(项⽬中最常⽤这种⽅式,因为ActionSupport类中定义了很多帮助⽅法)2. 让你的Action类实现Action接⼝3. 使⽤POJO的⽅式来实现,只要Action类中有⼀个返回值为String的execute⽅法就好了(这种⽅式使Action类最容易被测试)以上三种Action的实现⽅式都可以被struts2框架⾃动识别,如果你在struts.xml⾥⾯配置了⼀个action块但是没有配置action类的路径,这样框架默认使⽤ActionSupport来处理请求。
但是在实际使⽤struts2的过程中我发现了⼀个问题,⼀个Action只有⼀个execute⽅法来处理⼀类请求,如果我开发的某块功能有100个不同的请求那我岂不是要写100个Action类,每个类实现⼀个execute⽅法,这样虽然满⾜了⼀个类⼀个责任的设计原则,但是会不会造成“类爆炸”?后来看了struts2的⽂档才知道,其实我们可以使⽤struts2灵活的通配符配置来达到减少action类的⽬的:先来看看⼀个简单的时序图请求从这个页⾯发起,只是简单的两个链接<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><a href="infoadd">ADD INFO</a><br><a href="infodel">DEL INFO</a><br></body></html>请求的控制转发是在struts.xml⾥⾯配置的<struts><constant name="struts.enable.DynamicMethodInvocation" value="true"/><package name="mypack" extends="struts-default"><action name="info*" class="com.stone.struts2.action.MyFirstAction" method="{1}"><result>/{1}info.jsp</result><allowed-methods>add,del</allowed-methods></action></package></struts>上⾯这个XML的配置内容有⼏点需要注意:1. 我开启了struts2的RMI,apache struts基于安全性考虑,RMI默认是关闭的。
Struts2配置文件中使用通配符收藏
形式一:调用相同Action中的不同方法
<action name="*Action" class="Jcuckoo.LoginRegistAction" method="{1}">
<result name="input">/login.jsp</result>
<result name="error">/error.jsp</result>
<result name="success">/welcome.jsp</result>
</action>
其中表达式{1}的值name属性值中第一个*的值。
如果用户请求的URL为loginAction.action,则调用Jcuckoo.LoginRegistAction中的login方法;
如果用户请求的URL为registerAction.action,则调用Jcuckoo.LoginRegistAction中的register方法;形式二:通过匹配,调用不同的Action的execute方法
<action name="*Action" class="Jcuckoo.{1}Action">
<result name="input">/login.jsp</result>
<result name="error">/error.jsp</result>
<result name="success">/welcome.jsp</result>
</action>
上面没有出现method属性,故默认调用对应的execute方法
如果用户请求的URL为LoginAction.action,则调用Jcuckoo.LoginAction中的execute方法;
如果用户请求的URL为RegisterAction.action,则调用Jcuckoo.RegisterAction中的execute方法;
形式三:动态结果
<action name="crud_*" class="Jcuckoo.CrudAction" method="{1}">
<result name="input">/input.jsp</result>
<result>/{1}.jsp</result>
</action>
当处理结果是input时,会转到/input.jsp页面
当处理结果是success时,
如果crud_create.action,则会执行Jcuckoo.CrudAction中的create方法,并且跳转到/create.jsp;
如果crud_delete.action,则会执行Jcuckoo.CrudAction中的delete方法,并且跳转到/delete.jsp;。