- 浏览: 163580 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
di1984HIT:
学习了~~~~~~~~
mysql 序列号生成办法 -
jahu:
废话,,,,,,
java线程与协程效果对比 -
edua:
谢谢。
购物车实现原理 -
hotsmile:
我咋看不到后台的调用呀?
使用jmeter测试java程序 -
xiaokang1582830:
api/rest这样的定义如果项目中不存在此路径则会是404错 ...
strurts2 中的 ActionMapper的 作用
项目越做越大,代码越来越多。陆续出了一些问题。
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更改配置文件就可以实现不同的需求。
代码实现比较仓促,希望指教。
发表评论
-
多线程分解串行工作
2013-05-02 15:43 1194场景: LIST页面,商品由A和B商品组成,A和B商 ... -
HTTP头信息
2012-08-31 21:33 980HTTP 头部解释 1. Accept:告诉WE ... -
eclipse 中将工程变成 Dynamic web Module 工作
2011-01-19 15:59 2134在eclipse中的tomcat server 加入web 工 ... -
修改类不用重启tomcat的配置(非reloadable="true")
2010-12-30 17:47 5110今天同事龙泉同学找到一个很提高效率的tomcat开发模式。该模 ... -
Http头 Range、Content-Range
2010-10-15 19:00 14181HTTP头中一般断点下载时才用到Range和Content-R ... -
业务逻辑层代码探索
2010-09-25 13:54 1222web层编码中action的处理比较麻烦,特别是代码量变大,多 ...
相关推荐
2. **分层设计**:Spring框架支持分层的设计模式,这意味着不同的业务功能可以被封装在不同的层中,例如Web层负责处理用户界面,Service层处理业务逻辑,DAO层处理数据访问。这样的设计有助于保持代码的清晰度,并...
DAO层的设计应尽可能与业务逻辑分离,这样可以提高代码的可重用性和可测试性。在Java中,我们可以使用JDBC或者ORM框架(如Hibernate、MyBatis)来实现DAO层。 3. **Service层(业务层)**: Service层是整个应用的...
在本示例中,我们将探讨如何使用Struts 1.x版本将业务逻辑分离到业务层,这是一个重要的设计原则,可以提高代码的可读性、可维护性和可测试性。MyEclipse 6.5是一个集成开发环境,它为Struts项目提供了很好的支持。 ...
- **Struts框架**:Struts框架是一种基于MVC设计模式的Java Web框架,它通过分离表示层、业务逻辑层和控制层,实现了代码的清晰划分。 - **Action**:在Struts中,Action负责接收用户请求,处理业务逻辑,并返回...
所谓三层框架分别为表述层(WEB层)、业务逻辑层()、数据访问层()。 web层(action):包含JSP和Servlet等与web相关的内容,负责与浏览器的响应和请求; 业务层(service):只关心业务逻辑; 数据层...
这个框架组合利用了Struts2的控制层、Hibernate的数据持久化层和Spring的业务逻辑层,为开发者提供了一个高效、灵活且功能丰富的后端开发解决方案。 Struts2作为表现层框架,负责处理用户请求,通过Action类将这些...
在实际开发中,Struts与数据库的交互通常通过DAO(Data Access Object)模式实现,这有助于分离数据访问层和业务逻辑层。Hibernate或iBatis等持久层框架可以与Struts集成,简化数据操作。 Struts 2作为Struts的升级...
源代码通常分为三部分:表示层(Struts2的Action类)、业务逻辑层(Spring的Service接口及其实现)和数据访问层(Hibernate的Entity类和DAO)。配置文件如`struts.xml`、`spring-context.xml`和`hibernate.cfg.xml`...
在这种架构中,通常分为表示层、业务逻辑层和数据访问层。 1. **表示层**:表示层主要负责与用户交互,接收用户请求并展示数据。在Java Web开发中,Struts框架被广泛用于表示层。Struts是一个基于MVC(Model-View-...
Java Web程序设计是Web开发领域中的一个重要组成部分,它涉及到服务器端编程、数据库交互以及前端展示等多个环节。在本系统中,使用了Struts2、Spring和MyBatis这三大流行框架进行整合,构建了一个功能完备的Web应用...
- **Action** 类代表了业务逻辑的处理单元,它实现了org.apache.struts.action.Action接口。 - 每个Action类都有一个execute()方法,该方法负责实际的业务逻辑处理。 ##### 3. Form Beans - **Form Beans** 是一种...
业务层由EJB组件构建,处理核心的业务逻辑。 2. **J2EE的组件模型** J2EE应用的组件模型是基于容器的,这意味着组件(如Servlet、JSP和EJB)在特定的容器中运行。容器提供了组件的运行时环境,并管理组件的生命...
系统设计采用了MVC模式,将系统分为表示层、MVC控制器层、业务逻辑层、DAO组件层、数据持久层和物理层。其中,表示层主要负责用户参数和系统数据的传递,通过Web主页面实现。MVC控制器层使用Struts2框架进行用户请求...
三层架构是软件开发中的一个经典模式,它将应用程序分为表现层、业务逻辑层和数据访问层,每层都有其特定的功能和职责,以此实现模块化和解耦。 1. **表现层(Presentation Layer)**:这是用户与系统交互的界面,...
* Business Layer:负责业务逻辑处理,使用Java Beans和Service层来实现业务逻辑。 * Data Access Layer:负责数据访问和存储,使用Hibernate或iBATIS来实现数据持久化。 * Framework Layer:提供了Struts2框架的...
它将应用程序分为三个主要组件:表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。这种架构的主要目的是提高软件的可维护性、可扩展性和降低耦合度。 1. 表现层(UI):这一层直接与用户交互,负责接收用户的...
ActionForm用于封装请求参数,Action处理业务逻辑,而Tiles则用于页面布局。 3. **配置文件**:struts-config.xml是Struts的核心配置文件,它定义了Action的映射、表单Bean、数据源等关键信息。理解并熟练编写这个...
业务逻辑层可以采用Spring或SessionBean实现,两者可以根据实际需求选择。Spring技术更适合于开发和调试,因为它提供了更灵活的依赖注入和AOP(面向切面编程)。当需要对外提供服务时,EJB(Enterprise JavaBeans)...