知识大全 JAVA拦截器原理及Struts2扩展

Posted 扩展

篇首语:顾虑太多难以起步,背负太多难走远路。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 JAVA拦截器原理及Struts2扩展相关的知识,希望对你有一定的参考价值。

JAVA拦截器原理及Struts2扩展  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  最近发现很多朋友连拦截器都不知道 于是想写个BLOG总结一下

  java拦截器的基本原理其实非常简单 说白了就是动态代理类

  下面来看一个简单的例子

  首先 我建立一个拦截器的类InterceptorClass 这里的before()和after()方法是以后拦截器会执行的方法

  CODE清单一

  Java代码

  <SPAN >//拦截器

  public class InterceptorClass

  public void before()

  System out println( 拦截器InterceptorClass方法调用:before()! );

  

  public void after()

  System out println( 拦截器InterceptorClass方法调用:after()! );

  

  </SPAN>

  我们模拟一个业务组件接口BusinessInterface 和一个业务组件实现类BusinessClass

  CODE清单二

  Java代码

  <SPAN >/**

  * Created by IntelliJ IDEA

  * User: Ming

  * Date:

  * Time: : :

  */

  //业务组件接口

  public interface BusinessInterface

  public void doSomething();

  </SPAN>

  CODE清单三

  Java代码

  <SPAN >/**

  * Created by IntelliJ IDEA

  * User: Ming

  * Date:

  * Time: : :

  */

  //业务组件实现类

  public class BusinessClass implements BusinessInterface

  public void doSomething()

  System out println( 业务组件BusinessClass方法调用:doSomething() );

  

  </SPAN>

  然后 创建一个动态代理类DynamicProxyHandler 这个类是集成InvocationHandler接口的 动态类的原理实际上是使得当你执行一个动态方

  法的时候 他可以把这个动态方法dispatch到这个动态类上来 这样 你就可以在这个方法的前后嵌入自己的一些方法

  CODE清单四

  Java代码

  <SPAN >/**

  * Created by IntelliJ IDEA

  * User: Ming

  * Date:

  * Time: : :

  */

  /**

  * 动态代理类 实现InvocationHandler接口

  * 包含了业务对象绑定动态代理类的处理

  */

  public class DynamicProxyHandler implements InvocationHandler

  private Object business;//被代理对象

  private InterceptorClass inceptor = new InterceptorClass();//拦截器

  public DynamicProxyHandler(Object business)

  this business = business;

  </SPAN>

  // 代理要调用的方法 并在方法调用前后调用连接器的方法

  Java代码

  <SPAN >/**

  * @param proxy    代理类对象

  * @param method   被代理的接口方法

  * @param args      被代理接口方法的参数

  * @return

  * @throws Throwable

  */

  public Object invoke(Object proxy Method method Object[] args) throws Throwable

  Object result = null;

  inceptor before();

  result = method invoke(business args);

  inceptor after();

  return result;

  </SPAN>

  OK 我们来写个类测试一下

  CODE清单五

  Java代码

  <SPAN >    public static void main(String[] args)

  //生成待测试的业务组件对象

  BusinessInterface business = new BusinessClass();

  //生成动态代理类实例

  DynamicProxyHandler handler = new DynamicProxyHandler(business);

  BusinessInterface businessProxy = (BusinessInterface) Proxy newProxyInstance(

  //被代理类的ClassLoader

  business getClass() getClassLoader()

  //要被代理的接口 本方法返回对象会自动声称实现了这些接口

  business getClass() getInterfaces()

  //代理处理器对象

  handler);

  //用动态代理类调用方法

  businessProxy doSomething();

  </SPAN>

  来看看结果

  近期struts 很流行 而且拦截器是struts 里面一个比较好的功能 下面举个例子说明一下拦截器在struts 中的用法

  struts 对拦截器实现做了一个封装 使得我们在实现的时候比较简单

  首先我们要建一个拦截器类

  CODE清单六

  Java代码

  <SPAN >public class AuthorizationInterceptor extends AbstractInterceptor

  @Override

  public String intercept(ActionInvocation invocation) throws Exception

  Map session = invocation getInvocationContext() getSession();

  String userName = (String) session get( userName );

  if ( userName != null && userName equals( test ))

  System out println( 拦截器 合法用户登录 );

  return invocation invoke();

  

  else

  

  System out println( 拦截器 用户未登录 );

  return Action LOGIN;

  

  

  

  </SPAN>

  这个类是必须要继承struts 包中提供的AbstractInterceptor类 这个类有一个抽象方法intercept 这个方法是必须要实现的

  那么经理在这个拦截器里面写了一个简单的实现 对url用户合法性做了一个限制

  接下来比较关键的是过滤器在struts 中的配置 先看看代码

  CODE清单七

  Java代码

  <SPAN ><package name= system extends= struts default >

  <interceptors>

  <!   定义权限控制拦截器  >

  <interceptor name= authority

  class= mon intercepts struts AuthorizationInterceptor />

  <! 定义一个包含权限控制的拦截器栈   >

  <interceptor stack name= mystack >

  <interceptor ref name= defaultStack ></interceptor ref>

  <interceptor ref name= authority ></interceptor ref>

  </interceptor stack>

  </interceptors>

  <! 定义默认拦截器   >

  <default interceptor ref name= mystack />

  <! 定义全局处理结果   >

  <global results>

  <result name= login >index jsp</result>

  </global results>

  <action name= login_* class= web system LoginAction method= >

  <result name= success >system/homepage jsp</result>

  </action>

  </package></SPAN>

  在interceptors节点里 我们可以定义多个拦截器 这里的名为authority的只是其中的一个 struts 的拦截器栈我是先执行struts 默认的拦

  截器defaultStack 然后再执行我的 然后只需要用default interceptor ref标签设置好这个system包中的默认拦截器为这个拦截器就OK了

  struts 中引入了package这个概念 我觉得十分实用 当然这对struts 拦截器也是个实惠 我们可以根据不同的action来分包和不同的拦截器

cha138/Article/program/Java/hx/201311/26790

相关参考

知识大全 Java实现的拦截器

Java实现的拦截器  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  拦截器在在流行的开源框架中很

知识大全 实现自已的拦截器

Struts2教程9:实现自已的拦截器  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在上一篇中

知识大全 10分钟学懂Struts 2.0 拦截器

10分钟学懂Struts2.0拦截器  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  简介  在S

知识大全 Java动态代理机制综合分析及扩展

Java动态代理机制综合分析及扩展  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java动态代

知识大全 从实例看struts2运行原理

  简单例子  先做一个最简单的struts的例子在浏览器中请求一个action然后返回一个字符串到jsp页面上显示出来  第一步把struts最低配置的jar包加入的项目中  monslogging

知识大全 Java异常处理原理及应用

Java异常处理原理及应用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  readLine方法有

知识大全 PHP中的Java扩展

PHP中的Java扩展  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  综述Java的易扩展性是它

知识大全 Java应用的动态扩展

Java应用的动态扩展  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  这里所谓的可扩展应用是指这

知识大全 java图片裁剪原理

  总体思想  前台网页用js得到裁剪图片的id及xy宽度和高度  服务端根据id取出要裁剪的图片  根据这些参数来生成裁剪的图像后台代码如下  java代码  packagewodexiangce;

知识大全 使用Java构造高可扩展应用

使用Java构造高可扩展应用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  当CPU进入多核时代