- 浏览: 161535 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 1134场景: LIST页面,商品由A和B商品组成,A和B商 ... -
HTTP头信息
2012-08-31 21:33 941HTTP 头部解释 1. Accept:告诉WE ... -
eclipse 中将工程变成 Dynamic web Module 工作
2011-01-19 15:59 2112在eclipse中的tomcat server 加入web 工 ... -
修改类不用重启tomcat的配置(非reloadable="true")
2010-12-30 17:47 5088今天同事龙泉同学找到一个很提高效率的tomcat开发模式。该模 ... -
Http头 Range、Content-Range
2010-10-15 19:00 14096HTTP头中一般断点下载时才用到Range和Content-R ... -
业务逻辑层代码探索
2010-09-25 13:54 1186web层编码中action的处理比较麻烦,特别是代码量变大,多 ...
相关推荐
所谓三层框架分别为表述层(WEB层)、业务逻辑层()、数据访问层()。 web层(action):包含JSP和Servlet等与web相关的内容,负责与浏览器的响应和请求; 业务层(service):只关心业务逻辑; 数据层...
sp页面的form表单里面有一个属性值action,当提交jsp页面上的form表单时,系统会根据action的值来找到servlet里面...但是这并不是在action里面实例化一个业务逻辑的对象,而是通过spring的配置文件来调用业务逻辑层的类
中间层采用的是流行的Spring+Hibernate,为了将控制层与业务逻辑层分离,Web层,负责控制业务逻辑层与表现层的交互,调用业务逻辑层,并将业务数据返回给表现层作组织表现。 Service层(就是业务逻辑层),负责实现...
怎样编写Action测试用例软件测试我们通常在开发web应用过程中,展现层Action的单元测试经常被我们忽视了,主要原因是:1、Action层的业务逻辑比较简单。大家潜意识认为这一部分的代码不重要。2、Action层难以模拟...
每一个系统分别由一个处理业务逻辑的Action、DAO层代码和若干个JSP页面组成。其中注册系统的Action是RegisterAction类,另外还有一个用于显示用户注册页面的register.jsp文件和一个负责显示处理结果的result.jsp文件...
SSH2(Spring + Struts2 + Hibernate)是一个流行的Java Web开发框架组合,用于构建企业级Web应用程序。Spring作为轻量级的控制反转(IoC)和面向切面编程(AOP)的容器框架,提供了依赖注入和...业务逻辑层(Spring)
在业务层则是采用单例模式设计与Spring的IoC模式相结合,实现了公共代理类的编写,各业务逻辑接口的封装。而在持久层的设计中则是采用基于现有持久层框架的实现模式,实现了对产生Session实例的封装,对常用数据库...
本系统适用于企业的会议室的预约管理。会议室预约管理系统基于 B/S 结构,采用 ...根据面向对象的思想,本系统采用的是典型的 MVC 架构,分为 action 控制层,service 业务逻辑层,Dao 数据库连接层,ORM 实体类层。
集成SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层,以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的Web应用程序。其中使用Struts作为系统的整体基础架构,负责MVC的...
Action 负责解决业务逻辑问题,并将执行结果返回给 ActionServlet,以将响应呈现给客户。 三、Struts1 的 Action Action 是 Struts1 应用中的真正干活的组件,它负责解决业务逻辑问题。Action 通过调用业务组件...
然后,Struts控制器通过配置文件得到业务逻辑处理Action,并调用Action的处理用户请求;接着,Action处理业务逻辑,可能查找数据库或调用别的系统,处理完成后,填充相关的Model对象,并把控制权返回控制器;最后,...
SpringWeb Flow 中的这个 <action-state> 是专为执行业务逻辑而设的 state 。如果某个应用的业务逻辑代码既不适合放在transition 中由客户端来触发,也不适合放在 Spring Web Flow 自定义的切入点,那么就可以考虑...
Java Web 程序设计教程 300 页 </div> </div> </div> <jsp:include page="foot.jsp"></jsp:include> </body> </html> 14.5 图书查询 在 head.jsp 页面中,不只有登录、注销和注册功能,在它们的下面,还有图书查询...
这就使集成了SSH框架的系统在职责上的四层:表示层、业务逻辑层、数据持 久层和域模块层密切联系,最大化地实现SSH集成框架的功能。 关键词:SSH集成框架 Web 1主流Web开发框架分析 1.1 MVC结构模式和WebWork框架 ...
该系统采用了MVC设计模式,将业务逻辑、数据访问和表示层分离,提高了代码的可维护性和可扩展性。Struts1.2作为Web层的框架,负责处理用户的请求和响应,以及页面之间的跳转。它通过ActionForm和Action类来实现数据...
api业务服务处理业务逻辑,并将结果以Json 数据返回; 13). 返回渲染后的页面给浏览器前端,并呈现业务数据到页面; 14). 用户填写业务数据,或者查找业务数据; 15). 当填写或查找完业务数据后,用户提交表单...
13. Struts定义了自己的标签库来实现自己的视图层,创建一个内在的servlet,叫ActionServlet作为控制器,建立一个叫Action类的对象实现业务逻辑。视图组件与业务逻辑的关系放在一个叫struts-config.xml的配置文件中...
拿spring+struts2+hibernate项目说明:通常一个页面请求到后台以后,首先是到action(也是所谓mvc的controller),在action层会调用业务逻辑service,servce层会调用持久层dao获取数据。后执行结果会汇总到action...
模型是应用程序的业务逻辑核心,它封装了应用程序的数据和业务逻辑。模型的主要职责是管理应用程序的数据和业务逻辑,它可以与数据库进行交互,获取和更新数据。模型是应用程序的核心,它定义了应用程序的业务逻辑和...
ActionFormBean 是一个具有业务逻辑的 JavaBean,用于接收网页中表单提交的数据。Struts-config.xml 是 Struts 框架的配置文件,用于定义action-mapping。 Spring 框架 Spring 是一个轻量级的控制反转(IoC)和...