超轻量级MVC框架的设计和实现 (3)

电力电子技术文章:ACOT控制模式在Buck变换器中的频率稳定性分析 本文深入分析了ACOT控制模式在Buck变换器中实现频率稳定性的原理与优势。通过对比传统COT模式,阐述了ACOT如何通过自适应调整导通时间,将开关频率锁定在设定值,从而有效应对输入电压与负载变化。文章还探讨了其在轻载DCM模式下的高效与平滑切换特性,并提供了关键的设计考量与实战指南。 阅读详情

由于MVC框架的设计,必须保证配置IoC容器时指定正确的Scope,否则无法正常工作:

用户定义的所有的Action类必须是Prototype域,即Guice默认的作用域,如果定义为Singleton会导致并发请求的数据混乱;

用户定义的所有的Interceptor,ViewResolver和ExceptionResolver应该是Singleton的,MVC框架会保持其引用,即时定义为Prototype也是无效的。

在实现Interceptor时需要注意,如果要继续处理请求,就必须调用

chain.doInterceptor(action);

否则请求不会被继续处理。多个Interceptor的排列顺序很重要,用@Order指定,小的在前,即优先级高。

下面是几个简单的示例:

一个处理事务的Interceptor,能保证每个Action的执行都在事务范围内:

package com.javaeedev.lightweight.mvc.sample;

@Singleton
@Order(0)
public class TransactionInterceptor implements Interceptor {

    @Inject TransactionManager transactionManager;

    public void intercept(Action action, InterceptorChain chain) throws Exception {
        Transaction tx = transactionManager.beginTransaction();
        try {
            chain.doInterceptor(action);
            tx.commit();
        }
        catch(Exception e) {
            tx.rollback();
            throw e;
        }
    }

}

一个处理所有异常的ExceptionHandler:

package com.javaeedev.lightweight.mvc.sample;

@Singleton
public class ExceptionHandler implements ExceptionResolver {

    public void init(ServletContext context) throws ServletException {
    }

    public ModelAndView handleException(Action action, Exception e) throws Exception {
        if(e instanceof NeedSignonException) {
            // let user sign on:
            return new ModelAndView("/signon.html");
        }
        throw e;
    }

}

很多时候,组件的初始化需要依赖当前Web应用的ServletContext对象,在IoC容器中如何传入ServletContext?对于Guice来说,需要编写一个Module告诉容器各组件的信息,因此,让Module实现一个ServletContextAware接口,在DispatcherServlet中实例化该Module的时候就可以传入ServletContext对象:

package com.javaeedev.lightweight.mvc.sample;

public class MyModule implements Module, ServletContextAware {

    private ServletContext context;

    public void setServletContext(ServletContext context) {
        this.context = context;
    }

    public void configure(Binder binder) {
        ... // init all beans here...
    }

}

传入ServletContext的目的是为了让组件能从中获得当前Web应用目录下的资源文件。

关于这个MVC框架的设计就介绍到此,感兴趣的朋友可以从以下地址下载:

http://code.google.com/p/lightweight-mvc/ 




由于MVC框架的设计,必须保证配置IoC容器时指定正确的Scope,否则无法正常工作:

用户定义的所有的Action类必须是Prototype域,即Guice默认的作用域,如果定义为Singleton会导致并发请求的数据混乱;

用户定义的所有的Interceptor,ViewResolver和ExceptionResolver应该是Singleton的,MVC框架会保持其引用,即时定义为Prototype也是无效的。

在实现Interceptor时需要注意,如果要继续处理请求,就必须调用

chain.doInterceptor(action);

否则请求不会被继续处理。多个Interceptor的排列顺序很重要,用@Order指定,小的在前,即优先级高。

下面是几个简单的示例:

一个处理事务的Interceptor,能保证每个Action的执行都在事务范围内:

package com.javaeedev.lightweight.mvc.sample;

@Singleton
@Order(0)
public class TransactionInterceptor implements Interceptor {

    @Inject TransactionManager transactionManager;

