`
sungang_1120
  • 浏览: 325271 次
  • 性别: 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拦截器

    标题“struts2拦截器”指的是Struts2框架中的拦截器机制,这是一个关键的组件,可以让我们在不修改实际业务代码的情况下,实现对请求处理流程的扩展和定制。 描述中提到的“基于struts2的拦截器测试,实现了页面的...

    struts2.X 拦截器源码

    Struts2.X 拦截器是Apache Struts框架的核心组件之一,它是基于拦截器模式实现的,使得开发者能够方便地扩展和定制应用程序的行为。在Struts2中,拦截器扮演着中间件的角色,它在Action执行前后进行处理,可以进行如...

    struts2拦截器的使用方法

    ### Struts2拦截器的使用方法 #### 一、Struts2拦截器概述 Struts2框架中的拦截器(Interceptor)是一种重要的机制,用于在Action执行前后进行一系列处理,比如参数验证、数据预处理等。它能够帮助开发者更加灵活...

    Struts2的拦截器——Struts2拦截器的基础知识.pptx

    这种可插拔式设计使得开发者可以根据需求自由定制拦截器链。 4. **内置拦截器**: - Struts2提供了一系列内置拦截器,如`params`、`validation`(数据校验)、`i18n`(国际化)、`exception`(异常处理)和`...

    Struts2 配置登陆拦截器

    在Struts2中,拦截器是实现业务逻辑控制和处理流程的重要组件,它们可以添加额外的功能,如日志记录、权限检查、事务管理等,而不干扰实际的业务操作。本篇文章将详细介绍如何配置Struts2的登录拦截器,以及其背后的...

    struts2自定义拦截器

    自定义拦截器是Struts2框架的一大亮点,它允许开发者根据需求定制自己的拦截逻辑。以下将详细讲解如何创建、配置以及使用自定义拦截器。 1. **创建自定义拦截器** 创建自定义拦截器需要继承`...

    Struts 2的拦截器

    2. **配置拦截器**: 在Struts2的配置文件(如`struts.xml`或`struts-default.xml`)中,使用`&lt;interceptors&gt;`标签定义拦截器,`&lt;interceptor&gt;`标签定义单个拦截器,通过`name`属性指定拦截器名,`class`属性指定拦截...

    struts2 自定义拦截器.rar

    自定义拦截器是Struts2框架中一个非常重要的特性,允许开发者扩展和定制框架的行为,以满足特定的业务需求。这篇博客文章可能是关于如何在Struts2中创建和使用自定义拦截器的教程。 在Struts2中,拦截器是基于责任...

    Struts2 拦截器 Interceptor

    通过以上两个例子可以看出,Struts2中的拦截器机制非常灵活,可以根据不同的需求定制不同的拦截器栈。开发者可以根据自己的实际业务场景选择合适的拦截器来增强应用的功能,提高代码的可维护性和扩展性。

    struts2 日志拦截器

    Struts2日志拦截器是Java Web开发框架Struts2中的一个重要组件,它允许开发者在应用程序执行过程中记录和处理日志信息。日志对于任何软件系统都是至关重要的,因为它提供了程序运行时的行为跟踪,帮助开发者在调试、...

    struts2拦截器示例

    拦截器是Struts2的核心特性之一,它在Action调用前后执行,提供了AOP(面向切面编程)的能力,允许开发者扩展和定制应用的行为,无需深入到每个Action的实现中。在本示例中,我们将探讨如何设置和使用Struts2的拦截...

    Struts2拦截器的使用

    通过这种方式,Struts2框架提供了一种灵活且强大的方式来控制Action的执行流程,使得开发者可以根据不同的需求定制拦截器的行为,从而实现更为复杂的业务逻辑和功能。总之,理解并熟练掌握Struts2拦截器的配置和使用...

    struts2拦截器笔记

    通过深入学习 Struts2 的拦截器机制,开发者可以更好地理解框架的工作原理,并且能够定制化地处理业务需求,提高应用程序的效率和安全性。同时,这也为团队协作和代码规范提供了有力的支持。因此,熟悉并熟练运用...

    使用struts拦截器+注解实现日志审计功能

    在Struts 2中,拦截器(Interceptors)是一个强大的特性,可以用于实现各种功能,如权限检查、日志记录、事务管理等。本文将详细介绍如何利用Struts拦截器和注解来实现日志审计功能。 首先,我们需要了解Struts拦截...

    struts2拦截器详述ppt

    开发者可以通过配置文件(如`struts-default.xml`)来定制自己的拦截器和拦截器链。 下面列出了一些常见的Struts2内置拦截器及其功能: - **Alias Interceptor**:在不同请求之间转换请求参数的名字,保持请求内容...

    struts2拦截器实例

    Struts2是一个强大的MVC(模型-视图...拦截器是Struts2中非常重要的一个特性,它使得我们可以灵活地扩展和定制框架的行为,而无需修改Action代码。同时,结合数据库操作,我们还可以构建完整的用户身份验证和授权系统。

    Struts2 配置第一个拦截器

    在Struts2中,拦截器(Interceptor)是实现业务逻辑处理、数据验证、权限控制等核心功能的重要组件。本篇将详细介绍如何配置并创建Struts2的第一个拦截器。 首先,了解拦截器的基本概念。拦截器在Action执行前后...

    struts2自定义类型转换、拦截器实例练习

    本实例练习旨在帮助你深入理解Struts2的工作原理,特别是自定义类型转换和拦截器的使用。 首先,让我们详细探讨Struts2的MVC架构。在MVC模式中,Model代表业务逻辑,View负责展示数据,而Controller则是两者之间的...

    struts03:拦截器、过滤器与拦截器的区别、文件上传

    在Struts2(Struts03可能是其一个版本或变体)框架中,拦截器是一种强大的机制,它可以监控和修改Action调用的过程。拦截器按照预定义的顺序执行,这些顺序可以通过配置文件进行定制。它们通常用于实现通用的功能,...

    struts2的自定义拦截器代码

    总结来说,自定义拦截器是Struts2框架灵活性和可扩展性的体现,它使得开发者能够按照业务需求定制行为,增强应用的功能。通过理解和熟练运用自定义拦截器,开发者可以更好地驾驭Struts2框架,构建高效、可维护的Java...

Global site tag (gtag.js) - Google Analytics