• PrepareInterceptor拦截器的用法:

1、若Action实现了Preparable接口,则Action方法需实现prepare()方法;

2、PrepareInterceptor拦截器Struts将调用prepare()方法;

    @Override
public Member getModel() {
return this.member;
} @Override
public void prepare() throws Exception {
// 如果没有id请求参数,说明为create
if (this.id == null) {
this.member = new Member();
}
// 如果有id请求参数,说明为edit
else {
this.member = memberDao.get(this.id);
}
}

3、PrepareInteceptor拦截器根据firstCallPrepareDo属性决定获取prepareActionMethodName、prepareDoActionMethodName的顺序,默认情况下先获取prepareActionMethodName,如果没有该方法,就寻找prepareDoActionMethodName()。如果找到对应的方法就调用该方法,若都不存在,则不执行;

4、PrepareInterceptor拦截器会根据alwaysInvokePrepare属性决定是否执行prepare()方法,默认该属性为true,如果要修改该属性值为false,则需要在struts.xml配置文件中修改,具体重写拦截器属性值的方案参考:http://struts.apache.org/docs/interceptors.html#Interceptors-InterceptorParameterOverriding(默认提供了三种重写拦截器属性值的方法)。

  • 使用paramsPrepareParamsStack拦截器栈

1、paramsPrepareParams从字面上理解,这个stack的拦截器调用的顺序为:首先调用params,然后调用prepare,接下来调用modelDriven,然后再调用params;

2、Struts2.0的设计上要求modelDriven在params之前调用,而业务中prepare要负责准备model,准备model又需要参数,这就需要在prepare之前调用params拦截器设置相关参数,这个也就是创建paramsPrepareParamsStack的原因。

3、执行流程如下:

3.1、params拦截器首先给action中的相关参数赋值,如id;

3.2、prepare拦截器执行prepare方法,prepare方法中会根据参数,如id,去调用业务逻辑,设置model对象;

3.3、modelDriven拦截器将model对象压入valuestack,这里的model对象就是在prepare中创建的;

3.4、params拦截器在将参数赋值给model对象;

3.5、action的业务逻辑执行。

  • 测试应用:

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts>
<!-- <constant name="struts.action.extension" value="action" /> <constant
name="struts.enable.DynamicMethodInvocation" value="true" /> -->
<constant name="struts.ognl.allowStaticMethodAccess" value="true" />
<constant name="struts.devMode" value="false" /> <package name="default" namespace="/" extends="struts-default">
<interceptors>
<interceptor-stack name="myParamsPrepareParamsStack">
<interceptor-ref name="paramsPrepareParamsStack">
<param name="prepare.alwaysInvokePrepare">false</param>
</interceptor-ref>
</interceptor-stack>
</interceptors> <default-interceptor-ref name="myParamsPrepareParamsStack" />
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="error"
exception="java.lang.ArithmeticException"></exception-mapping>
</global-exception-mappings> <action name="member-*" class="com.dx.struts.actions.MemberAction"
method="{1}">
<result name="{1}">/member-{1}.jsp</result>
<result name="delete" type="redirectAction">member-list</result>
<result name="modify" type="redirectAction">member-list</result>
<result name="create" type="redirectAction">member-list</result>
</action>
</package>
</struts>

MemberAction.java

/**
* @author Administrator
*
*/
package com.dx.struts.actions; import java.util.Date;
import java.util.List;
import java.util.Map; import org.apache.struts2.interceptor.RequestAware; import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;
import com.dx.struts.dao.MemberDao;
import com.dx.struts.entity.Member; /**
* ModelDriven 和Preparable拦截器
*/
public class MemberAction implements RequestAware, ModelDriven<Member>, Preparable {
private MemberDao memberDao = new MemberDao();
private Member member;
private Long id; public void setId(Long id) {
this.id = id;
} public String list() {
List<Member> members = memberDao.getMembers();
request.put("members", members); return "list";
} public void prepareView() {
this.member = memberDao.get(id);
} public String view() {
return "view";
} public String delete() {
memberDao.remove(this.id); return "delete";
} public void prepareEdit() {
this.member = memberDao.get(id);
} public String edit() {
return "edit";
} public void prepareSave() {
this.member = new Member();
} public String save() {
// 1、获取传入的id:member.getId();
// 2、根据id获取member对象;
Member member_ = memberDao.get(this.member.getId()); // 3、赋值栈顶对象的属性:此时栈顶对象为member对象。
member_.setAge(this.member.getAge());
member_.setName(this.member.getName());
member_.setGender(this.member.getGender()); return "modify";
} public void prepareCreate() {
this.member = new Member();
} public String create() {
member.setId(new Date().getTime());
memberDao.add(member); return "create";
} private Map<String, Object> request; @Override
public void setRequest(Map<String, Object> request) {
this.request = request;
} @Override
public Member getModel() {
return this.member;
} @Override
public void prepare() throws Exception {
System.out.println("prepare function......");
}
}

