无法在这个位置找到: head2.htm
当前位置: 建站首页 > 新闻动态 > 公司新闻 >

SSH电子商务新项目实战演练之二:基本删改查改

时间:2021-02-14 07:57来源:未知 作者:jianzhan 点击:
手机软件开发设计 SSH电子商务新项目实战演练之二:基本删改查改、Service和Action的提取及其应用注释更换xml 上一节大家构建好啦Struts2、Hibernate和Spring的开发设计自然环境,并取得成
手机软件开发设计 SSH电子商务新项目实战演练之二:基本删改查改、Service和Action的提取及其应用注释更换xml

上一节大家构建好啦Struts2、Hibernate和Spring的开发设计自然环境,并取得成功将他们融合在一起。这节关键进行一些基本的删改改查及其Service、Dao和Action的提取。

1. Service层的提取

上一节中,大家在service层简易写了save和update方式,这儿大家刚开始健全该一部分的编码,随后对service层的编码开展提取。

1.1 健全CategoryService层

多数据库的实际操作只不过是删改改查,最先大家来健全CategoryService层的插口和完成:

Java编码 //CategoryService插口  public interface CategoryService extends BaseService Category  {     public void save(Category category); //插进     public void update(Category category);//升级     public void delete(int id); //删掉     public Category get(int id); //获得一个Category     public List Category  query(); //获得所有Category    } 

对CategoryService插口的实际完成:

