weixin_42365484
2010-05-11 16:11 阅读 517
已采纳

怎样用spring aop 拦截servlet

附件中的小例子可以用spring aop拦截普通类的方法,但是不能拦截servlet,可能是因为servlet是由web容器实例化而不是有spring容器实例化。请问怎样可以实现spring aop拦截servlet?或者怎样用spring实例化servlet?谢谢!

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

8条回答 默认 最新

  • 已采纳
    jiangyongyuan jiangyongyuan 2010-05-23 14:18

    这里的理解显然是没有弄清servlet开发中的一些理解
    [quote]
    这样确实可以解决,应该还要更好的方案吧,spring可以实例化struts2的antion,肯定是可以实例化servlet的

    还是感谢mginobili[/quote]

    struct的action、spring mvc等是通过自定义Servlet实现的,如struct的ActionServlet,spring mvc的DispatcherServlet。
    他们都是在servlet规范之上构建的。

    spring如何在servlet中启动,是通过配置listener启动spring容器。spring容器再去管理spring的bean.

    spring为何能管理action,因为action是简历在spring容器之中。

    以上三点可以看到。无论是action,还是spring bean,都是在servlet规范之上整合的。

    servlet的由servlet容器管理,tomcat,jetty等,如果你想通过spring实例化servlet,那么就需要在spring中操作tomcat,jetty实例化servlet的代码。

    是否可行没有操作过。

    不过我们可以看到,spring自己的启动(listener启动)、spring mvc都是通过servlet转到spring之上的bean处理。

    不过你的想法可以换一下,servlet转发到spring bean,通过aop处理。网络上很多spring gwt整合的例子。见:
    http://jiangyongyuan.iteye.com/blog/143455

    点赞 评论 复制链接分享
  • mginobili mginobili 2010-05-11 16:15

    可以使用适配器模式

    在servlet中定义一个对象obj(对象的类中有servlet同名的所有方法)

    servlet的所有后台操作 改为调用这个对象 进行
    比如servlet.doPost()方法
    中就调用obj.doPost()

    然后就可以再spring的配置中 对这个obj进行AOP拦截了

    点赞 评论 复制链接分享
  • chem_zqm chem_zqm 2010-05-11 18:14

    很不明白你为什么要为servlet做AOP,如果是需要对所有web请求进行拦截直接写个Filter配置到web.xml里面不就行了?还有一个问题,spring是不能实例化action的,action对象是struts生成的,你需要对struts.xml进行配置来让spring进行托管

    点赞 评论 复制链接分享
  • skzr_org 「已注销」 2010-05-12 07:53

    呵呵,可以看看Spring提供的httpinvoker,这里就是用到的Servlet

    点赞 评论 复制链接分享
  • netweiandwinnie netweiandwinnie 2010-05-16 10:42

    可以考虑在 你的servlet中调用一个ActionBean,而该Bean是对Spring容器管理的,那么就很容易使用Spring的AOP特性完成你的要求了。

    其实,如果你使用springMVC 作为你的Web框架,那么最终的servlet就是一个ActionBean。

    点赞 评论 复制链接分享
  • netweiandwinnie netweiandwinnie 2010-05-16 10:50

    如你所提到的 Spring可以实例化struts2的antion 那是因为struts2为集成spring做了相应的接口(因为Spring实在是太流行了),很多Web框架其实都有提供与Spring的集成接口。

    你是用的是GWT吗?,我不知道GWT是否有提供针对Spring的集成接口,我想官方可能不会提供吧,因为google有自己的guice,但我想在民间,一定有人为GWT集成Spring做过努力了,你尝试搜索 Spring + GWT 试试看,....

    如果真的还没有成熟的扩展用于 GWT集成Spring,那就自己写一个吧,其实并不难,就是在你的servlet中 用某中策略 去选择 Spring容易总的一个Bean,再将客户请求委托给Bean处理即可.

    点赞 评论 复制链接分享
  • xie2022228 xie2022228 2010-05-20 10:53

    我觉得你的要求是不可实现的。
    spring的aop是如何实现的?是因为你将对象交给它托管了,它才能对它托管的对象实例化和方法调用的时候进行拦截。如果一个对象的实例化和方法调用不是通过它,它怎么能控制住呢?

    servlet是由web容器实例化和调用的,spring控制不了他们。最多只是用过滤器做一些处理

    点赞 评论 复制链接分享
  • iteye_10598 iteye_10598 2010-05-21 11:30

    servlet 和 aop直接 adapter

    一:代码级
    二:运行期--cglib之流

    点赞 评论 复制链接分享

相关推荐