`
sungang_1120
  • 浏览: 310439 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

Struts2定制拦截器

 
阅读更多

struts自带拦截器至少不会低于10种,例如:输入验证是有Validatin拦截器处理的,如果禁用这个拦截器,输入的验证将停止工作,文件上传如此顺利,要感谢File Upload拦截器,有几个拦截器会在特定的条件不满足的时候组织该动作执行,例如:过去在对某个动作输入验证时遇到的错误,Validation拦截器将阻止该动作触发

 

Struts自带的拦截器足以满足绝大多数的应用程序的需要  但是你也有可能会遇到自己自行创建一个拦截器的时候  一下将介绍怎么自己去创建一个拦截器

 

Interceptor接口

从出技术角度讲  每个拦截器都是一个实现了com.opensymphony.xwork2.interceptor.Interceptor接口的java类  这个接口定义如下:

 

public interface Interceptor extends Serializable{

           void init();

           String interceptor(ActionInvocation invocation) throws Exception;

           void destory();

}

这个接口有三个方法  

 init  这个方法将在拦截器创建出来之后  立刻执行,他在拦截器的生命周期内也只被嗲用一次。拦截器的编写者必须要覆盖这个方法对相关的资源进行必要的初始化。

interceptor 每个拦截器到一个动作请求,这个方法就会被调用一次,给拦截器一个机会在该动作开始执行之前和执行完毕之后做些事情。

destory 这个方法将在拦截器被销毁之前调用,他在拦截器的生命周期中也纸杯调用一次,拦截器的编写者必须覆此方法来释放曾经占用的资源。

 

Struts会依次调用程序员为某个动作而注册的灭一个拦截器的interceptor方法,在每次调用这个方法的时候,struts会向他传递一个com.opensymphony.xwork2.ActionInvocation接口的实例,一个ActionInvocation对象代表一个给定的执行状态,拦截器可以从这个对象获得与改该对象相关联的Action对象和Result对象,在完成自己的任务之后,拦截器将调用ActionInvocation对象的invoke方法前精到动作流程的下一个环节。

     我们还可以通过调用ActionInvocation对象的addPreResultListener方法的办法给ActionInvocation对象挂上一个或者多个PreResultListener监听器。PreResultListener接口可以让我们在动作执行完毕之后,开始执行动作结果之前做些事情,这个接口有一个回调的方法如下定义:

                 void brforeResult(ActionInvocation invocation,String resultCode);

AbstractInterceptor类实现了Interceptor接口,并俄日init和destroy方法分别提供了一个空白的实现了  因为并非所有拦截器都需要对资源进行初始化或在他们销毁的时候做善后处理,所以扩展了AbstractInterceptor类可以让我们省下自行实现init和destroy方法的时间。AbstractInterceptor源码如下所示:

                 public void init(){}

                 public void destroy(){}

                 public abstract String intercept(ActionInvocation invocation) throw Exception

 

下面编写一个自定义的拦截器

 

DataSourceInjectorInterceptor为自定义拦截器,这个拦截器的用途把一个DataSource "注入"一个给定的动作对象中去,相关的动作在把dataSource注射到Dao层;

package com.sg.action;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class DataSourceInjectorInterceptor extends AbstractInterceptor{
    private DataSource dataSource;
    private String dataSourceName;
   
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
    @Override
    public void init() {
        if (dataSource == null) {
            System.out.println("Interceptor . init DS");
            try {
                Context context = (Context) new InitialContext();
                dataSource = (DataSource)context.lookup(dataSourceName);
            } catch (NamingException e) {
                e.printStackTrace();
            }
        }
    }
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        Object action = invocation.getAction();
        if (action instanceof DataSourceAware) {
            ((DataSourceAware) action).setDataSource(dataSource);
        }
        return invocation.invoke();
    }
   
}

每当一个实用了这个拦截器的动作被触发时,这个拦截器就会把一个dataSource对象注入到相应的动作对象去,注意: 并非所有的动作都能获得这个对象,只有那些想实现了DataSourceAware接口的动作类才能接受这种注射。DataSourceAware代码如下:

package com.sg.action;
import javax.sql.DataSource;

public interface DataSourceAware {
    void setDataSource(DataSource dataSource);
}

声明拦截器如下

<package name="app" namespace="" extends="struts-default">

        <!--声明-->
        <interceptors>
            <interceptor name="dataSourceInjector" class="com.sg.action.DataSourceInjectorInterceptor">
                <param name="dataSourceName">java:/comp/env/jdbc/MyDataSource</param>
            </interceptor>
        </interceptors>       
       
        <action name="product_list" class="com.sg.action.ProductAction">
            <interceptor-ref name="defaultStack"/>
            <interceptor-ref name="dataSourceInjector"/>
            <result>/products.jsp</result>
        </action>
    </package>

 

product_list动作用来列出库存的产品,这些产品来自一个数据库。这个数据库可以通过我们的定制的拦截器所注入的DataSource去访问。

 

package com.sg.action;

import java.util.List;
import javax.sql.DataSource;
import com.opensymphony.xwork2.ActionSupport;

public class ProductAction extends ActionSupport implements DataSourceAware{
    private DataSource dataSource;
    private List<Product> products;
    public List<Product> getProducts() {
        return products;
    }
    public void setProducts(List<Product> products) {
        this.products = products;
    }
    @Override
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
   
   
    @Override
    public String execute() throws Exception {
        ProductDAO productDAO = new ProductDAO();
        productDAO.setDataSource(dataSource);
        products = productDAO.getAllProducts();
        return SUCCESS;
    }
}

有一点要注意:ProductAction类实现了DataSourceAware接口  所以我们可以把DataSource对象注入到ProductAction类的实例去.

 

ProductAction类将使用ProductDAO类 从数据库中的Products数据表检索数据。这意味着我们必须提前把这个数据库表先创建出来,在填充一些数据进去。有关动作调用productDAO类的setDataSource方法,把DataSource注入到ProductDAO类中     

代码如下:

package com.sg.action;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

public class ProductDAO {
    private DataSource dataSource;

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
    private static final String sql = "SELECT productId,name,descrptio,price FROM products";
     public List<Product> getAllProducts(){
         List<Product> products = new ArrayList<Product>();
         Connection connection = null;
         PreparedStatement statement = null;
         ResultSet rs = null;
         try {
             connection = dataSource.getConnection();
             statement = connection.prepareStatement(sql);
             rs = statement.executeQuery();
             while(rs.next()){
                 Product product = new Product();
                 product.setProductId(rs.getInt("productId"));
                 product.setName(rs.getString("name"));
                 product.setDescrption(rs.getString("descrption"));
                 product.setPrice(rs.getDouble("price"));
                 products.add(product);
             }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        return products;
     }
}

 

 

 

分享到:
评论

相关推荐

    深入浅出Struts2(附源码)

    第18章定制拦截器 267 18.1 Interceptor接口 267 18.2 编写一个自定义的拦截器 268 18.3 使用DataSourceInjectorInterceptor拦截器 269 18.4 小结 273 第19章定制结果类型 274 19.1 概述 274 19.2 编写一个...

    深入浅出Struts2

    Struts 2 是Java Web 应用首选的MVC 框架。本书对Struts 2 的工作机理进行了透彻的阐述。书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨...第18章 定制拦截器 第19章... [显示全部]

    struts2.0.jar

    · 引入拦截器: Struts 2为拦截器(interceptor)提供了全面支持。拦截器可在Action类执行前后加以执行。拦截器经配置后,可以把工作流程或者验证等常见功能作用到请求上。所有请求通过一组拦截器传送,之后再发送到...

    Struts2的使用-实验报告.docx

    框架的配置主要包括创建 struts.xml 配置文件,其中定义了各个组件的映射关系、拦截器等。通过配置文件,我们可以指定请求的处理流程,以及请求到达时执行的操作。这为开发者提供了更大的灵活性,能够根据业务需求...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    第18章 定制拦截器 267 18.1 Interceptor接口 267 18.2 编写一个自定义的拦截器 268 18.3 使用DataSourceInjectorInterceptor拦截器 269 18.4 小结 273 第19章 定制结果类型 274 19.1 概述 274 19.2 编写一个自定义...

    低清版 大型门户网站是这样炼成的.pdf

    2.6.1 struts 2内建拦截器介绍 95 2.6.2 定义和使用拦截器栈 97 2.6.3 使用自定义拦截器 98 2.7 小结 100 第3章 struts 2标签库详解与ajax技术应用 103 3.1 struts 2主题与模板 103 3.2 struts 2控制标签详解 ...

    JFinal(JAVA 极速WEB ORM框架 ) v3.2.zip

    AOP支持,拦截器配置灵活,功能强大 Plugin体系结构,扩展性强 多视图支持,支持FreeMarker、JSP、Velocity 强大的Validator后端校验功能 功能齐全,拥有struts2的绝大部分功能 体积小仅218K,且无第三方依赖 ...

    JAVA程序开发大全---上半部分

    2.3.3 定制编辑器 36 2.3.4 定制工作台公共设置 36 2.4 MyEclipse中常用操作 36 2.4.1 配置JRE 36 2.4.2 设置编译路径 37 2.4.3 设置项目属性 38 2.5 本章小结 39 第3章 Java程序的开发 40 3.1 使用JDT编写Java项目 ...

    Spring中文帮助文档

    13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器(ViewResolver) 13.5.2. 视图解析链 13.5.3. 重定向(Rediret)到另一个视图 13.6. 本地化解析器 13.6.1. ...

    Spring API

    13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器(ViewResolver) 13.5.2. 视图解析链 13.5.3. 重定向(Rediret)到另一个视图 13.6. 本地化解析器 13.6.1. ...

    spring in action英文版

     11.1.1 安全拦截器  11.1.2 认证管理器  11.1.3 访问决策管理器  11.1.4 运行身份管理器  11.2 管理身份验证  11.2.1 配置ProviderManager  11.2.2 根据数据库验证身份  11.2.3 根据LDAP...

    java面试题

    答:Struts1和Struts2是两个完全不同的框架,Struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的所有请求。Struts2以核心控制器FilterDispatcher为基础,包含了框架内部的控制流程和处理机制。 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     9.2 利用拦截器(Interceptor)生成审计日志  9.3 Hibernate的事件处理机制  9.4 批量处理数据  9.4.1 通过Session来进行批量操作  9.4.2 通过StatelessSession来进行批量操作  9.4.3 通过HQL来进行批量操作 ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器 13.5.2. 视图解析链 13.5.3. 重定向(Rediret)到另一个视图 13.5.3.1. RedirectView 13.5.3.2. redirect:前缀 13.5.3.3. forward:...

    Spring攻略(第二版 中文高清版).part2

    8.3 用处理程序拦截器拦截请求 297 8.3.1 问题 297 8.3.2 解决方案 298 8.3.3 工作原理 298 8.4 解析用户区域 302 8.4.1 问题 302 8.4.2 解决方案 302 8.4.3 工作原理 302 8.5 外部化区分区域的...

    java web 开发详解

    Struts 2  优点: 架构简单——易于扩展 标记库很容易利用FreeMarker或者Velocity来定制 基于控制器或者基于页面的导航 缺点: 文档组织得很差 对新特征过分关注 Tapestry  优点: 一旦学会它,将极大地提高生产率...

Global site tag (gtag.js) - Google Analytics