Java编码 public class CategoryServiceImpl extends BaseServiceImpl Category  implements CategoryService {     private SessionFactory sessionFactory;     //Spring会注进去   public void setSessionFactory(SessionFactory sessionFactory) {   this.sessionFactory = sessionFactory;   }     protected Session getSession() {   //从当今进程获得session,假如沒有则建立一个新的session   return sessionFactory.getCurrentSession();   }     @Override   public void save(Category category) {   getSession().save(category);   }     @Override   public void update(Category category) {   getSession().update(category);   }     @Override   public void delete(int id) {   /*第一种方式有一个缺点,便是没删掉一次得先查寻一次   Object obj = getSession().get(Category.class, id);   if(obj != null) {   getSession().delete(obj);   }*/   String hql =  delete Category while id=:id ;   getSession().createQuery(hql) //   .setInteger( id , id) //   .executeUpdate();   }     @Override   public Category get(int id) {   return (Category) getSession().get(Category.class, id);   }     @Override   public List Category  query() {   String hql =  from Category ;   return getSession().createQuery(hql).list();   }  } 

1.2 Service层提取完成

进行了CategoryService后,大家来提取Service层的基本完成。构思是那样的:大家提取一个基本插口BaseService及其基本插口的完成BaseServiceImpl,后边开发设计的情况下,假如必须新的Service,只必须做两步就可以:最先界定一个新的插口xxxService承继BaseService插口,这一插口能够提升新的抽象性方式;随后界定一个新的完成类xxxServiceImpl承继BaseServiceImpl并完成xxxService插口就可以。那样更为有利于新项目的维护保养。

大家先依据上边的CategoryService插口来建立BaseService插口:

Java编码 //基本插口BaseService,应用泛型  public interface BaseService T  {   public void save(T t);     public void update(T t);     public void delete(int id);     public T get(int id);     public List T  query();  } 

随后再依据CategoryServiceImpl完成类建立BaseService插口的完成类BaseServiceImpl:

Java编码 /**   * @Description TODO(公共性控制模块的提取)   * @author eson_15   *   */  @SuppressWarnings( unchecked )  public class BaseServiceImpl T  implements BaseService T  {     private Class clazz; //clazz中储存了当今实际操作的种类,即泛型T   private SessionFactory sessionFactory;     public BaseServiceImpl() {   //下边三个复印信息内容能够除掉,这儿是为自己看的   System.out.println( this意味着的是当今启用结构方式的目标  + this);   System.out.println( 获得当今this目标的父类信息内容  + this.getClass().getSuperclass());   System.out.println( 获得当今this目标的父类信息内容(包含泛型信息内容)  + this.getClass().getGenericSuperclass());   //取得泛型的主要参数种类   ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();   clazz = (Class)type.getActualTypeArguments()[0];   }     public void setSessionFactory(SessionFactory sessionFactory) {   this.sessionFactory = sessionFactory;   }     protected Session getSession() {   //从当今进程获得session,假如沒有则建立一个新的session   return sessionFactory.getCurrentSession();   }     @Override   public void save(T t) {   getSession().save(t);   }     @Override   public void update(T t) {   getSession().update(t);   }     @Override   public void delete(int id) {   System.out.println(clazz.getSimpleName());   String hql =  delete   + clazz.getSimpleName() +   as c where c.id=:id ;   getSession().createQuery(hql) //   .setInteger( id , id) //   .executeUpdate();   }     @Override   public T get(int id) {   return (T) getSession().get(clazz, id);   }     @Override   public List T  query() {   String hql =  from   + clazz.getSimpleName();   return getSession().createQuery(hql).list();   }    } 

提取完后后,大家便可以改变CategoryService插口和CategoryServiceImpl完成类了。以下:

Java编码 //CategoryService插口承继BaseService插口  public interface CategoryService extends BaseService Category  {   /*   * 要是加上CategoryService自身必须的新的方式就可以,公共性方式早已在BaseService中了   */  }    /**   * @Description TODO(控制模块本身的业务流程逻辑性)   * @author eson_15   *   */  public class CategoryServiceImpl extends BaseServiceImpl Category  implements CategoryService {     /*   * 只需完成CategoryService插口中澳增的方式就可以,公共性方式早已在BaseServiceImpl中完成了   */  } 

从编码中能看出,增加的Service只必须承继BaseService插口,随后在插口中澳增本Service需要要的业务流程逻辑性就可以。增加的ServiceImpl只必须承继BaseServiceImpl并完成增加的业务流程逻辑性就可以。

可是别忘记太重要的一点:便是改动Spring的配备文档beans.xml中的bean。

XML/HTML编码 !-- 泛型类不是能案例化的,因此得加lazy-init特性 --   bean id= baseService   > 将原先categoryService中的property弄死,随后提升parent特性,指出承继baseService;随后配备一下baseService,将sessionFactory配到baseService中来,此外要留意一点:设定lazy-init特性为true,由于baseService是泛型类,泛型类不是能案例化的。到此,Service层的提取就拿下了。

2. ount

ount(管理方法员)的service就非常简单了:

ountService插口承继BaseService:

Java编码 public interface AccountService extends BaseService Account  { //ount   /*   *&ountService自身必须的新的方式就可以,公共性方式早已在BaseService中了   */  } 

ountService插口就可以:

Java编码 public class AccountServiceImpl extends BaseServiceImpl Account  implements AccountService {     /*   *&ountService插口中澳增的方式就可以,公共性方式早已在BaseServiceImpl中完成了   */     //管理方法登录作用,中后期再健全  } 

最终在beans.xml文档中放上以下配备:

XML/HTML编码 bean id= accountService   > 那样就写好啦一个新的service了,之后必须加上service就遵照这一步骤,十分便捷。

3. Action的提取

3.1 Action中往域(request,session,application等)中存数据信息

大家了解,在Action中能够立即根据ActionContext.getContext()去获得一个ActionContext目标,随后根据该目标再去得到相对的域目标;还可以根据完成xxxAware插口来引入相对的域目标。大家先看来一下这二种方式:

Java编码 public class CategoryAction extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{     private Category category;     private CategoryService categoryService;     public void setCategoryService(CategoryService categoryService) {   this.categoryService = categoryService;   }     public String update() {   System.out.println( ----update---- );   categoryService.update(category);   return  index ;   }     public String save() {   System.out.println( ----save---- );   return  index ;   }     public String query() {   //处理计划方案一,选用相对的map替代原先的内嵌目标,那样与jsp沒有依靠,可是编码量较为大   // ActionContext.getContext().put( categoryList , categoryService.query()); //放进request域中   // ActionContext.getContext().getSession().put( categoryList , categoryService.query()); //放进session域中   // ActionContext.getContext().getApplication().put( categoryList , categoryService.query()); //放进application域中     //处理计划方案二,完成相对的插口(RequestAware,SessionAware,ApplicationAware),让相对的map引入   request.put( categoryList , categoryService.query());   session.put( categoryList , categoryService.query());   application.put( categoryList , categoryService.query());   return  index ;   }     public Category getCategory() {   return category;   }     public void setCategory(Category category) {   this.category = category;   }     private Map String, Object  request;   private Map String, Object  session;   private Map String, Object  application;     @Override   public void setApplication(Map String, Object  application) {   this.application = application;   }     @Override   public void setSession(Map String, Object  session) {   this.session = session;   }     @Override   public void setRequest(Map String, Object  request) {   this.request = request;   }  } 

還是上一节融合三大架构时的CategoryAction类,大家在里边加了一个query方式,在该方式中,大家根据向request域、session域和application域中存进查寻的結果。第一种方式是立即应用ActionContext来完成,不用完成一切插口,可是编码量很大;第二种方式根据完成RequestAware、SessionAware和ApplicationAware插口,完成该插口的三个抽象性方式把request、session和application引入进去,随后赋给相对的组员自变量中,那样便可以在query方式中向域中储放查寻結果了。这编码量好像比第一种方式更大 可是大家能够提取,先向下看。

大家在index.jsp中澳加一个查寻联接来检测可否将查寻結果显示信息出去:

XML/HTML编码 %@ page language= java  import= java.util.*  pageEncoding= UTF-8 %   %@ taglib uri= jsp/jstl/core  prefix= c  %   !DOCTYPE HTML PUBLIC  -//W3C//DTD HTML 4.01 Transitional//EN   html     head     title My JSP 'index.jsp' starting page /title     /head       body     a href= ${pageContext.request.contextPath }/category_update.action?category.id=2 category.type=gga category.hot=false 浏览update /a     a href= category_save.action 浏览save /a     a href= category_query.action 查寻全部类型 /a br/     c:forEach items= ${requestScope.categoryList }  var= category    ${category.id } | ${category.type } | ${category.hot }  br/     /c:forEach       c:forEach items= ${sessionScope.categoryList }  var= category    ${category.id } | ${category.type } | ${category.hot }  br/     /c:forEach       c:forEach items= ${applicationScope.categoryList }  var= category    ${category.id } | ${category.type } | ${category.hot }  br/     /c:forEach     /body   /html  

3.2 提取BaseAction

不久提及了,第二种方式的编码量更大,可是大家能够提取一个BaseAction,专业解决这种域有关的实际操作。

Java编码 public class BaseAction extends ActionSupport implements RequestAware,SessionAware,ApplicationAware {     protected Map String, Object  request;   protected Map String, Object  session;   protected Map String, Object  application;     @Override   public void setApplication(Map String, Object  application) {   this.application = application;   }     @Override   public void setSession(Map String, Object  session) {   this.session = session;   }     @Override   public void setRequest(Map String, Object  request) {   this.request = request;   }  } 

随后大家自身的Action假如必须采用这种域目标来储存数据信息时,立即承继BaseAction就可以,就可以立即应用request、session和application目标了。因此改动后的CategoryAction以下:

Java编码 public class CategoryAction extends BaseAction {   private Category category;   private CategoryService categoryService;     public void setCategoryService(CategoryService categoryService) {   this.categoryService = categoryService;   }     public String update() {   System.out.println( ----update---- );   categoryService.update(category);   return  index ;   }     public String save() {   System.out.println( ----save---- );   return  index ;   }     public String query() {          request.put( categoryList ,categoryService.query());          session.put( categoryList ,categoryService.query());          application.put( categoryList ,categoryService.query()); return  index ;   }     public Category getCategory() { return category; }     public void setCategory(Category category) {this.category = category; }  }   

后边全部要应用request、session和application域的Action,要是立即承继BaseAction就可以,十分便捷。

3.3 获得主要参数(ModelDriven)

大家再次看上边的CategoryAction类,里边有一个组员自变量category,它是个POJO,界定这一自变量并写好set和get方式是以便JSP网页页面能够根据url后边附加主要参数传进去,主要参数是category目标中的特性,例如id,type等,可是url中的主要参数务必写出category.id、category.type等。那样struts会全自动将这写主要参数引入到category目标中,随后大家便可以立即应用这一category目标了,可是那样有点儿繁杂。大家可使用ModelDriven来更便捷的处理。

Java编码 public class CategoryAction extends BaseAction implements ModelDriven Category {     private Category category;     //应用ModelDriven插口务必要完成getModel()方式,此方式会把回到的项压到栈顶   @Override   public Category getModel() {   category = new Category();   return category;   }          private CategoryService categoryService;     public void setCategoryService(CategoryService categoryService) {   this.categoryService = categoryService;      }     public String update() {   System.out.println( ----update---- );   categoryService.update(category);   return  index ;   }     public String save() {   System.out.println( ----save---- );   return  index ;   }     public String query() {   request.put( categoryList , categoryService.query());   session.put( categoryList , categoryService.query());   application.put( categoryList , categoryService.query());   return  index ;   }    } 

那样大家在前台接待JSP网页页面也不用带category.id这类繁杂的主要参数了,看JSP网页页面中的ModelDriven一部分:

XML/HTML编码 %@ page language= java  import= java.util.*  pageEncoding= UTF-8 %   %@ taglib uri= jsp/jstl/core  prefix= c  %   !DOCTYPE HTML PUBLIC  -//W3C//DTD HTML 4.01 Transitional//EN   html     head     title My JSP 'index.jsp' starting page /title     /head       body     a href= ${pageContext.request.contextPath }/category_update.action?category.id=2 category.type=gga category.hot=false 浏览update /a     a href= category_save.action?id=1 type=haha hot=true 检测ModelDriven /a     a href= category_query.action 查寻全部类型 /a br/     c:forEach items= ${requestScope.categoryList }  var= category    ${category.id } | ${category.type } | ${category.hot }  br/     /c:forEach       c:forEach items= ${sessionScope.categoryList }  var= category    ${category.id } | ${category.type } | ${category.hot }  br/     /c:forEach       c:forEach items= ${applicationScope.categoryList }  var= category    ${category.id } | ${category.type } | ${category.hot }  br/     /c:forEach     /body   /html  

检测結果是能够得到catgory,而且将id,type和hot特性所有取值好。大家能看出,根据完成ModelDriven插口,大家能够很便捷的在url中带上主要参数,Action中只必须完成getModel方式,new一个要应用的目标回到就可以。到这儿大家非常容易想起,struts中毫无疑问会出现许多这类model必须获得,因此这一块大家还要提取到BaseAction中来。

3.4 提取ModelDriven到BaseAction

最先大家在BaseAction中加上ModelDriven一部分的编码,以下:

Java编码 //由于有许多不一样的model都必须应用ModelDriven,因此这儿应用泛型  public class BaseAction T  extends ActionSupport implements RequestAware,SessionAware,ApplicationAware,ModelDriven T  {     protected Map String, Object  request;   protected Map String, Object  session;   protected Map String, Object  application;     protected T model;     @Override   public void setApplication(Map String, Object  application) {   this.application = application;   }     @Override   public void setSession(Map String, Object  session) {   this.session = session;   }     @Override   public void setRequest(Map String, Object  request) {   this.request = request;   }     @Override   public T getModel() { //这儿根据分析传进去的T来new一个相匹配的instance   ParameterizedType type = (ParameterizedType)this.getClass().getGenericSuperclass();   Class clazz = (Class)type.getActualTypeArguments()[0];   try {   model = (T)clazz.newInstance();   } catch (Exception e) {   throw new RuntimeException(e);   }   return model;   }  } 

提取完后后,CategoryAction中的编码会越来越越低:

Java编码 //承继BaseAction,而且再加泛型  public class CategoryAction extends BaseAction Category  {     private CategoryService categoryService;     public void setCategoryService(CategoryService categoryService) {   this.categoryService = categoryService;   }     public String update() {   System.out.println( ----update---- );   categoryService.update(model);//立即应用model   return  index ;   }     public String save() {   System.out.println( ----save---- );   System.out.println(model); //立即应用model   return  index ;   }     public String query() {   request.put( categoryList , categoryService.query());   session.put( categoryList , categoryService.query());   application.put( categoryList , categoryService.query());   return  index ;   }    } 

到这儿,也有一个看见难受的地区,便是categoryService这一组员自变量,它一直存有在CategoryAction里,由于CategoryAction中有效到categoryService目标中的方式,因此务必得建立这一目标,而且有set方式才可以引入进去。这就造成一个缺点:假如许多Action都必须应用categoryService得话,那么就务必在他们的Action里建立这一目标和set方式,并且,假如一个Action时要应用很多不一样的service目标,那么就得所有建立,那样就越来越很繁杂。

3.5 提取service到BaseAction

对于上边的难题,大家将工程项目中常有的service目标都提取到BaseAction中建立,那样别的Action承继BaseAction后,想要甚么service就立即用来用就可以:

Java编码 //我将BaseAction中的內容归分类了  public class BaseAction T  extends ActionSupport implements RequestAware,SessionAware,ApplicationAware,ModelDriven T  {     //service目标   protected CategoryService categoryService;   protected AccountService accountService;     public void setCategoryService(CategoryService categoryService) {   this.categoryService = categoryService;   }   public void&ountService(AccountService accountService) {   this.accountService = accountService;   }     //域目标   protected Map String, Object  request;   protected Map String, Object  session;   protected Map String, Object  application;     @Override   public void setApplication(Map String, Object  application) {   this.application = application;   }   @Override   public void setSession(Map String, Object  session) {   this.session = session;   }   @Override   public void setRequest(Map String, Object  request) {   this.request = request;   }     //ModelDriven   protected T model;   @Override   public T getModel() {   ParameterizedType type = (ParameterizedType)this.getClass().getGenericSuperclass();   Class clazz = (Class)type.getActualTypeArguments()[0];   try {   model = (T)clazz.newInstance();   } catch (Exception e) {   throw new RuntimeException(e);   }   return model;   }  } 

那样CategoryAction中就更为清新了:

Java编码 public class CategoryAction extends BaseAction Category  {     public String update() {   System.out.println( ----update---- );   categoryService.update(model);   return  index ;   }     public String save() {   System.out.println( ----save---- );   System.out.println(model);   return  index ;   }     public String query() {   request.put( categoryList , categoryService.query());   session.put( categoryList , categoryService.query());   application.put( categoryList , categoryService.query());   return  index ;   }    } 

有些人将会会问,BaseAction中引入了那麼多service目标得话不容易数据冗余么?它是不容易的,由于即使不写在BaseAction中,Spring器皿也是会建立这一目标的,这一点沒有关联,反过来,service目标全放到BaseAction中更为有利于别的Action的开发设计,并且BaseAction不用配到struts.xml文档中,由于压根就沒有哪一个JSP会恳求BaseAction,它仅仅让别的Action来承继用的。

也有一点别忘记:那么就是改动在beans.xml中的配备:

XML/HTML编码 !-- 假如是prototype种类,默认设置是应用时建立,并不是起动时全自动建立 --   bean id= baseAction   > 新加一个baseAction的bean,将工程项目中常有service目标做为property选好,将原先的categoryAction中的property弄死。

之后大家假如要写新的xxxAction,立即承继BaseAction就可以,假如xxxAction中有效到某一service,立即用来用就可以,只必须在beans.xml文档里加一个xxxAction相匹配的bean,在struts.xml文档中配备好自动跳转就可以。

4. 将xml改为注释

大家能看到,伴随着新项目越写越大,beans.xml中的配备会越来越越大,并且许多配备有数据冗余,以便更为有利于开发设计,大家如今将xml的配备改为注释的方式,大家首先看一下beans.xml中的配备:

SSH电商项目实战之二:基本增删查改、Service和Action的抽取以及使用注解替换xml

这种就是我们以前构建自然环境及其提取的情况下写的bean,这种都必须变换成注释的方式,下边大家一块一块的更换:最先更换service一部分,这一部分有三个:ountService。更换以下:

SSH电商项目实战之二:基本增删查改、Service和Action的抽取以及使用注解替换xml

SSH电商项目实战之二:基本增删查改、Service和Action的抽取以及使用注解替换xml

SSH电商项目实战之二:基本增删查改、Service和Action的抽取以及使用注解替换xml

随后将beans.xml中的相对一部分弄死就可以。接下去改动ActIon一部分,ountAction三个,更换以下:

SSH电商项目实战之二:基本增删查改、Service和Action的抽取以及使用注解替换xml

SSH电商项目实战之二:基本增删查改、Service和Action的抽取以及使用注解替换xml

SSH电商项目实战之二:基本增删查改、Service和Action的抽取以及使用注解替换xml

随后再弄死beans.xml中的Action一部分的配备就可以,最终在beans.xml文档中加上一个以下配备,便可令其用注释了。

XML/ponent-scan base-package= cn.it.shop.. /  

有些人将会会问,为何service和action2个应用注释的情况下不一样呢??实际上是一样的,仅仅以便区别他们不是同层的bean罢了,有利于阅读文章。

转自:倪升武的CSDNblog

 

 

SSH电子商务新项目实战演练之一:融合Struts2、Hibernate和Spring (:3)

Hibernate下openSession和getCurrentSession获得的联接与事务管理的关联 (:56)

深层次浅出SINGLETON单例设计方案方式 (:50)

怎样处理Chrome中网页页面的运行内存泄漏难题 (:15)

20个十分有效的JAVA程序片断 (:14)

Hibernate下知名的延迟时间载入难题和1:N难题 (:38)

详细说明Spring完成AOP的多种多样方法 (:8)

吃透这11这书得以给你变成Java高手 (:2)

学程序编写挑选哪一个語言?——程序编写語言工作人员要求和难度系数剖析 (:6)

程序编写語言 5 月排名榜:Java 和 C 下挫强大 (:47)


网页链接(选填)

认证(*)

文章正文(*)(留言板留言最多篇幅:1000)

记牢我,下一次回应时无需再次键入本人信息内容

(责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
无法在这个位置找到: ajaxfeedback.htm
栏目列表
推荐内容


扫描二维码分享到微信