struts_action静动态方法的调用
Struts2动态方法调用

在使用Struts2框架进行开发的时候,首先是要配置web.xml 文件,这样我们就可以将整个框架加载到web应用当中。
其次我们需要编写Action类即是也逻辑控制器类,该类的相关属性是用来接收从页面传递过来的参数;然后在struts.xml文件中对Action类进行配置,其中在<struts>标签有一个<action>子标签,<action>标签中有name属性和class属性,其中name值指定了Action类的访问路径,class值指明了给Action类的类路径。
当我们配置好了之后就可以在客户端页面中的<form action=“”>表单中通过action的属性值设置,就可以访问到我们的这个Action类,从而进行相应的操作。
值得注意的是:1、如果Action类中只有一个方法,那么这个方法必须以execute命名,并带有String类型的返回值,如果不是以execute 命名的话,当我们在<form action=“”>表单中设置action=“login.action”就会报出:ng.NoSuchMethodException: test.loginAction.execute()的异常。
注意,当我们使用action=“login.action”时候,就是默认的调用Action类中的public String execute( )方法,所以如果没有该方法,自然会报出异常信息。
2、有的时候我们的Action类中为了处理更多的信息,注意就不会只有一个方法,而是有很多个方法,那么我们该如果在Struts2的框架下来动态的调用这些方法呢,准确的说是正确的调用我们指定的方法呢?假如说我们的Action类,也就是业务逻辑控制器,其中还有两个方法:一个是登录的方法login(),另一个是注册的方法register()。
那么我们该如何分别调用这两个方法呢?如下代码:public class loginAction {private String username;private String password;private String repassword;private String tip;// 登录的方法public String login() {if (username.equals("admin") && password.equals("123")) { setTip("login登录成功!");return"login_success";} else {setTip("登录失败!");return"error";}}// 注册的方法public String register() {if (password.equals(repassword)) {setTip("register注册成功!");return"register_success";} else {setTip("注册失败!");return"error";}}struts.xml:<action name="login" class="test.loginAction"><result name="login_success">/page/login_success.jsp</result><resultname="register_success">/page/register_success.jsp </result><result name="error">/page/error.jsp</result></action>此时我们在<form action=””>表单中,只要将action的属性设置为aciotn=”login!login.action”就可以访问到我们的这个login()方法了。
struts2中使用注解配置Action方法详解

struts2中使⽤注解配置Action⽅法详解使⽤注解来配置Action可以实现零配置,零配置将从基于纯XML的配置转化为基于注解的配置。
使⽤注解,可以在⼤多数情况下避免使⽤struts.xml⽂件来进⾏配置。
struts2框架提供了四个与Action相关的注解类型,分别为ParentPackage、Namespace、Result和Action。
ParentPackage:ParentPackage注解⽤于指定Action所在的包要继承的⽗包。
该注解只有⼀个value参数。
⽤于指定要继承的⽗包。
⽰例:使⽤ParentPackage注解,其value值为mypackage,表⽰所在的Action需要继承mypackage包,@ParentPackage(value="mypackage")public class UserAction extends ActionSupport{}如果注解中只有⼀个value参数值,或者其他参数值都使⽤默认值时,则可以对value参数设置进⾏简写,⽐如上述的代码:@ParentPackage("mypackage")public class UserAction extends ActionSupport{}把struts2-convention-pligin-2.x.x.jar包导⼊到web应⽤中,才能在Action类中使⽤注解。
Namespace:Namespace注解⽤于指定Action所在的包的命名空间。
该注解只有⼀个value参数,⽤于指定ACtion所属于的命名空间。
当使⽤Namespace注解时,在为命名空间取名需要使⽤斜杠(/)开头。
使⽤Namespace注解,指定其Action所在的包的命名空间为/user:@Namespace("/user")public class UserAction extends ActionSupport{}Result:Result注解⽤于定义⼀个Result映射,该注解包含四个参数,1)name:可选参数,⽤于指定Result的逻辑名,默认值为success2)location:必选参数,⽤于指定Result对应资源的URL3)type:可选参数,⽤于指定Result的类型,默认值为NullResult.class4)params:可选参数,⽤于为Result指定要传递的参数,格式为:{key1,value1,key2,value2,...}如果type参数的值为NullResult.class,那么struts2框架在解析Result配置时,会使⽤默认的结果类型(即ServletDispatcherResult)来替换NullResult。
Struts2中 struts.xml的Action配置详解