    public void intercept(Action action, InterceptorChain chain) throws Exception {
        Transaction tx = transactionManager.beginTransaction();
        try {
            chain.doInterceptor(action);
            tx.commit();
        }
        catch(Exception e) {
            tx.rollback();
            throw e;
        }
    }

}

一个处理所有异常的ExceptionHandler:

package com.javaeedev.lightweight.mvc.sample;

@Singleton
public class ExceptionHandler implements ExceptionResolver {

    public void init(ServletContext context) throws ServletException {
    }

    public ModelAndView handleException(Action action, Exception e) throws Exception {
        if(e instanceof NeedSignonException) {
            // let user sign on:
            return new ModelAndView("/signon.html");
        }
        throw e;
    }

}

很多时候,组件的初始化需要依赖当前Web应用的ServletContext对象,在IoC容器中如何传入ServletContext?对于Guice来说,需要编写一个Module告诉容器各组件的信息,因此,让Module实现一个ServletContextAware接口,在DispatcherServlet中实例化该Module的时候就可以传入ServletContext对象:

package com.javaeedev.lightweight.mvc.sample;

public class MyModule implements Module, ServletContextAware {

    private ServletContext context;

    public void setServletContext(ServletContext context) {
        this.context = context;
    }

    public void configure(Binder binder) {
        ... // init all beans here...
    }

}

传入ServletContext的目的是为了让组件能从中获得当前Web应用目录下的资源文件。

关于这个MVC框架的设计就介绍到此,感兴趣的朋友可以从以下地址下载:

http://code.google.com/p/lightweight-mvc/ 




Unity UI Toolkit避坑指南:从官方Samples到实际项目,这些‘坑’我帮你踩过了 本文分享了Unity UI Toolkit在实际项目中的避坑经验和优化技巧,包括动画系统的高效替代方案、3D世界UI的创新实现方式、USS样式继承的反直觉规则等。通过详细的代码示例和性能优化策略,帮助开发者避免常见陷阱,提升开发效率。 阅读详情

相关推荐

Matlab2018a崩溃解决的办法No sandbox or build area path

Matlab 2018a (No sandbox or build area path)出现崩溃后需要使用terminal进行如下操作: cd /home/david/MySoft/MATLAB/R2018a/bin/glnxa64 (你的matlab路径) mkdir exclude mv libfreetype* exclude/ 执行后图片如下: 如果你用的Windows系统,请手动按照上面步骤剔除了dll。 Matlab 2018a (No sandbox or build are

David Xiao 1万+

超轻量级MVC框架的设计和实现 (1)

前段时间准备做一个小网站,但是又不想用Spring/Struts/WebWork这样的大块头,因此决定自己写一个MVC框架。花了3天左右时间完成,目前运行良好,整个MVC框架仅21KB,感兴趣的朋友可以从http://code.google.com/p/lightweight-mvc/downloads/list下载完整的源代码和jar包。设计目标:一个最简单最小巧的MVC框架,花哨的功能一个

软件开发资料汇总 1068

什么是深度展开网络?如何将迭代算法的每一次迭代展开成深度网络对应的一层?深度展开网络进行端对端训练,其中端对端是什么意思?

在深度学习和机器学习的背景下,“端到端”(End-to-end)训练指的是将输入数据直接映射到最终输出的过程,而不需要任何中间的手动数据预处理或特征工程。- **自然语言处理**:端到端自然语言处理系统可以将自然语言输入直接转化为计算机可理解的语言输出,而不需要对语言进行分解和转化。- **推荐系统**:通过使用深度神经网络,端到端推荐系统可以直接根据用户历史行为预测其未来的兴趣爱好,并推荐相应的产品或服务。4. **直接映射**:从输入到输出的直接映射,中间没有任何拆分或分解的过程。

m0_67897882的博客 5440
上一篇: Struts 2.0 解读笔记
下一篇: Subclipse入门指南
techweb
博客等级 码龄19年 226粉丝 3842原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值