`

Struts2学习笔记(五) Action(下)

 
阅读更多

调用非execute方法

在前面有关Action的学习中,我们的Action中真正实现业务逻辑的只有execute方法,如果我们每个Action中都只有这么一个方法的话,那么当我们程序中需要的功能很多时,我们就不得不手动编写很多的Action类了,这显然是不合理的。前面我也说道了我们的Action类并不一定非得继承某个类或者实现某个接口,我们可以使用POJO来作为我们的Action,并且我们的Action中也并不一定非得要有execute方法,如果我们使用的不是execute方法,那么我们就需要在配置Action的是时候在action标签上使用method属性来指出我们需要使用的动作方法。

那么我们也可以在一个Action中编写多个用于实现业务逻辑的方法,他们分别执行不同的功能,但是做的工作又是有相似的地方。比如我们可以将所有与用户相关的处理操作都写在UserAction当中,那么这样我们就能够更好的组织我们的代码。同样,我们只需要在struts.xml中为我们的action标签指定我们要使用的method即可。

要实现在一个Action类中调用非execute方法有三种实现方式:

(1)使用method属性

这里我们还需要一个User实体类,其实就是一个简单的JavaBean即可。

然后在struts.xml中对我们的Action进行配置

<packagename="default"namespace="/"extends="struts-default">

<actionname="userAdd"class="action.UserAction">

<resultname="input">/input.jsp</result>

</action>

<actionname="userSave"class="action.UserAction"method="save">

<resultname="success">/success.jsp</result>

</action>

</package>

Input.jsp

<formaction="userSave.action"method="post">

username : <inputtype="text"name="userName"/><br/>

password :<inputtype="password"name="password"><br/>

<inputtype="submit"value="submit"/>

</form>

success.jsp

<body>

hello ${userName }<br/>

your password is ${password }

</body>

我们在浏览器中测试一下:

我们直接在浏览器中访问userAdd.action,可以看到显示了信息输入页面

提交之后正确的显示除了success结果页面,说明我们的配置没有问题。

(2)使用通配符

除了使用上面说到的方法外,我们也可以不用在struts.xml中对Action中的每一个动作方法都进行配置,我们可以之配置一个,在这个actin中使用通配符来指定将要执行哪个方法。

<packagename="default"namespace="/"extends="struts-default">

<actionname="*User"class="action.UserAction"method="{1}">

<resultname="input">/input.jsp</result>

<resultname="success">success.jsp</result>

</action>

</package>

在UserAction中增加一个add方法,直接返回”input”,将input.jsp中form的action属性修改为”saveUser.action”。我们在浏览器中测试一下:

直接访问addUser.action,浏览器将会显示信息输入页面,说明调用了UserAction中的add方法:



页面提交到saveUser.action,调用了UserAction的save方法并呈现success结果页面.

注:通配符的方式也可以应用在result标签上。

(3)动态方法调用

除了上面介绍的方法,struts2中还有一种实现方法——动态方法调用。使用动态方法调用的格式为 action!method即使用”!”来连接我们配置的action和要执行的方法,使用这种方式我们不需要为acttion标签指定method属性。

<packagename="default"namespace="/"extends="struts-default">

<actionname="user"class="action.UserAction">

<resultname="input">/input.jsp</result>

<resultname="success">success.jsp</result>

</action>

</package>

然后我们要对input.jsp做一些修改,将form的action属性修改为”user!save”:

<formaction="user!save"method="post">

username : <inputype="text"name="userName"/><br/>

password :<inputtype="password"name="password"><br/>

<inputtype="submit"value="submit"/>

</form>

修改完成之后我们在浏览器中直接访问http://localhost/action/user!add


Input.jsp页面被呈现,说明UserAction的add方法被调用。


提交到user!save后success.jsp被呈现,说明UserAction的save方法被调用。

注意:对于使用通配符的方法来说,Struts2会认为我们将这些匹配到的方法就像是硬编码在struts.xml中一样,因此我们可以为这些进行匹配的action做一些其他处理,比如数据验证、本地消息和类型转换等。但是使用动态方法调用的方式,struts2知道我们调用了同一个action,只是执行了非execute方法,因此使用这种方式,这些动作方法都会共享一个Action的配置。所以从这个角度上来说,通配符的方式优于动态方法调用的方式。我们可以在struts.xml中通过配置来决定是否启用动态方法调用。

<constant name="struts.enable.DynamicMethodInvocation"value="false"/>

向对象传递数据

上面我们接触到的Action类都有一个共同的特性,那就是在action中使用属性来接收请求中的参数。我们定义了一个User类,专门由于表示User实体,但是在我们的Action类中我们都是手动的new一个User实体对象,然后使用set方法将接收到的值设置到User实体对象上,那么能不能直接使用User对象类接收请求中的参数,我们在动作方法中就可以直接操作User实体对象呢,答案是肯定的。实现的方式有两种。

(1)对象支持的javabean属性

我们已经知道Strtus2中的params拦截器会自动将请求中的数据转移到动作对象属性上。那么我们也可以直接使用实体对象作为动作对象的属性,这样Struts2就能自动将请求中的数据填充到我们的实体对象上。为了实现这个功能,我们需要在jsp页面中多做一些工作:

input.jsp

<formaction="user!save"method="post">

username : <inputtype="text"name="user.userName"/><br/>

password :<inputtype="password"name="user.password"><br/>

<inputtype="submit"value="submit"/>

</form>

Success.jsp

<body>

hello ${user.userName }<br/>

your password is ${user.userName }

</body>

运行浏览器进行测试,其结果和前面的测试相同,页面均能正常执行。

需要注意的是,我们的User对象并不需要我们手动实例化,Strtus2会自动实例化user,并且装配上面的属性。要实现这个功能,我们需要在结果视图中明确指出Action类中的实体(域)对象。下面学习的第二种方法我们的jsp页面可以不做任何改变,就和全部使用javabean一样。

(1)ModelDriven动作

要使用ModelDriven动作需要我们的动作实现com.opensymphony.xwork2.ModelDriven接口,在该接口中定义了一个getModel方法,我们要在Action类中实现这个方法,并在其中将我们的域对象返回。该接口支持泛型。需要注意的就是我们在返回域对象时要确保这个域对象已经实例化了。

要做的改变就是这些,结果视图里面和最初使用纯JavaBean实现时相同。

运行浏览器进行测试,可以看到得出的结果和前面相同。其实现原理是通过拦截器来调用,查看defaultStack拦截器栈,会看到其中有一个ModelDriven拦截器:

<interceptor-stackame="defaultStack">

<interceptor-refname="exception"/>

<interceptor-refname="alias"/>

<interceptor-refname="servletConfig"/>

<interceptor-refname="i18n"/>

<interceptor-refname="prepare"/>

<interceptor-refname="chain"/>

<interceptor-refname="scopedModelDriven"/>

<interceptor-refname="modelDriven"/>

<interceptor-refname="fileUpload"/>

<interceptor-refname="checkbox"/>

<interceptor-refname="multiselect"/>

<interceptor-refname="staticParams"/>

<interceptor-refname="actionMappingParams"/>

<interceptor-refname="params">

<paramname="excludeParams">dojo\..*,^struts\..*</param>

</interceptor-ref>

<interceptor-refname="conversionError"/>

<interceptor-refname="validation">

<paramname="excludeMethods">input,back,cancel,browse</param>

</interceptor-ref>

<interceptor-refname="workflow">

<paramname="excludeMethods">input,back,cancel,browse</param>

</interceptor-ref>

<interceptor-refname="debugging"/>

</interceptor-stack>

这个拦截器在params拦截器之前,那么会在参数传递到到Action对象上之前将通过getModel获取到的域对象压入valueStack中,以供params拦截器将参数设置上去。查看文档可以知道modeldriven拦截器的实现类是com.opensymphony.xwork2.interceptor. ModelDrivenInterceptor

查看该拦截器的interceptor方法源码:

public Stringintercept(ActionInvocation invocation)throws Exception {

Object action = invocation.getAction();

if (actioninstanceof ModelDriven) {

ModelDriven modelDriven =(ModelDriven) action;

ValueStack stack =invocation.getStack();

Object model =modelDriven.getModel();

if (model !=null) {

stack.push(model);

}

if (refreshModelBeforeResult) {

invocation.addPreResultListener(new RefreshModelBeforeResult(modelDriven,model));

}

}

return invocation.invoke();

}

可以清晰看出这个拦截器对域对象所做的处理。从这里也可以看出,我们的域对象必须先实例化,才能产生效果。

总结:虽然使用实体对象保存请求数据看起来比较不错,不过在实际使用中还是直接使用javabean属性接收数据的方式比较多,这种方式操作简单,也比较容易控制。


分享到:
评论

相关推荐

    struts2学习笔记

    struts2学习笔记,拦截器,action,所需jar包,从零开始

    struts2 学习笔记 实战

    namespace :对应与项目名称后面的"/"(例如Struts2_0100_Introduction后面的"/") (http://localhost:8080/Struts2_0100_Introduction/) 四、 标签 是用来解决重名的问题,例如当系统的前台和后台都有一个action...

    Struts2 学习笔记

    01 Struts2-Action 5 一、 Struts作用: 5 二、 搭建Struts2的运行环境: 5 三、 Namespace 6 四、 标签 6 五、 Action 6 六、 路径问题的说明 8 七、 Action的动态调用方法 8 八、 Action通配符(wildcard)的配置 9 ...

    struts2学习笔记!

    struts2学习笔记!因为还没有全部学完,所以分部分分享!主要内容:struts.xml配置,web.xml配置 Action要点!全局类型转换,部分类型转换,类型转换文件 类型装换错误的处理问题局部使用,把中文汉字转换为编码 struts2对...

    Struts2_Action学习笔记、通配符{1},{2}

    Struts2_Action学习笔记、通配符{1},{2}......

    struts2学习笔记,总结了很多学习的经验

    struts2学习笔记,总结了很多学习的经验,标签的使用,action的使用。struts2.0 和 struts2.1 的区别

    struts项目学习笔记

    Struts2 是一个非常优秀的MVC框架,基于Model2 设计模型 由传统Struts1和WebWork两个经典框架发展而来 Struts2框架=Struts2+XWork Strust2 核心功能 允许POJO(Plain Old Java Objects,简单javabean对象,没有继承,...

    struts2学习笔记 很基础 容易懂

    struts2学习笔记 很基础 容易懂第一个struts2的web用户登录工程:创建一个web工程-&gt;创建login.jsp(创建advanced的JSP)-&gt;登录的form表单(注意:action=“login.action”)-&gt;编写完成后配置

    struts2.2学习笔记

    struts2.2学习笔记总结,action,拦截器,过滤器,国际化,struts.xml解析等的总结。

    struts1.2学习笔记

    struts1.2学习笔记了解struts工作流程: 首先struts基于MVC模式, 用户发送的请求讲被ActionServlet处理,转发,但是它是怎样实现的了??

    struts学习笔记

    建立一个Java Web项目,提取最少运行Struts2应用的包集合,目标:实现一个简单的用户登录 包括内容: 一、先实现登录页面 二、实现处理页面的Action 三、配置Web.xml 四、配置Action处理结果和资源资源之间的映射关系 ...

    【张冰Struts2学习笔记】0201_Action接口与ActionSupport类

    NULL 博文链接:https://coderdream.iteye.com/blog/812871

    struts学习笔记(2)

    当前struts2的filter过滤到一个.action结尾的请求的时候,会把这个请求交给struts2内部的拦截器(interceptor) 2)拦截器起到什么作用 可以帮我们丰富action的功能,比自动类型转换(页面传一个String类型的id,接收的...

    Struts1.3 备忘笔记

    Struts 1.3 备忘笔记 【资源特点】 1、以项目形式组织,包含所有的源代码 2、内含详细的注释说明 3、知识点较全面 【内容目录】 01 Struts_01HandworkApply : 手工配置Struct应用程序,演示用户提交数据后服务器的...

    struts学习笔记(3)

    当客户端向action发送请求并且最后跳转到另外一个页面的时候,在跳转的同时,struts2框架会帮我们自动把需要传到页面的值放这两个对象当中去,然后我们在页面就可以使用固定的方式把值从这个两个对象里面取出来了。...

    Struts 2.1.8_学习源码

    Struts2_04ActionResultType : Struts2关于Action跳转类型的应用 对各种不同的跳转类型使用的实例 Struts2_05Interceptor : Struts2拦截器的使用 Struts2_06FileUpload : Struts2上传文件的使用

    struts2的学习笔记+测试源代码

    struts2中action路径的搜索顺序 博文链接:https://wuzhaohuixy-qq-com.iteye.com/blog/710102

    学习笔记之struts2整合Spring

    整合Spring,换句话说,也就是让spring的IOC功能为我们的struts action注入逻辑组件....

    struts 2 笔记 struts2 基础

    action 的一些基础操作 的学习过程

    [摘]Struts 学习笔记之ActionForm

    比上面的完整 博文链接:https://shangdiyefankun.iteye.com/blog/122443

Global site tag (gtag.js) - Google Analytics