Struts2中struts.xml的Action配置详解使用package可以将逻辑上相关的一组Action,Result,Interceptor等组件分为一组,Package 有些像对象,可以继承其他的Package,也可以被其他package继承,甚至可以定义抽象的Package。
由于struts.xml文件是自上而下解析的,所以被继承的package要放在继承package的前边。
Namespace将action分成逻辑上的不同模块,每一个模块有自己独立的前缀。
使用name space可以有效的避免action重名的冲突,例如每一个package都可以有自己独立的Men u和Help action,但是事项方式各有不同。
Struts2标签带有namespace选项,可以根据namespace的不同向服务器提交不同的package的action的请求。
“/”表示根namespace,所有直接在应用程序上下文环境下的请求(Context)都在这个pa ckage中查找。
“”表示默认namespace,当所有的namespace中都找不到的时候就在这个namespace中寻找。
例如,有如下配置:CODE:<package name="default"><action name="foo" class="mypackage.simpleAction><result name="success" type="dispatcher">greeting.jsp</result></action><action name="bar" class="mypackage.simpleAction"><result name="success" type="dispatcher">bar1.jsp</result></action></package><package name="mypackage1" namespace="/"><action name="moo" class="mypackage.simpleAction"><result name="success" type="dispatcher">moo.jsp</result></action></package><package name="mypackage2" namespace="/barspace"><action name="bar" class="mypackage.simpleAction"><result name="success" type="dispatcher">bar2.jsp</result></action></package>1 如果请求为/barspace/bar.action查找namespace:/barspace,如果找到bar则执行对应的action,否则将会查找默认的n amespace,在上面的例子中,在barspace中存在名字为bar的action,所以这个action 将会被执行,如果返回结果为success,则画面将定为到bar2.jsp2 如果请求为/moo.action根namespace('/')被查找,如果moo action存在则执行,否则查询默认的namespace,上面的例子中,根namespace中存在moo action,所以该action被调用,返回success 的情况下画面将定位到moo.jsp、Action配置在struts2框架中每一个Action是一个工作单元。
2、Struts2输入校验及动态方法调用

Struts2.11.动态方法调用一、提交是通过<form action="user!login.action">,表示提交到Action为user的Action的login方法去处理。
所以UserAction需要写public Stringlogin() throws Exception{…}方法.二、为Action指定method属性。
如:<form action="login.action"><action name="login" class="erAction"method="login">…</action>。
缺点:冗余三、使用通配符。
如:<action name="*Action" class="erAction"method="{1}"><result name="error">/error.jsp</result><result name="success">/success.jsp</result></action>或<action name="*_*" class="struts.action.{1}Action"method="{2}"><result name="{2}">/{2}.jsp</result><result name="error">/error.jsp</result><result name="success">/success.jsp</result></action>2.Struts2输入校验输入校验流程:1. 类型转换器负责对字符串的请求参数执行类型转换。
第二章 Action及其动态调用