好处:

可以避免资源浪费,对每个Action的方法可以自己根据自己的需要提前处理一些业务信息。

Struts(十八):通过CURD来学习PrepareInterceptor拦截器的更多相关文章

  1. Struts(十七):通过CURD来学习paramsPrepareParams拦截器栈

    背景: 通过上一章节<Struts(十六):通过CURD来学习Struts流程及ModelDriven的用法>学习了ModelDriven拦截器的用法,上章节中讲到了edit功能. 要修改 ...

  2. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. Struts2学习之拦截器栈

    © 版权声明:本文为博主原创文章,转载请注明出处 拦截器栈: - 从结构上看:拦截器栈相当于多个拦截器的组合 - 从功能上看:拦截器栈也是拦截器 默认拦截器栈: - 在struts-core.jar中 ...

  4. Struts2学习之拦截器

    © 版权声明:本文为博主原创文章,转载请注明出处 拦截器: - Struts2大多数核心功能都是通过拦截器实现的,每个拦截器完成某项功能 - 拦截器方法在Action执行之前或之后执行 工作原理: - ...

  5. [原创]java WEB学习笔记65:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) ModelDriven拦截器 paramter 拦截器

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. Struts 2学习笔记——拦截器相关

    一.添加国际化支持 默认的struts-deault.xml文件中已经定义了国际化拦截器,内容如下 <!-定义国际化拦截器--> <interceptor name="i1 ...

  7. struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo

    理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...

  8. Struts2基础学习(五)—拦截器

    一.概述 1.初识拦截器      Interceptor 拦截器类似前面学过的过滤器,是可以在action执行前后执行的代码,是我们做Web开发经常用到的技术.比如:权限控制.日志等.我们也可以将多 ...

  9. struts2学习(5)拦截器简介以及例子执行过程

    一.拦截器简介: 二.Struts2预定义拦截器&拦截器栈 在执行action之前和之后,拦截器进行了操作: 比如struts-default.xml中就有很多预定义的拦截器:   拦截器栈: ...

随机推荐

  1. Java枚举类使用

    用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...

  2. 前端的UI设计与交互之文案篇

    在界面中,我们需要通过对话的方式与用户产生共鸣.精准.清晰的语言会更容易让用户理解,合适的语气更容易让用户建立信任感.因此在界面设计时,文案也应当被重视. 在使用和书写文案时有以下几点需要注意:从用户 ...

  3. Python 中列表生成式和生成器

    列表生成式 即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1,2,3,4,5,6,7,8,9,10]可以用l ...

  4. STL --> string类字符串

    基本使用方法 一.输入 string s: cin >> s; getline(cin, s) ; //使用默认的'\n'作为终止符 getline(cin, s, '!') ; //以' ...

  5. MIPCMS V3.1.0 远程写入配置文件Getshell过程分析(附批量getshell脚本)

      作者:i春秋作家--F0rmat 0×01 前言 今天翻了下CNVD,看到了一个MIPCMS的远程代码执行漏洞,然后就去官网下载了这个版本的源码研究了下.看下整体的结构,用的是thinkPHP的架 ...

  6. Java基础学习笔记五 Java基础语法之面向对象

    面向对象 理解什么是面向过程.面向对象 面向过程与面向对象都是我们编程中,编写程序的一种思维方式.面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程.例如:公司打扫卫生( ...

  7. beta冲刺1-咸鱼

    前言:这篇算是开始补之前的开端,毕竟beta阶段我们从前面开始就有在陆续做了. 今天的工作: 接收了新成员*1,然后几个人聚了一下,并且讨论了一下目前遇到的问题,以及目前需要处理的问题. 目前遇到的问 ...

  8. Alpha第十天

    Alpha第十天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...

  9. 转 Eclipse快捷键调试大全

    (1)Ctrl+M --切换窗口的大小(2)Ctrl+Q --跳到最后一次的编辑处(3)F2      ---重命名类名 工程名 --当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时To ...

  10. 单向链表在O(1)时间内删除一个节点

    说删链表节点,第一时间想到就是遍历整个链表,找到删除节点的前驱,改变节点指向,删除节点,但是,这样删除单链表的某一节点,时间复杂度就是O(n),不符合要求: 时间复杂度是O(n)的做法就不说了,看看O ...