`
锅巴49
  • 浏览: 163580 次
  • 性别: 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
分享到:
评论

相关推荐

    Spring的作用贯穿了整个中间层,将Web层、Service层、DAO层及PO无缝整合

    2. **分层设计**:Spring框架支持分层的设计模式,这意味着不同的业务功能可以被封装在不同的层中,例如Web层负责处理用户界面,Service层处理业务逻辑,DAO层处理数据访问。这样的设计有助于保持代码的清晰度,并...

    action层,dao层 ,service层,entity层1

    DAO层的设计应尽可能与业务逻辑分离,这样可以提高代码的可重用性和可测试性。在Java中,我们可以使用JDBC或者ORM框架(如Hibernate、MyBatis)来实现DAO层。 3. **Service层(业务层)**: Service层是整个应用的...

    实现将业务逻辑分离到业务层的struts登录示例

    在本示例中,我们将探讨如何使用Struts 1.x版本将业务逻辑分离到业务层,这是一个重要的设计原则,可以提高代码的可读性、可维护性和可测试性。MyEclipse 6.5是一个集成开发环境,它为Struts项目提供了很好的支持。 ...

    在web.xml中配置action或.do

    - **Struts框架**:Struts框架是一种基于MVC设计模式的Java Web框架,它通过分离表示层、业务逻辑层和控制层,实现了代码的清晰划分。 - **Action**:在Struts中,Action负责接收用户请求,处理业务逻辑,并返回...

    book增删改查系统

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

    SSH框架(web端+json手机端)

    这个框架组合利用了Struts2的控制层、Hibernate的数据持久化层和Spring的业务逻辑层,为开发者提供了一个高效、灵活且功能丰富的后端开发解决方案。 Struts2作为表现层框架,负责处理用户请求,通过Action类将这些...

    Struts Web设计与开发大全

    在实际开发中,Struts与数据库的交互通常通过DAO(Data Access Object)模式实现,这有助于分离数据访问层和业务逻辑层。Hibernate或iBatis等持久层框架可以与Struts集成,简化数据操作。 Struts 2作为Struts的升级...

    WEB开发-SSH三层框架

    源代码通常分为三部分:表示层(Struts2的Action类)、业务逻辑层(Spring的Service接口及其实现)和数据访问层(Hibernate的Entity类和DAO)。配置文件如`struts.xml`、`spring-context.xml`和`hibernate.cfg.xml`...

    Java Web 三层架构详解

    在这种架构中,通常分为表示层、业务逻辑层和数据访问层。 1. **表示层**:表示层主要负责与用户交互,接收用户请求并展示数据。在Java Web开发中,Struts框架被广泛用于表示层。Struts是一个基于MVC(Model-View-...

    java web程序设计

    Java Web程序设计是Web开发领域中的一个重要组成部分,它涉及到服务器端编程、数据库交互以及前端展示等多个环节。在本系统中,使用了Struts2、Spring和MyBatis这三大流行框架进行整合,构建了一个功能完备的Web应用...

    精通struts.基于MVC的.java.web设计与开发.pdf 高清下载

    - **Action** 类代表了业务逻辑的处理单元,它实现了org.apache.struts.action.Action接口。 - 每个Action类都有一个execute()方法,该方法负责实际的业务逻辑处理。 ##### 3. Form Beans - **Form Beans** 是一种...

    后端研究-集成Struts框架和企业JavaBean构建多层web系统.pdf

    业务层由EJB组件构建,处理核心的业务逻辑。 2. **J2EE的组件模型** J2EE应用的组件模型是基于容器的,这意味着组件(如Servlet、JSP和EJB)在特定的容器中运行。容器提供了组件的运行时环境,并管理组件的生命...

    基于Web图书推荐系统设计

    系统设计采用了MVC模式,将系统分为表示层、MVC控制器层、业务逻辑层、DAO组件层、数据持久层和物理层。其中,表示层主要负责用户参数和系统数据的传递,通过Web主页面实现。MVC控制器层使用Struts2框架进行用户请求...

    银行管理系统(三层架构)

    三层架构是软件开发中的一个经典模式,它将应用程序分为表现层、业务逻辑层和数据访问层,每层都有其特定的功能和职责,以此实现模块化和解耦。 1. **表现层(Presentation Layer)**:这是用户与系统交互的界面,...

    中期开发平台说明文档-Struts2 WEB层.doc

    * Business Layer:负责业务逻辑处理,使用Java Beans和Service层来实现业务逻辑。 * Data Access Layer:负责数据访问和存储,使用Hibernate或iBATIS来实现数据持久化。 * Framework Layer:提供了Struts2框架的...

    三层架构.doc

    它将应用程序分为三个主要组件:表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。这种架构的主要目的是提高软件的可维护性、可扩展性和降低耦合度。 1. 表现层(UI):这一层直接与用户交互,负责接收用户的...

    《Struts Web设计与开发大全》

    ActionForm用于封装请求参数,Action处理业务逻辑,而Tiles则用于页面布局。 3. **配置文件**:struts-config.xml是Struts的核心配置文件,它定义了Action的映射、表单Bean、数据源等关键信息。理解并熟练编写这个...

    学习JavaEE快速Web开发架构总体设计.pdf

    业务逻辑层可以采用Spring或SessionBean实现,两者可以根据实际需求选择。Spring技术更适合于开发和调试,因为它提供了更灵活的依赖注入和AOP(面向切面编程)。当需要对外提供服务时,EJB(Enterprise JavaBeans)...

Global site tag (gtag.js) - Google Analytics