`
yingxiongwudi
  • 浏览: 58868 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

用模板方法模式简化控制层(action)设计

    博客分类:
  • java
阅读更多
在基于Model2的应用中,控制层的类总会包含对业务层诸类的调用,业务层诸类不可避免的要产生各种异常,如果统一到控制层进行处理的话会导致代码变得庞大臃肿还有不少重复,这种的例子在Web应用中的Servlet和Action诸类中并不少见。

如果我们使用模板方法模式(Template Method Pattern)将业务处理和异常处理分开,能有效简化控制层诸类的代码,借用这种模式,我们可以把固定的异常处理代码放在基类中,而让子类来实现具体的业务,如果执行业务过程中出现异常如数据库无法连接,用户找不到等异常后,直接将异常抛出让基类来处理,这样做成功的把业务处理和异常处理分开到了子类和基类两种类中,涉及具体业务处理的子类代码得到了很大的简化,更方便阅读,修改和管理。

具体请参考以下代码:

诸Action的基类,包含了所有的异常处理,它是一个抽象类,规定子类必需实现process函数:
package com.heyang.action.base;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.InvalidDataAccessResourceUsageException;
import org.springframework.dao.TypeMismatchDataAccessException;

import com.heyang.domain.User;
import com.heyang.exception.database.CannotFindRecordByIdException;
import com.heyang.exception.database.OneIdMultiRecordException;
import com.heyang.exception.user.CannotFindUserInSessionException;
import com.heyang.exception.user.ErrorPswdException;

/** *//**
 * 各个Action的基类
 * @author 何杨(heyang78@gmail.com)
 *
 * @since 2008-8-29 上午09:00:48
 * @version 1.00
 */
public abstract class BizBaseAction extends Action {
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        request.setCharacterEncoding("UTF-8");
                
        try{
            return process(mapping,form,request,response);
        }
        catch(CannotFindUserInSessionException ex){
            // 用户名不存在
            request.setAttribute("msg", "在session中找不到用户,要执行操作请先登录");            
            return new ActionForward("/web/page/login.jsp");
        } 
        catch(CannotFindRecordByIdException ex){
            // 用户名不存在
            request.setAttribute("msg", "用户名不存在,请重新输入");            
            return new ActionForward("/web/page/login.jsp");
        }  
        catch(ErrorPswdException ex){
            // 用户登录密码错误
            request.setAttribute("msg", "密码错误,请重新输入");            
            return new ActionForward("/web/page/login.jsp");
        }
        catch(OneIdMultiRecordException ex){
            // 系统发生重大问题,一个用户名对应着多条记录
            request.setAttribute("feedbackTitle", "系统发生重大问题");
            request.setAttribute("feedbackConcept", "系统发生重大问题,成员用户名对应着多条记录,报告此错误的邮件已经发给系统管理员,请耐心等候处理。");
            return new ActionForward("/web/page/result.jsp");
        }          
        catch(TypeMismatchDataAccessException ex){
            request.setAttribute("feedbackTitle", "Java类型和数据类型不匹配.");
            request.setAttribute("feedbackConcept", "错误信息为"+ex.getMessage());
            return new ActionForward("/web/page/result.jsp");
        }
        catch(DataAccessResourceFailureException ex){
            request.setAttribute("feedbackTitle", "无法连接到数据库,请检查数据库连接是否正确.");
            request.setAttribute("feedbackConcept", "错误信息为"+ex.getMessage());
            return new ActionForward("/web/page/result.jsp");
        }
        catch(DataIntegrityViolationException ex){
            request.setAttribute("feedbackTitle", "Insert或Update数据时违反了完整性.");
            request.setAttribute("feedbackConcept", "错误信息为"+ex.getMessage());
            return new ActionForward("/web/page/result.jsp");
        }
        catch(InvalidDataAccessResourceUsageException ex){
            request.setAttribute("feedbackTitle", "使用错误的SQL语句或数据访问关系型数据库.");
            request.setAttribute("feedbackConcept", "错误信息为"+ex.getMessage());
            return new ActionForward("/web/page/result.jsp");
        }
        catch(Exception ex){
            request.setAttribute("feedbackTitle", "未知的错误");
            request.setAttribute("feedbackConcept", "错误信息为"+ex.getMessage());
            return new ActionForward("/web/page/result.jsp");
        }
    }
    
    /** *//**
     * 留待子类实现业务
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    protected abstract ActionForward process(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
    throws Exception ;

    
    /** *//**
     * 从Session中找出登录用户
     * @param request
     * @return
     * @throws CannotFindUserInSessionException
     */
    protected User getUser(HttpServletRequest request) throws CannotFindUserInSessionException{
        // 从Session中取得用户
        User user = (User) request.getSession().getAttribute("user");
        if (user == null) {
            throw new CannotFindUserInSessionException("在session中找不到用户");
        }
        
        return user;
    }
}



子类之一loginAction,只需实现简短的process函数即可,所有异常抛出由基类处理:
package com.heyang.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.heyang.action.base.BizBaseAction;
import com.heyang.domain.User;
import com.heyang.service.UserService;
import com.heyang.util.ReqUtil;
import com.heyang.util.SpringUtil;

/** *//**
 * 用于用户登录的Action
 * @author 何杨(heyang78@gmail.com)
 *
 * @since 2008-8-29 上午09:00:48
 * @version 1.00
 */
public final class LoginAction extends BizBaseAction {
    public ActionForward process(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        request.setCharacterEncoding("UTF-8");
        
        // 取得参数
        String name = ReqUtil.getFormProperty("name",form);
        String pswd = ReqUtil.getFormProperty("pswd",form);
            
        // 取得Service
        UserService service=SpringUtil.getUserService();        
        
        // 取得用户
        User user=service.getUser(name, pswd);
        request.getSession().setAttribute("user", user);
        return new ActionForward("/ShowBlocks.do");
    }
}


这样完成以后,对子类来说,只需要关心业务代码即可,出现异常后的处理和转向都由基类规定的模板方法完成,这正是模板方法模式给我们带来的好处。有点疑惑的是,现在还不确定这样做会有什么消极印象,如安全性或结构方面的.



分享到:
评论

相关推荐

    J2EE设计模式与框架技术的应用研究

    设计模式是一种可以重复使用的解决特定问题的模板或方案,而框架技术则是实现这些设计模式的具体方法和工具。本文探讨了J2EE设计模式与框架技术在构建Web系统中的应用,特别研究了Struts和Hibernate两大框架的作用。...

    毕业设计模板 网上购物系统

    3. **控制类(Controller)**:Struts中的Action类,负责接收请求,处理业务逻辑,并调用模型进行数据操作。 4. **视图(View)**:JSP页面,展示数据和交互界面,可能使用EL(Expression Language)和JSTL(Java...

    J2EE设计模式与Structs详解

    设计模式是软件工程中的一种最佳实践,它们是解决常见问题的经过验证的解决方案模板。在J2EE环境中,设计模式对于创建可扩展、灵活且易于维护的应用程序至关重要。本资料重点介绍了J2EE中的常用设计模式以及Structs...

    基于SSH框架多层结构的代码生成工具的设计与实现

    4. **Action类生成**:根据业务需求生成Struts2的Action类,定义执行的动作和返回的结果,连接视图层和控制层。 5. **配置文件生成**:生成Spring的bean配置文件,Struts2的配置文件,以及Hibernate的映射文件(hbm...

    SSH框架模板-注解类模板

    在Struts2中,使用注解可以避免传统的XML配置,使得控制器(Action)的定义更加简洁。例如,`@Action` 注解用于标识一个方法作为处理请求的入口,而`@Result` 注解则用于指定处理后的跳转路径。 **Spring** 是一个...

    深入浅出的理解框架SSH与MVC设计模式 - 副本.docx

    MVC模式是一种软件设计模式,用于分离应用程序的数据模型、用户界面和控制逻辑。在Java EE应用中,这一模式通常表现为: - **Model(模型)**:代表业务逻辑和数据,通常包括数据库操作、业务对象和服务接口等。在...

    servlet的模板

    为了解决这个问题,开发人员引入了Servlet模板,它是一种设计模式,允许我们以更抽象、更灵活的方式处理HTTP请求,减少了代码冗余,提高了开发效率。 Servlet模板的主要思想是将HTTP请求的处理逻辑与实际的HTTP响应...

    SSH2框架博客模板

    它结合了Struts2的MVC设计模式、Spring的依赖注入(DI)与面向切面编程(AOP)以及Hibernate的对象关系映射(ORM)功能,为开发者提供了强大的后端支持。 Struts2是ActionServlet的升级版,基于拦截器的MVC框架,...

    SSH框架模板 提供了基于配置文件类型的模板

    它们分别负责MVC模式中的表现层、业务层和数据持久层,为开发者提供了强大的功能和灵活的架构。 标题中提到的"SSH框架模板"是一种预配置的开发模板,旨在简化开发过程,尤其是对初学者而言。它将SSH框架的核心配置...

    struts2框架空白模板.rar

    Struts2框架是一款基于MVC(Model-View-Controller)设计模式的开源Java Web应用程序框架,它极大地简化了Java EE Web应用的开发过程。这款框架由Apache软件基金会维护,是Struts1的升级版本,提供了更强大的功能和...

    毕业论文(Web平台设计)模板

    Struts是MVC(Model-View-Controller)设计模式的实现,负责处理视图和控制器层,提供业务逻辑与用户界面的解耦。Spring框架则作为一个全面的容器,管理着应用程序的对象及依赖关系,支持AOP(面向切面编程)和DI...

    ssh框架模板

    5. **使用方法**: 开发者拿到这个SSH框架模板后,可以直接在action层编写业务逻辑,调用service层的方法,service层再通过dao层与数据库进行交互。实体类(pojo)根据实际数据库表结构进行调整,而配置文件如...

    struts2_spring_ibatis根据模板文件导出Excel

    Struts2、Spring和iBatis是Java Web开发中常用的三大框架,它们分别负责MVC模式中的Action层、业务逻辑层和数据访问层。在这个项目中,“struts2_spring_ibatis根据模板文件导出Excel”是利用这三大框架实现了一个...

    SSH-javaWeb开发基础模板

    SSH JavaWeb开发基础模板是一个针对初学者的课程设计实验模板,它主要涵盖了Spring、Struts和Hibernate这三大框架的整合应用。SSH是JavaWeb开发中非常流行的一种框架组合,能够帮助开发者快速构建企业级的Web应用...

    SSH项目实例,有不同写法模板

    这些模板展示了不同的设计模式和最佳实践,例如单例模式、工厂模式在服务层的运用,以及贫血模型和富模型两种不同的业务对象设计。 开发者可以通过研究这些模板,学习如何配置SSH框架,理解它们之间的协作方式,...

    Zend_Framework_mvc设计模式

    ### Zend Framework与MVC设计模式 #### 概述 Zend Framework是一个开源的PHP框架,它遵循MVC(Model-View-Controller)设计模式。MVC是一种软件架构模式,旨在将应用程序逻辑、用户界面以及控制流程分离,使得开发...

    适合初学者的ssh模板

    - **DAO设计模式**:如何创建DAO接口和实现,以及如何通过Spring管理这些DAO。 - **事务管理**:学习如何在Spring中配置事务边界,理解事务的ACID属性。 - **错误和异常处理**:Struts如何处理应用中的异常,并展示...

    SSH(struts+spring+hibernate)整合模板

    这个模板提供了一种快速开发的基础结构,帮助开发者节省时间,提高效率,尤其适合初学者理解和实践MVC设计模式。 Struts2作为表现层框架,负责处理HTTP请求并管理视图与控制器之间的交互。它提供了Action类来处理...

    Velocity 生成Action、Serv、Dao代码

    总结来说,`Velocity 生成Action、Serv、Dao代码`是一种高效的方法,利用 Velocity 模板引擎自动化生成Java项目中的常见三层架构代码。通过理解并运用这一技术,开发者可以提高开发效率,减少重复劳动,使代码更加...

    CRM系统模板

    Struts的模型驱动(ModelDriven)设计模式可以简化对象绑定,提高开发效率。 5. 报表和分析:CRM系统通常提供报表生成和数据分析工具,帮助企业理解客户行为,识别销售趋势。利用Struts的ActionContext,可以轻松地...

Global site tag (gtag.js) - Google Analytics