– 使用域模型方式接收用户请求参数
• 使用相应的实体对象接收用户请求 • 如:在用户登录中,可以使用实体类User接收参数
– 使用域模型驱动(ModelDriven)方式接收请求参数
• 通过实现ModelDriven,使用域模型
使用Action属性接收参数
• 创建域模型:
使用Action属性接收参数
第二章 Action及其动态调用
上节回顾
• • • • MVC总结与回顾 框架的概念 Struts概述 Struts2应用程序及其执行流程
主要内容
• Struts2执行流程 • Action
– Action接口 – ActionSupport类
• 动态方法调用(DMI) • 通配符的使用 • Result的配置
Struts 2访问Servlet API
• 与Servlet API耦合的访问方式
public class LoginAction { ServletContext private •static final StringgetServletContext() CURRENT_USER = "CURRENT_USER"; … //省略 、password属性及其 setter和getter方法 • username HttpServletResponse getResponse() 获取session public String execute() { • HttpServletRequest getRequest() if("jbit".equals(username) && "bdqn".equals(password)) { session = null; • HttpSession 通过request.getSession() 获取session对象 session = ServletActionContext.getRequest().getSession(); if(session.getAttribute(CURRENT_USER) != null) { – 通过 xxx.setAttribute()和xxx.getAttribute() 功能,在不 session.removeAttribute(CURRENT_USER); 同的页面或 Action中传递数据 } session.setAttribute(CURRENT_USER, username); return "success"; } else { return "fail"; 将用户名存入session } } }
struts2_超链接与action使用

Struts2 超链接和 action 使用Struts2.0 链接标签Web 应用区别于普通的站点之处在于Web 应用可以创建一个动态的响应。
为了使从一个页面中链接一个动态数据变得简单,Struts2 框架提供了一系列的标签。
Struts 标签的一种用法是创建链接到其他 Web 资源,特别是针对那些在本地应用中的资源。
1.普通链接Web 程序中最普通的应用是链接到其他页面,下面看 Welcome.jsp。
<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %><html><head><title>Welcome</title><link href="<s:url value="/css/tutorial.css"/>" rel="stylesheet"type="text/css"/></head><body><h3>Commands</h3><ul><li><a href="<s:url action="Login_input"/>">Sign On</a></li><li><a href="<s:url action="Register"/>">Register</a></li></ul></body></html>1.1 说明1.<%@ taglib prefix="s" uri="/struts -tags" %>此句表示导入 struts 标签,并以 s 为前缀。
Struts新手详解【6】_Struts页面转发控制ActionForward和ActionMapping

Struts旅程(六)Struts页面转发控制ActionForward和ActionMapping 上篇讲述了struts控制器Action和DispatchAction以及LookupDispatchAction,本篇主要说说struts中的页面转发控制,struts提供了ActionForward和ActionMapping两个类来控制页面转发。
ActionForward在使用struts框架开发web应用程序时,Action在完成用户逻辑处理后,需要把处理结果展示给用户,这个时候就需要程序控制页面的转发,在struts中使用ActionForward对象控制程序转向。
ActonForward对象是一种配置对象,代表了一般的web资源,可以是jsp页面,servlet以及其他的Action,ActonForward对象映射的是struts配置文件struts-config.xml中的<forward>元素,在这个元素中封装了目标页面的URI。
ActionForward 是struts中的核心类,以下主要参数。
(1)Name属性:指定ActionForward名称,在其他类中也可以通过这个名字调用ActionForward。
(2)Path属性:指明了ActionForward对应的URI。
(3)redirect属性:属性设置为true时被设置为重定向,默认false。
在struts中ActionForward有全局转发ActionForward和局部转发ActionForward,全局ActionForward应用于全部的Action和局部的转发仅仅对于当前的Action有效。
例如对用户登录的判断,提交表单后,把用户登录信息保存到session 中,然后设置<forward>中redirect为true,设置为重定向方式,然后再进行判断<actionpath="/must_login" type="com.bjpowernode.struts.MustLoginAction"><forwardname="login" path="/login.jsp"redirect="true"/> </action>这样当用户已经登录的时候会给出提示已经登录。
Struts常用action作用和用法

Struts常用action作用和用法Struts中提供了几种比较通用的action,这些action使用方便灵活,配置简单。
它们的继承关系如下图所示。
我们完全可以使用这些现成的action,没有必要重复制造轮子。
下面主要介绍我整理的这些action的作用和使用方法,适合于对struts有一定了解人员,欢迎批评指正。
1、ForwardAction(1)作用用于转发请求,相当于JSP中的<jsp:forward>。
MVC设计原则是控制器负责处理所有请求,然后选择适当的视图组件返回给用户。
在Struts应用中,应尽量避免直接链接JSP资源,否则将脱离控制器的控制,比如:<jsp:forward page=”../xx.jsp”>、<a href=”../xx.jsp”>、<html:link page=”../xx.jsp”>。
Struts控制器具有预处理请求功能,它能够选择正确的子应用模块来处理请求,把子应用模块的ModuleConfig和MessageResourc es对象存放在request范围内。
使用ForwardAction,请求转发的目标Web组件就可以正常地访问ModuleConfig和MessageResources对象。
(2)使用方法ActionServlet把请求转发给ForwardAction,ForwardAction再把请求转发给<action>元素中parameter属性指定的Web组件。
在struts-config.xml中配置相应的action就可以了,parameter是要转向到的url地址,如下所示。
<action path="/forwardIndex"type="org.apache.struts.actions.ForwardAction"parameter="/index.jsp"/>当请求“/forwardIndex”它就把控制跳转到parameter所指的“/index.jsp”2、IncludeAction(1)作用用于包含其他Web组件,相当于JSP中的<jsp:include>。
struts2 中action 如何获取jsp 页面参数1

struts2 中action 如何获取jsp 页面参数1. ActionContext1. ActionContext在Struts2 开发中,除了将请求参数自动设置到Action 的字段中,我们往往也需要在Action 里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直接对JavaServlet Http 的请求(HttpServletRequest),响应(HttpServletResponse)操作. 我们需要在Action 中取得request 请求参数"username"的值:ActionContext context = ActionContext.getContext();Map params = context.getParameters();String username = (String) params.get("username");ActionContext(com.opensymphony.xwork.ActionContext)是Action 执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map 而已),它存放的是Action 在执行时需要用到的对象.一般情况, 我们的ActionContext 都是通过: ActionContext context = (ActionContext) actionContext.get();来获取的.我们再来看看这里的actionContext 对象的创建:static ThreadLocal actionContext = new ActionContextThreadLocal(); ActionContextThreadLocal 是实现ThreadLocal 的一个内部类.ThreadLocal 可以命名为"线程局部变量",它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突.这样,我们ActionContext 里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的.通过ActionContext 取得HttpSession: Map session =ActionContext.getContext().getSession();2. ServletActionContextServletActionContext(com.opensymphony.webwork. ServletActionContext),这个类直接继承了我们上面介绍的ActionContext,它提供了直接与Servlet 相关对象访问的功能,它可以取得的对象有:(1)javax.servlet.http.HttpServletRequest : HTTPservlet 请求对象(2)javax.servlet.http.HttpServletResponse : HTTPservlet 相应对象(3)javax.servlet.ServletContext : Servlet 上下文信息(4)javax.servlet.ServletConfig : Servlet 配置对象(5)javax.servlet.jsp.PageContext : Http 页面上下文如何从ServletActionContext 里取得Servlet 的相关对象:<1>取得HttpServletRequest 对象: HttpServletRequest request = ServletActionContext. getRequest();<2>取得HttpSession 对象: HttpSession session = ServletActionContext.getRequest().getSession();3. ServletActionContext 和ActionContext 联系ServletActionContext 和ActionContext 有着一些重复的功能,在我们的Action 中,该如何去抉择呢?我们遵循的原则是:如果ActionContext 能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action 尽量不要直接去访问Servlet 的相关对象.注意:在使用ActionContext 时有一点要注意: 不要在Action 的构造函数里使用ActionContext.getContext(),因为这个时候ActionContext 里的一些值也许没有设置,这时通过ActionContext 取得的值也许是null;同样,HttpServletRequest req = ServletActionContext.getRequest()也不要放在构造函数中,也不要直接将req 作为类变量给其赋值。
Struts2_Action配置

