`
锅巴49
  • 浏览: 161535 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

web层action端业务逻辑层设计

阅读更多

项目越做越大,代码越来越多。陆续出了一些问题。

 

1、action层代码过多,复用性不强。往往多个应用要使用同一个功能。如A应用中有发布感受,B应用中也需要,这时B就把A中action的代码复制过来。

 

2、一个功能比较复杂,调用service比较多。发布文章前要判断是否黑名单,是否有违禁词,然后持久化,然后发积分和站内信等。现在全部写在一起,修改困难,不灵活。

 

重构目标:

 

1、新建Biz层,该层负责调用各单一小模块实现一个复杂功能。该层可打成jar包或发布成SOA,供其他方调用。

 

2、其他应用中如果也要发感受功能,但需要改一个小位置。如发积分策略,将新增自己的发积分模块并注入该Biz即可,影响小。

 

附上代码

 

package com.my.biz;

/**
 * 
 * 描述
 *
 * @author 锅巴
 * @version 1.0 2010-8-26
 */
public interface IBiz {

    Object[] execute(Object ... objects );
}

 

package com.my.biz;

import java.util.List;

import com.my.domain.Review;

/**
 * 
 * 描述 这是发布感受的处理流程
 *
 * @author 锅巴
 * @version 1.0 2010-8-26
 */
public class InsertReviewBiz implements IBiz{

    //初始化信息
    private List<IBizHandler<Review>> initInfoHandlers;
    
    //验证信息
    private List<IBizHandler<Review>> validateHandlers; 
        
    //安全检查
    private List<IBizHandler<Review>> securityCheckHandlers;
    
    //持久化
    private List<IBizHandler<Review>> saveHandlers;
    
    //持久化后操作
    private List<IBizHandler<Review>> afterSaveHandlers;
    
    /**
     * objects[0] = review;
     */
    @Override
    public Object[] execute(Object... objects) {
        // TODO Auto-generated method stub
        BizUtil.exetureHandler(initInfoHandlers, (Review)objects[0]);
        
        BizUtil.exetureHandler(validateHandlers, (Review)objects[0]);
        
        BizUtil.exetureHandler(securityCheckHandlers, (Review)objects[0]);
        
        BizUtil.exetureHandler(saveHandlers, (Review)objects[0]);
        
        BizUtil.exetureHandler(afterSaveHandlers, (Review)objects[0]);
        
        return objects;
    }

    

    public void setInitInfoHandlers(List<IBizHandler<Review>> initInfoHandlers) {
        this.initInfoHandlers = initInfoHandlers;
    }

    public void setValidateHandlers(List<IBizHandler<Review>> validateHandlers) {
        this.validateHandlers = validateHandlers;
    }

    public void setSecurityCheckHandlers(
            List<IBizHandler<Review>> securityCheckHandlers) {
        this.securityCheckHandlers = securityCheckHandlers;
    }

    public void setSaveHandlers(List<IBizHandler<Review>> saveHandlers) {
        this.saveHandlers = saveHandlers;
    }

    public void setAfterSaveHandlers(List<IBizHandler<Review>> afterSaveHandlers) {
        this.afterSaveHandlers = afterSaveHandlers;
    }

    
}

 

 

package com.my.biz;

/**
 * 
 * 描述
 *
 * @author 锅巴
 * @version 1.0 2010-8-26
 * @param <T>
 */
public interface IBizHandler<T> {

    void execute(T t);
}

 

 

 

package com.my.biz;

import java.util.List;

/**
 * 
 * 描述
 *
 * @author 锅巴
 * @version 1.0 2010-8-26
 */
public final class BizUtil {

    private BizUtil(){
        
    }
    
    static <T> void exetureHandler(List<IBizHandler<T>> bizHandlers,T t){
        for(IBizHandler<T> bizHandler : bizHandlers){
            bizHandler.execute(t);
        }
    }
}

 

 

以下是各处理handler的实现

 

 

package com.my.biz.handler;

import com.my.biz.IBizHandler;
import com.my.domain.Review;
import com.my.domain.model.ITargetRepository;

/**
 * 
 * 初始化感受
 *
 * @author 锅巴
 * @version 1.0 2010-8-26
 */
public class InitReviewHandler implements IBizHandler<Review>{

    private ITargetRepository targetRepository;
    
    public void execute(Review review){
        review.setTargetSubCategory(targetRepository.
                findTarget(review.getTargetId()).getSubCategroy());
    }

    public ITargetRepository getTargetRepository() {
        return targetRepository;
    }

    public void setTargetRepository(ITargetRepository targetRepository) {
        this.targetRepository = targetRepository;
    }
    
    
}

 

 

package com.my.biz.handler;

import org.springframework.util.Assert;

import com.my.biz.IBizHandler;
import com.my.domain.Review;

/**
 * 
 * 验证感受对象数据
 *
 * @author 锅巴
 * @version 1.0 2010-8-26
 */
public class ValidateReviewHandler implements IBizHandler<Review>{

    @Override
    public void execute(Review review) {
        // TODO Auto-generated method stub
        Assert.isTrue(review != null);
        Assert.isTrue(review.getContent() != null);
        Assert.isTrue(review.getUserId() > 0);
        Assert.isTrue(review.getTargetId() != null);
        Assert.isTrue(review.getTargetSubCategory() != null && review.getTargetSubCategory().size() > 0);
        
    }

    public static void main(String[] args) {
        Review review = null;
        Assert.isNull(review);
        System.out.println(" end ");
    }
    
}

 

package com.my.biz.handler;

/**
 * 
 * 安全处理
 *
 * @author 锅巴
 * @version 1.0 2010-8-26
 */
public class SecurityCheckException extends RuntimeException{
    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public SecurityCheckException(String content){
        
        super(content);
    }

    
    public static void main(String[] args) throws Exception{
        throw new SecurityException("含有违禁词");
    }
}

 

 

 

package com.my.biz.handler;

import com.my.biz.IBizHandler;
import com.my.domain.Review;
import com.my.domain.model.IReviewRepository;

/**
 * 
 * 持久化感受
 *
 * @author 锅巴
 * @version 1.0 2010-8-26
 */
public class SaveReviewHandler implements IBizHandler<Review>{

    private IReviewRepository reviewRepository;
    
    @Override
    public void execute(Review t) {
        // TODO Auto-generated method stub
        reviewRepository.create(t);
    }

    public IReviewRepository getReviewRepository() {
        return reviewRepository;
    }

    public void setReviewRepository(IReviewRepository reviewRepository) {
        this.reviewRepository = reviewRepository;
    }

}

 

 

package com.my.biz.handler;

import com.my.biz.IBizHandler;
import com.my.domain.Review;

/**
 * 
 * 发消息
 *
 * @author 锅巴
 * @version 1.0 2010-8-26
 */
public class AfterSaveReviewSendNotifyHandler implements IBizHandler<Review>{

    @Override
    public void execute(Review t) {
        // TODO Auto-generated method stub
        StringBuilder str = new StringBuilder();
        str.append("id:" + t.getId() + " ")
            .append("targetId:" + t.getTargetId() + " ")
            .append("content:" + t.getContent() + " ");
        System.out.println(" send notify : " + str.toString());
    }
    
    
    
}

 

package com.my.biz.handler;

/**
 * 
 * 安全处理不通过异常
 *
 * @author 锅巴
 * @version 1.0 2010-8-26
 */
public class SecurityCheckException extends RuntimeException{
    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public SecurityCheckException(String content){
        
        super(content);
    }
}

 

以下是domain

package com.my.domain;

import java.util.Date;
import java.util.Set;

/**
 * 
 * 感觉对象
 *
 * @author 锅巴
 * @version 1.0 2010-8-26
 */
public class Review {

    private String id;
    
    private String content;
    
    private String targetId;
    
    private Set<Integer> targetSubCategory;
    
    private int userId;
    
    private Date createTime;

    public String getId() {
        return id;
    }

    public String getContent() {
        return content;
    }

    public String getTargetId() {
        return targetId;
    }

    public int getUserId() {
        return userId;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setId(String id) {
        this.id = id;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public void setTargetId(String targetId) {
        this.targetId = targetId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Set<Integer> getTargetSubCategory() {
        return targetSubCategory;
    }

    public void setTargetSubCategory(Set<Integer> targetSubCategory) {
        this.targetSubCategory = targetSubCategory;
    }
    
    
}

 

package com.my.domain;

import java.util.Set;

/**
 * 
 * 发布感受的对象,如店铺
 *
 * @author 锅巴
 * @version 1.0 2010-8-26
 */
public class Target {

    private String id;
    
    private Set<Integer> subCategroy;

    public String getId() {
        return id;
    }

    public Set<Integer> getSubCategroy() {
        return subCategroy;
    }

    public void setId(String id) {
        this.id = id;
    }

    public void setSubCategroy(Set<Integer> subCategroy) {
        this.subCategroy = subCategroy;
    }
    
    
}

 

package com.my.domain.model;

import com.my.domain.Review;

/**
 * 
 * 感觉对象仓库
 *
 * @author 锅巴
 * @version 1.0 2010-8-26
 */
public interface IReviewRepository {

    Review create(Review review);
}

 

package com.my.domain.model;

import com.my.domain.Target;

/**
 * 
 * 感受目标对象仓库
 *
 * @author 锅巴
 * @version 1.0 2010-8-26
 */
public interface ITargetRepository {

    Target findTarget(String targetId);
}

 

package com.my.infrastructure.persistence;

import java.text.SimpleDateFormat;
import java.util.Date;

import com.my.domain.Review;
import com.my.domain.model.IReviewRepository;

/**
 * 
 * 用ibatis实现的感受仓库
 *
 * @author 锅巴
 * @version 1.0 2010-8-26
 */
public class ReviewRepositoryIbatis implements IReviewRepository{

    @Override
    public Review create(Review review) {
        // TODO Auto-generated method stub
        review.setId(String.valueOf(Math.random()));
        review.setCreateTime(new Date());
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("persistence review . id :" + review.getId() + " create date: " + format.format(review.getCreateTime()));
        return review;
    }

    
}

 

package com.my.infrastructure.persistence;

import java.util.HashSet;
import java.util.Set;

import com.my.domain.Target;
import com.my.domain.model.ITargetRepository;

/**
 * 
 * 用ibatis实现的感受目标对象仓库
 *
 * @author 锅巴
 * @version 1.0 2010-8-26
 */
public class TargetRepositoryIbatis implements ITargetRepository{

    @Override
    public Target findTarget(String targetId) {
        // TODO Auto-generated method stub
        Target target = new Target();
        target.setId(targetId);
        Set<Integer> set = new HashSet<Integer>();
        set.add(52);
        set.add(36);
        set.add(68);
        target.setSubCategroy(set);
        System.out.println("target find ");
        return target;
    }

    
}

 

spring 配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "/spring-beans.dtd">
<!--
	- Application context definition.
-->
<beans>

	
 
  	<bean id="reviewRepository" class="com.my.infrastructure.persistence.ReviewRepositoryIbatis"/>
  	
  	<bean id="targetRepository" class="com.my.infrastructure.persistence.TargetRepositoryIbatis"/>




	<bean id="initReviewHandler" class="com.my.biz.handler.InitReviewHandler">
		<property name="targetRepository">
			<ref bean="targetRepository"/> 
		</property>
	</bean>
	
	<bean id="validateReviewHandler" class="com.my.biz.handler.ValidateReviewHandler"/>
	
	<bean id="securityCheckReviewHandler" class="com.my.biz.handler.SecurityCheckReviewHandler"/>
	
	<bean id="saveReviewHandler" class="com.my.biz.handler.SaveReviewHandler">
		<property name="reviewRepository">
			<ref bean="reviewRepository"/> 
		</property>
	</bean>
	
	<bean id="afterSaveReviewSendNotifyHandler" class="com.my.biz.handler.AfterSaveReviewSendNotifyHandler"/>
	
	
	
	
	<bean id="insertReviewBiz" class="com.my.biz.InsertReviewBiz">
		<property name="initInfoHandlers">
			<list>
				<ref bean="initReviewHandler"/> 
			</list>
		</property>
		
		<property name="validateHandlers">
			<list>
				<ref bean="validateReviewHandler"/> 
			</list>
		</property>
		
		<property name="securityCheckHandlers">
			<list>
				<ref bean="securityCheckReviewHandler"/>
			</list>
		</property>
		
		<property name="saveHandlers">
			<list>
				<ref bean="saveReviewHandler"/>
			</list>
		</property>
		
		<property name="afterSaveHandlers">
			<list>
				<ref bean="afterSaveReviewSendNotifyHandler"/>
			</list>
		</property>
	
	</bean>
	
 
</beans>

 

junit测试

package com.my.biz;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.my.domain.Review;

public class BizTest {

    ApplicationContext context = null;
    IBiz insertReviewBiz = null;
    
    @Before
    public void setContent(){
        context = new ClassPathXmlApplicationContext(new String[]{"conf/review.context.xml"});
        insertReviewBiz = (IBiz)context.getBean("insertReviewBiz");
    }
    
    @Test
    public void testRunBiz(){
        
       try{
           Review review = new Review();
           review.setTargetId("8");
           review.setContent("888899897");
           review.setUserId(5);
           insertReviewBiz.execute(review);
       }catch(Exception e){
           e.printStackTrace();
       }
       
    }
}

 

 

各个模块都是注入的,Biz层只需要保证大的流程及执行顺序即可。具体实现推迟到handler中,通过增加新的hanlder更改配置文件就可以实现不同的需求。

 

代码实现比较仓促,希望指教。

 

0
0
分享到:
评论

相关推荐

    book增删改查系统

     所谓三层框架分别为表述层(WEB层)、业务逻辑层()、数据访问层()。  web层(action):包含JSP和Servlet等与web相关的内容,负责与浏览器的响应和请求;  业务层(service):只关心业务逻辑;  数据层...

    那么action就可以通过该引用值来调用业务类的对象,还有就是在ssh框架中。所有的类都必须通过spring的配置文件进行注册,并获得一个引用值

    sp页面的form表单里面有一个属性值action,当提交jsp页面上的form表单时,系统会根据action的值来找到servlet里面...但是这并不是在action里面实例化一个业务逻辑的对象,而是通过spring的配置文件来调用业务逻辑层的类

    一个空的SSH框架,同时也支持servlet。扩展性能强,灵活度高。

    中间层采用的是流行的Spring+Hibernate,为了将控制层与业务逻辑层分离,Web层,负责控制业务逻辑层与表现层的交互,调用业务逻辑层,并将业务数据返回给表现层作组织表现。 Service层(就是业务逻辑层),负责实现...

    怎样编写Action测试用例

    怎样编写Action测试用例软件测试我们通常在开发web应用过程中,展现层Action的单元测试经常被我们忽视了,主要原因是:1、Action层的业务逻辑比较简单。大家潜意识认为这一部分的代码不重要。2、Action层难以模拟...

    JAVA-Web课程设计--注册登录系统---用SSH框架整合实现注册登录系.docx

    每一个系统分别由一个处理业务逻辑的Action、DAO层代码和若干个JSP页面组成。其中注册系统的Action是RegisterAction类,另外还有一个用于显示用户注册页面的register.jsp文件和一个负责显示处理结果的result.jsp文件...

    SSH2(spring3.2+strust2.3.4+hibernate4.2)框架演示代码

    SSH2(Spring + Struts2 + Hibernate)是一个流行的Java Web开发框架组合,用于构建企业级Web应用程序。Spring作为轻量级的控制反转(IoC)和面向切面编程(AOP)的容器框架,提供了依赖注入和...业务逻辑层(Spring)

    毕业设计-基于JAVA的系统框架设计与开发(源代码+论文)

    在业务层则是采用单例模式设计与Spring的IoC模式相结合,实现了公共代理类的编写,各业务逻辑接口的封装。而在持久层的设计中则是采用基于现有持久层框架的实现模式,实现了对产生Session实例的封装,对常用数据库...

    基于 Java(JSP)+MySQL 实现的( Web)的会议室预约系统【100011105】

    本系统适用于企业的会议室的预约管理。会议室预约管理系统基于 B/S 结构,采用 ...根据面向对象的思想,本系统采用的是典型的 MVC 架构,分为 action 控制层,service 业务逻辑层,Dao 数据库连接层,ORM 实体类层。

    struts2.4+spring3.1+hibernate4.1的SSH框架

     集成SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层,以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的Web应用程序。其中使用Struts作为系统的整体基础架构,负责MVC的...

    Struts1工作原理浅析【转】

    Action 负责解决业务逻辑问题,并将执行结果返回给 ActionServlet,以将响应呈现给客户。 三、Struts1 的 Action Action 是 Struts1 应用中的真正干活的组件,它负责解决业务逻辑问题。Action 通过调用业务组件...

    华为外包java面试题,等你来挑战,come on!

    然后,Struts控制器通过配置文件得到业务逻辑处理Action,并调用Action的处理用户请求;接着,Action处理业务逻辑,可能查找数据库或调用别的系统,处理完成后,填充相关的Model对象,并把控制权返回控制器;最后,...

    Spring Web Flow

    SpringWeb Flow 中的这个 &lt;action-state&gt; 是专为执行业务逻辑而设的 state 。如果某个应用的业务逻辑代码既不适合放在transition 中由客户端来触发,也不适合放在 Spring Web Flow 自定义的切入点,那么就可以考虑...

    图书查询-Java-Web程序设计教程-[共2页].pdf

    Java Web 程序设计教程 300 页 &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;jsp:include page="foot.jsp"&gt;&lt;/jsp:include&gt; &lt;/body&gt; &lt;/html&gt; 14.5 图书查询 在 head.jsp 页面中,不只有登录、注销和注册功能,在它们的下面,还有图书查询...

    【计算机软件毕业设计】二手车交易平台的分析、设计与实现文献综述1.doc

    这就使集成了SSH框架的系统在职责上的四层:表示层、业务逻辑层、数据持 久层和域模块层密切联系,最大化地实现SSH集成框架的功能。 关键词:SSH集成框架 Web 1主流Web开发框架分析 1.1 MVC结构模式和WebWork框架 ...

    OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR)130224.rar

    该系统采用了MVC设计模式,将业务逻辑、数据访问和表示层分离,提高了代码的可维护性和可扩展性。Struts1.2作为Web层的框架,负责处理用户的请求和响应,以及页面之间的跳转。它通过ActionForm和Action类来实现数据...

    MVC WebApi 用户权限验证及授权DEMO

    api业务服务处理业务逻辑,并将结果以Json 数据返回; 13). 返回渲染后的页面给浏览器前端,并呈现业务数据到页面; 14). 用户填写业务数据,或者查找业务数据; 15). 当填写或查找完业务数据后,用户提交表单...

    JSP程序设计课件包含Hibernate,Struts的介绍

    13. Struts定义了自己的标签库来实现自己的视图层,创建一个内在的servlet,叫ActionServlet作为控制器,建立一个叫Action类的对象实现业务逻辑。视图组件与业务逻辑的关系放在一个叫struts-config.xml的配置文件中...

    Java Web项目整体异常处理机制

     拿spring+struts2+hibernate项目说明:通常一个页面请求到后台以后,首先是到action(也是所谓mvc的controller),在action层会调用业务逻辑service,servce层会调用持久层dao获取数据。后执行结果会汇总到action...

    MVC设计模式.doc

    模型是应用程序的业务逻辑核心,它封装了应用程序的数据和业务逻辑。模型的主要职责是管理应用程序的数据和业务逻辑,它可以与数据库进行交互,获取和更新数据。模型是应用程序的核心,它定义了应用程序的业务逻辑和...

    SSH各层作用及好处

    ActionFormBean 是一个具有业务逻辑的 JavaBean,用于接收网页中表单提交的数据。Struts-config.xml 是 Struts 框架的配置文件,用于定义action-mapping。 Spring 框架 Spring 是一个轻量级的控制反转(IoC)和...

Global site tag (gtag.js) - Google Analytics