• 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开发的利器-Lombok

    译注:Lombok是一个很老的项目了,也非常实用,但奇怪的是这么多年来似乎一直不温不火.很多Lombok特性可以参考它的官网介绍哈.兄弟连教育在这里只是简单介绍一下它的基础功能. Lombok是一个旨 ...

  2. 1-2 Spring 的基本使用

    1.Spring容器的配置文件applicationContext.xml的引入 名称可以自己定义 <?xml version="1.0" encoding="UT ...

  3. Mysql设置字段自动获取时间

    问题:现在在用户表中有一个字段表示用户创建的时间 第一个想法是写一段程序获得系统当前时间,想想就太麻烦了,果断放弃,之后想到了存储过程和函数,再想想还要编写存储过程或者函数的代码,有点放弃的想法,但是 ...

  4. tensorflow安装过程-(windows环境下)---详解(摆平了很多坑!)

    一, 前言:本次安装tensorflow是基于Python的,安装Python的过程不做说明(既然决定按,Python肯定要先了解啊):本次教程是windows下Anaconda安装Tensorflo ...

  5. VC++开发AutoCAD 2018/objectARX 用向导新建项目无法新建的问题

    话说笔者最近想用新机子上装的AutoCAD ObjectARX 2018来进行二次开发,兴致勃勃安装了ARX API和向导, 然后打开VS2015,新建项目,无法新建. 折腾了一下,还是没有解决,后面 ...

  6. Django--基本篇:项目结构与设计模式(MVC)

    Django在项目开发中有着结构清晰.层次明显.容易编写理解查阅demo的优点,那么我们来个小案例具体看看.    一.项目结构简析: 我们按照上一篇中的开发流程步骤创建一个新项目myblog,项目下 ...

  7. Java字符编码浅析

    Java基本类型占用的字节数:1字节: byte , boolean2字节: short , char4字节: int , float8字节: long , double注:1字节(byte)=8位( ...

  8. 网络1711-1712的C语言作业总结(2017-2018第一学期)

    1.第0次作业总结--预备作业 作业地址 1711班级总结 1712班级总结 2.第一次作业总结--顺序结构 作业地址 1711班级总结 1712班级总结 3.第二次作业总结--分支结构 作业地址 1 ...

  9. C++ STL常用容器基本用法汇总

    1.vector 包含头文件#include<vector> 使用命名域using namespace std 定义元素类型为T的vector vector<T> vec 增: ...

  10. fs输出文件目录

    var http = require("http"); var fs = require("fs"); var server = http.createServ ...