Struts2学习笔记——ActionStruts2的简单配置拷贝 struts.xml 文件到项目的src目录下,并修改(添加如下) action name="hello">result>/Hello.jsp</result></action>拷贝必要的 jar 包到项目的W EB-INF的lib目录下修改 web.xml 文件(配置f ilter)filter>filter-name>struts2</filter-name>filter-class>org.apache.struts2.dispatcher.FilterDispatcher< filter-class></filter>filter-mapping>filter-name>struts2</filter-name>url-pattern>/*</url-pattern></filter-mapping>Struts2 的执行过程的简单分析:Struts2 NamespaceNamespace 决定了action 的访问路劲,默认为”,可以接受所有路劲的actionNamespace 可以写成/,或者/xxx,或者/xxx/yyy,对应的 action 访问路劲为index.action,/xxx/index.action,/xxx/yyy/index.actionNamespace最后用模块来进行命名ActionMethod上图中的 Struts.xml 文档中配置有两个action,首先看第一个,name=userAdd再看 UserAction.java 如下:public class UserAction extends ActionSupport {public String add() {return SUCCESS;}}Method=”add”浏览器中访问第一个action为:http://localhost:8080/xxx/user(package name)/userAdd(action name)如果 UserAction 中还有一个delete 方法或update方法或者更多方法,那么这里就需要配置更多的 action,如<action name=”userDel”class=”erAction”method=”delete”> 所以我们不提倡使用这样的方法,每增加一个方法,就需要多配置一个action,给我们的开发增添了额外的负担,我们提倡使用第二种 action配置方法我们只需要配置一个 action,采用动态访问的方式,输入如下 url就可以了:http://localhost:8080/xxx/user/user!add如果还有其他方法就将 add 换成UserAction.java中的方法就可以了,如:http://localhost:8080/xxx/user/user!delete通配符配置(采用通配符可以将配置量降到最低)UserAction.java 文件:public class StudentAction extends ActionSupport {public String add() {return SUCCESS;}public String delete() {return SUCCESS;}}观察位置 1,匹配s tudent* 的action,然后找到method=”{1}”, 这里的 1 代表着name 的值中的表达式中第一个*,如果 method 为 add 方法,那么 name 的值就studentadd。
struts2的Action参数详细说明

Struts2 Action参数详细说明1,Action的配置格式基本为:<package name="包名字" extends="继承的包" namespace="空间名" > <action name="访问的名称" class="处理请求的类"><result name="处理类返回的结果名称">该结果名称所对应的JSP页面</result> </action></package>如:<package name="aa" extends="struts-default" ><action name="myaa" class="com.test.MyAction"><result name="success">/test/msg.jsp</result></action></package>访问时:<a href="myaa.action" >访问myaaAction</a>2,method属性,该属性可以把一个类的多个方法映射为多个Action,如:类文件public class MethodAction extends ActionSupport{public String add(){return SUCCESS;}public String delete(){return SUCCESS;}public String modify(){return SUCCESS;}public String query(){return SUCCESS;}}struts.xml配置文件:<action name="访问的方法名" class="处理的类" method="处理的方法名"> <result name="结果页名">结果页面</result></action><action name="add" class="com.struts2.chen.MethodAction" method="add"> <result name="success">/method/addRes.jsp</result></action><action name="delete" class="com.struts2.chen.MethodAction" method="delete"> <result name="success">/method/deleteRes.jsp</result></action><action name="modify" class="com.struts2.chen.MethodAction" method="modify"> <result name="success">/method/modifyRes.jsp</result></action><action name="query" class="com.struts2.chen.MethodAction" method="query"> <result name="success">/method/queryRes.jsp</result></action>页面:<a href="add.action">增加</a><br /><a href="delete.action">删除</a><br /><a href="modify.action">修改</a><br /><a href="query.action">查询</a><br />3。
struts--Action

关于Action的知识:第一:namespace:Namespce决定了action的访问路径(即浏览器中输入的地址),默认为“”(空),可以接受所有的actionNamespace最好用模块命名比如这个pakage是对用户进行管理,那就命名为user 即可namespace也写成/userNamespace写的话必须以/ 开头Namespace不写时等价于namespace=“”,意味着不会定位到准确的action,范围太广第二:Pakage:和java中的类似。
给action 打包的,解决action重名的问题第三:result:凡是result的name是success 的都可以省略name不写第四:Action中class的配置:(说明这个Action是一个class class中写action时不要加入后缀.java)当访问这个Action的时候,他会找到其对应的class,找到之后就会执行里面的execute方法会根据他的返回值去找对应的jsp页面具体视图的返回可以由用户自己定义的Action决定具体的Action的实现可以是一个普通的java 类,里面有public String execute方法即可,或者实现Action接口,最常用的是从ActionSupport继承,这样可以使用struts封装好的方法。
第五:Action的三种写法:方法一:写一个普通的java类。
里面写一个execute方法即可方法二:实现Action接口方法三:继承ActionSupport类(ActionSupport本身就实现了Action接口)(开发就只用这一种方法)第六:路径问题说明:理解jsp中的basepath:代表当前的项目路径struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。
虽然可以用redirect方式解决,但redirect方式并非必要。
Struts2 中拦截器和Action的调用关系

</action>
<action name="action2" class="com.suo.actions.Action2">
this.password = password;
}
public String execute()
{
System.out.println("action2 invoke !");
return SUCCESS;
}
public String execute()
{
System.out.println("action1 invoke !");
return SUCCESS;
}
}
复制代码
复制代码
Action2.java:
public class MyInterceptor implements Interceptor {
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("destroy invoke !");
}
@Override
public void init() {
// TODO Auto-generated method stub
System.out.println("init invoke !");
struts2例子三【Action】整理文

struts2例⼦三【Action】整理⽂Action 的配置是 Struts2 框架的⼀个基础⼯作单元,每⼀个 Action 的配置都有对应的处理类,当⼀个请求和 Action 的 name 相匹配时,框架将根据所配置的 Action 映射来决定对请求的处理。
1、Action 映射配置在 Action 映射中可以指定 result types 、异常处理器( exception handlers )及拦截器,但是,只有Action 的 name 属性是必需指定的,其他属性也可以在 package 范围内进⾏定义,供该 package 下配置的所有 Action 引⽤。
如:<action name="Logon" class="tutorial.Logon"><result name="input">Logon.jsp</result></action>2、Action 名称及命名注意:如果在你的 action 的 name 中包含有斜线(如: <action name="xxxxxx/xxxxxx" class="xxxxxx.xxxxx"/> ),你需要在 struts.xml 中进⾏如下配置: <constant name="struts.enable.SlashesInActionNames" value="true"/> ,但是,启⽤该配置也会产⽣⼀些副作⽤。
具体-。
-问度娘警告:谨慎使⽤在 action 名称中包含点 (er) 、斜线 (create/user) 和横线 (create-user) 的情况,虽然 action 的名称定义⾮常灵活,但是,当在 action 的 name 中使⽤点、斜线或横线时,应该谨慎。
ts 类动态静态方法

ts 类动态静态方法在TypeScript (TS) 中,类是面向对象编程的基本概念之一。
类中的方法可以被实例对象调用,也可以通过类本身调用。
其中,动态方法是指绑定在实例对象上的方法,而静态方法是指绑定在类本身上的方法。
本文将详细介绍TS中的类动态静态方法,并以示例的方式来说明其用法和特点。
二、动态方法1. 动态方法的定义和调用在TS中,动态方法是指绑定在类的原型(prototype)上的方法,并且可以通过实例对象来调用。
它的定义方式与普通函数类似,但需要在类中声明和绑定。
举例来说,有一个名为"Person"的类,其中有一个动态方法"sayHello",代码如下:class Person {sayHello() {console.log("Hello!");let person = new Person();person.sayHello();在上述代码中,我们先定义了一个Person类,然后在该类中声明并定义了一个动态方法`sayHello`。
接着,我们实例化了一个person对象,并通过`person.sayHello()`调用了这个动态方法。
2. 动态方法的特点动态方法具有以下特点:- 动态方法绑定在类的原型上,因此每个实例对象都共享同一个动态方法。
- 动态方法可以通过实例对象调用,因为每个实例对象都可以访问到类的原型。
- 动态方法内部可以使用this关键字来获得当前实例对象的引用。
举例来说,如果我们有多个Person对象,它们都可以调用sayHello方法,并共享同一个sayHello方法的实现。
let person1 = new Person();let person2 = new Person();person1.sayHello(); // 输出:Hello!person2.sayHello(); // 输出:Hello!在上述代码中,尽管person1和person2是由同一个Person类实例化出来的,但它们都可以独立地调用sayHello方法,并输出相同的结果。
Struts2中Action对象的set方法和get方法调用规则

Struts2中Action对象的set⽅法和get⽅法调⽤规则Struts的Action是采⽤的是多实例多线程设计,⽽不是像Servlet那样采⽤单实例多线程设计,因此在struts中,⼀个请求就对应⼀个Action对象,个对象之间的数据相互之间互不⼲扰。
没接到⼀个新的请求,就产⽣⼀个新的Action对象,并对Action对象的各属性赋予默认初始值。
之后再根据⼀定的规则调⽤set⽅法给各属性赋值,并根据⼀定规则调⽤get⽅法。
也就是说,Action对象不是⼀开始就必须调⽤set⽅法的。
本⽂重点讲Action对象调⽤set和get⽅法的规则:1.get⽅法的调⽤规则Action对象get⽅法的调⽤规则相对简单,因此先说get⽅法的调⽤规则。
调⽤get⽅法⽅法是为了获取属性值,这⼀点不仅仅在struts中是这样,在任何java程序中,都是这样的。
那么什么时候才需要⼀个Action对象的属性值呢?就⽬前本⼈探索和总结的结果来看,分为以下三种情况:(⼀)、在Action请求转发到下⼀个Action时(即result的type属性为chain时),下⼀个Action有对应属性的set⽅法;这种情况是为了传递数据,让数据跟着Action流程的流转⽽进⼊到下⼀个Action对象,因此是⾮常重要的。
但是呢,这种传递不⼀定能达到想要的⽬的,意外出现在如果最初的http请求本⾝就有了对应的查询参数值,则⽬标Action会在获得了源Action的get值之后,再次去过的请求的查询参数值,并⽤这个值作为set⽅法的传⼊参数,在这种情况下,⽬标Filed的值还是http请求的查询参数值。
(⼆)、在struts.xml配置⽂件中引⽤了相应的Action属性;这种情况其实是显式调⽤了get⽅法,所以⼀定会被调⽤,也没什么好说的。
(三)有对应的request.getAttribute(),且之前没有⽤过相应的request.setAttribute()。
Struts2Action动态传参数

Struts2Action动态传参数Struts2的两个Action之间传参的问题。
需求功能是这样:Action1 获取数据库配置内容,得到相应Model的动态URL ,这⾥的URL 有的是Action有的是JSP页⾯。
1.使⽤result 类型中的 redirect 类型,如下:<result name="success" type="redirect">{dynamicUrl}?objectId={objectId}&param1=${param1}</result>这样传参才能达到Action取参数的需要,如果要是加上:<param name="param1">{param1}</param> <param name="items">{items}</param>那么 param1 和 items 这两个参数都⽆法从⽬标Action⾥得到,如果想得到的话只能⽤ objectId={objectId}¶m1={param1} 这种⽅式,或者⽤ session来实现,这样就有点复杂了,⽽且使⽤起来也相当的不⽅便。
后来⼜尝试了第⼆种⽅式:2.使⽤result类型中的redirect-action类型如下:<result name="success" type="redirect-action"><param name="actionName">${actionName}</param><param name="namespace">${namespace}</param></result>此时,result之间不能再设其它的⾃定义的参数了,因为 redirect-action对应的是org.apache.struts2.dispatcher.ServletActionRedirectResult ,⽽actionName和namespace是它的两个属性,还有⼀个重要属性就是methodName,如果要再加其它⾃⼰定的参数,只能扩展该类了。
struts2动态方法调用

struts2动态方法调用【转载】JavaScript代码的核心在于动态修改表单元素的action 属性,修改后的action属性为login!regist.action实际上就是将该表单提交给login Action 的regist方法处理对于使用动态方法调用的方法,例如regist方法,该方法的声明与系统默认的execute方法只有方法名不同,其它的都应该绝对相同//开启系统的动态方法调用是通过设置struts.enable.DynamicMethodInvocation常量完成的//设置该常量为true,将开启动态方法调用,否则将关闭动态方法调用<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%><%@ taglib uri="/struts-tags" prefix="s" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>My JSP 'index.jsp' starting page</title><script type="text/javascript">function regist(){form = document.forms[0];form.action = "login!regist.action";form.submit();}</script></head><body><s:form action="login"><s:textfield label="用户名" name="username"></s:textfield> <s:textfield label="密码" name="password"></s:textfield><s:submit label="注册" onclick="regist()" value="注册"></s:submit><s:submit label="登陆" value="登陆"></s:submit></s:form></body></html>【备注:】Struts1框架提供了DispatchAction,从而允许一个Action内包含多个处理逻辑。
Action调用问题

Action调用问题4 多Action的问题4.1 为什么会使用多个ActionA问题描述:在录制脚本的时候通常会遇到这种情况,一个步骤需要反复执行,但是其他步骤不需要跟着执行,就比如添加信息,一般分为登陆,添加,退出,这三步,只有添加这个步骤是需要重复执行的,登陆和退出不需要重复执行B解决办法:这个时候就需要用到多个Action调用的方式C个人感受: 无4.2 Action调用的设置A问题描述:在决定使用多个Action调用之后需要对整个脚本有一个划分,解决这个问题,在录制脚本之前,先要对脚本进行划分,还是以添加信息为例,划分成三步,登陆,添加,退出,其中添加是主要部分而添加和退出是次要部分,分别对主要部分和次要部分作相应的设置,就能达到你的要求B处理流程:B1分别将登陆,退出录制成为单独的Action并且单独保存下来B2对这两个Action作设置C术语说明C1 TD是MI公司的一款测试管理工具,他采用B/S模式,使得用户可以在任何与Server 相连的计算机上实现测试用例的管理C2 QTP是MI公司推出的功能测试工具,主要用于B/S模式的系统测试D实例:D1以登陆为例,录制好登陆脚本如下图图4.2.D1.1注意: 很多人录制的时候习惯性的关闭录制完成后的浏览器,这里不能让QTP录制下关闭浏览器这个步骤,所以当登陆进系统后,先停止录制,再关闭浏览器D2对两个Action作设置,还是以登陆为例,选中脚本上的Action 图4.2.D2.2 点击右键,选择Action propertIEs出现如下对话框图4.2.D2.3将reusable Action选中,点击ok,主界面变为下图所示图4.2.D2.4 Action图标变为将退出也按上述步骤设定E个人感受:无4.3 调用ActionA问题描述:在设定完登陆和退出之后,还需要在整个脚本的主要部分(添加)上作一些设置B处理流程:B1调用已有脚本B2设定record and run settingB3调整Action的位置B4录制脚本B5对添加脚本进行参数化B6对于添加Action属性的设定C术语说明C1 TD是MI公司的一款测试管理工具,他采用B/S模式,使得用户可以在任何与Server 相连的计算机上实现测试用例的管理C2 QTP是MI公司推出的功能测试工具,主要用于B/S模式的系统测试D实例:D1调用脚本,在QTP主页面选择insert ---call to existing Action 图4.3.D1.1弹出如下对话框图4.3.D1.2在from test中,点击会弹出文件夹选项(如果QTP已经连接TD等测试中心,那么会弹出测试中心的保存目录,本例是连接TD的)如下图图4.3.D1.3选择你刚刚录制并且设置完成的登陆,点击ok,弹出如下对话框图4.3.D1.4选择at the end of the test点击ok登陆Action被调用到当前的Action中,执行如上操作,将退出也导入到当前的Action中D2设定record and run setting,在QTP主界面,选择test---record and run setting图4.3.D2.5弹出如下对话框图4.3.D2.6选择record and run test on any open web browserD3调整Action的位置,当完成上述操作,你会看到你的界面如下图所示图4.3.D3.5三个Action顺序排列.但是你需要将登陆Action放在第一步,添加Action放在第二步,退出Action放在第三步,你可以通过用鼠标选中其中的一个Action通过拖动鼠标的方式来调整Action的位置D4录制脚本,手动打开IE浏览器,手动登陆到你登陆Action执行完毕后的那个界面,然后在QTP中点击record,开始录制脚本,注意,不要录制最后关闭这个步骤D5对添加脚本进行参数化,选择你要参数化的步骤,并且参数化你的步骤,但是在选择global或者Action时,选择Action,如下图图4.3.D5.6D6对于添加Action属性的设定,选中你的添加Action,点击右键,并且选择Action call propretIEs如下图图4.3.D6.7在弹出的对话框中选择run on all row,如下图图4.3.D6.8 E个人感受:无4.4 调用Action的模式A问题描述与解答要达到4.2所要达到的目标,其中的几个call Action必须依照4.2的属性来设置,否则将无法按要求运行B个人感受:无4.5 copy Action与call existing Action的区别A问题描述在QTP中可以使用两种调用其他Action的方法分别是call to copy of Action与call existing Action,他们之间的区别如下B问题解答两种方式都是将以被保存的Action调用过来,但是copy Action是将原本Action中的所有属性,及其参数值调用过来,并且可以在其上随意的更改,而且这些更改并不影响源Action,而call existing Action虽然也是将源Action的所有属性及其参数值都调用过来,但是你不能更改其中的任何步骤和参数值,如果一定要更改,需要重新打开源Action,在源Action上进行更改,所作的改动将自动体现在调用的Action上C个人感受: 无5 QTP系统参数设置对录制的影响5.1 关于录制设置的区分web event recording configurationA问题描述:在录制过程中,默认的录制模式很多情况下是不能满足录制要求的,需要进行特殊的设定,你可以在web event recording configuration 中完成这些设定B处理流程:B1启动QTPB2进入到web event recording configuration对话框B3web event recording configuration的设置B4保存退出,录制脚本C术语说明C1 TD是MI公司的一款测试管理工具,他采用B/S模式,使得用户可以在任何与Server 相连的计算机上实现测试用例的管理C2 QTP是MI公司推出的功能测试工具,主要用于B/S模式的系统测试D实例:D1启动QTP,如下图图5.1.D1.1D2进入web event recording configuration对话框,点击tools---web event recordingconfiguration如下图图5.1.D2.2D3 web event recording configuration的设置,弹出web event recording configuration对话框,如下图图5.1.D3.3这里有三个录制级别可以设置分别为最低,中等,高级如果你认为还是不能满足你的录制需要可以点击custom settings..按钮弹出如下对话框图5.1.D3.4左边是你的对象列表树,如下图图5.1.D3.5他包含了web中QTP所能识别的所有控件,你可以通过add object添加object控件图5.1.D3.6右边是跟控件相对应的实例,如下图图5.1.D3.7他包含了相对应的控件的鼠标录制属性,你可以通过add event来添加event控件图5.1.D3.8D4 保存退出,录制脚本,点击ok保存设置,这时可以按照你的要求录制脚本E个人感受:无5.2 关于QTP录制mouseover得问题A问题与解答修改了Web Event Recording Configuration中的以下设置:将Any Web Object、Web Object-->Image、Web Object -- >WebArea这三项上的Onmouseover 都改成Always Enable就可以了B个人感受: 无5.3 关于start transAction的问题A问题描述:有时需要查看QTP执行脚本的执行时间,以及使用loadrunner调用QTP,也需要加一个特殊的功能键start transAction,因为loadrunner只能调用start transAction和end trasAction之间的代码段B处理流程:B1录制脚本B2添加start transActionB3运行脚本C术语说明C1 TD是MI公司的一款测试管理工具,他采用B/S模式,使得用户可以在任何与Server 相连的计算机上实现测试用例的管理C2 QTP是MI公司推出的功能测试工具,主要用于B/S模式的系统测试D实例:D1录制脚本,进入QTP页面,录制你的脚本,录制完成后点击stop D2添加start transAction如下图在你需要查看时间的脚本上端添加start transAction,如下图,点击start transAction按钮弹出如下图对话框图5.3.D2.2输入名称,并且选择是在你所选步骤之前加还是之后,设定好后,点击ok添加一个步骤,如下图再选择你要中止的步骤,点击end stransAction,如下图弹出如下对话框。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Action执行的时候并不一定要执行execute方法<br />
可以在配置文件中配置Action的时候用method=来指定执行哪个方法
也可以在url地址中动态指定(动态方法调用DMI)(推荐)<br />
<a href="<%=context %>/user/userAdd">添加用户</a>
<br />
<a href="<%=context %>/user/user!add">添加用户</a>
<br />
前者会产生太多的action,所以不推荐使用
Action中静态和动态方法调用的区别
静态方法要配置多个action 而动态方法只用一个action 项目中常用动态的。
就是静态方法在action多了一个method="add"看下面的例子:
1.Index.jsp
<%
String context = request.getContextPath(); %>
<a href="<%=context %>/user/userAdd">添加用户</a>
2.struts.xml
静态方法调用:不常用
<constant name="struts.devMode" value="true" /><!-- 开发模式 --> <package name="user" namespace="/user" extends="struts-default"> <action name="userAdd"
class="com.cstp.struts2.action.IntorductionAction"
method="add">
<result>
/user_add_success.jsp
</result>
</action>
动态方法调用:常用
<action name="user"
class="com.cstp.struts2.action.IntorductionAction">
<result>/user_add_success.jsp</result>
</action>
</package>
3.action
public class IntorductionAction extends ActionSupport {
public String add() {
System.out.println("123");
return SUCCESS;
}
}
er_add_success.jsp
<body>
User Add Success!
</body>
静态方法访问:http://localhost:8080/Struts2_0500_Action_Method/user/userAdd
动态方法访问:http://localhost:8080/Struts2_0500_Action_Method/user/user!add。