国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

SSH框架網(wǎng)上商城項(xiàng)目第2戰(zhàn)之基本增刪查改、Service和Action的抽取

2019-11-26 14:17:20
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

上一節(jié)《SSH框架網(wǎng)上商城項(xiàng)目第1戰(zhàn)之整合Struts2、Hibernate4.3和Spring4.2》我們搭建好了Struts2、Hibernate和Spring的開(kāi)發(fā)環(huán)境,并成功將它們整合在一起。這節(jié)主要完成一些基本的增刪改查以及Service、Dao和Action的抽取。
1. Service層的抽取
        上一節(jié)中,我們?cè)趕ervice層簡(jiǎn)單寫(xiě)了save和update方法,這里我們開(kāi)始完善該部分的代碼,然后對(duì)service層的代碼進(jìn)行抽取。
1.1 完善CategoryService層
        對(duì)數(shù)據(jù)庫(kù)的操作無(wú)非是增刪改查,首先我們來(lái)完善CategoryService層的接口和實(shí)現(xiàn):

//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); //獲取一個(gè)Category   public List<Category> query(); //獲取全部Category  } 

        對(duì)CategoryService接口的具體實(shí)現(xiàn):

public class CategoryServiceImpl extends BaseServiceImpl<Category> implements CategoryService {   private SessionFactory sessionFactory;   //Spring會(huì)注進(jìn)來(lái)  public void setSessionFactory(SessionFactory sessionFactory) {  this.sessionFactory = sessionFactory;  }   protected Session getSession() {  //從當(dāng)前線程獲取session,如果沒(méi)有則創(chuàng)建一個(gè)新的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) {  /*第一種方法有個(gè)弊端,就是沒(méi)刪除一次得先查詢一次  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層抽取實(shí)現(xiàn)
完成了CategoryService后,我們來(lái)抽取Service層的基礎(chǔ)實(shí)現(xiàn)。思路是這樣的:我們抽取一個(gè)基礎(chǔ)接口BaseService以及基礎(chǔ)接口的實(shí)現(xiàn)BaseServiceImpl,后面開(kāi)發(fā)的時(shí)候,如果需要新的Service,只需要做兩步即可:首先定義一個(gè)新的接口xxxService繼承BaseService接口,這個(gè)接口可以增加新的抽象方法;然后定義一個(gè)新的實(shí)現(xiàn)類xxxServiceImpl繼承BaseServiceImpl并實(shí)現(xiàn)xxxService接口即可。這樣更加便于項(xiàng)目的維護(hù)。
我們先根據(jù)上面的CategoryService接口來(lái)創(chuàng)建BaseService接口:

//基礎(chǔ)接口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(); } 

然后再根據(jù)CategoryServiceImpl實(shí)現(xiàn)類創(chuàng)建BaseService接口的實(shí)現(xiàn)類BaseServiceImpl:

/**  * @Description TODO(公共模塊的抽?。? * @author eson_15  *  */ @SuppressWarnings("unchecked") public class BaseServiceImpl<T> implements BaseService<T> {   private Class clazz; //clazz中存儲(chǔ)了當(dāng)前操作的類型,即泛型T  private SessionFactory sessionFactory;   public BaseServiceImpl() {   //下面三個(gè)打印信息可以去掉,這里是給自己看的   System.out.println("this代表的是當(dāng)前調(diào)用構(gòu)造方法的對(duì)象" + this);  System.out.println("獲取當(dāng)前this對(duì)象的父類信息" + this.getClass().getSuperclass());  System.out.println("獲取當(dāng)前this對(duì)象的父類信息(包括泛型信息)" + this.getClass().getGenericSuperclass());  //拿到泛型的參數(shù)類型  ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();  clazz = (Class)type.getActualTypeArguments()[0];  }   public void setSessionFactory(SessionFactory sessionFactory) {  this.sessionFactory = sessionFactory;  }   protected Session getSession() {  //從當(dāng)前線程獲取session,如果沒(méi)有則創(chuàng)建一個(gè)新的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();  }  } 

抽取完了后,我們就可以改寫(xiě)CategoryService接口和CategoryServiceImpl實(shí)現(xiàn)類了。如下:

//CategoryService接口繼承BaseService接口 public interface CategoryService extends BaseService<Category> {  /*  * 只要添加CategoryService本身需要的新的方法即可,公共方法已經(jīng)在BaseService中了  */ }  /**  * @Description TODO(模塊自身的業(yè)務(wù)邏輯)  * @author eson_15  *  */ public class CategoryServiceImpl extends BaseServiceImpl<Category> implements CategoryService {   /*  * 只需實(shí)現(xiàn)CategoryService接口中新增的方法即可,公共方法已經(jīng)在BaseServiceImpl中實(shí)現(xiàn)了  */ } 

        從代碼中可以看出,新增的Service只需要繼承BaseService接口,然后在接口中新增本Service所需要的業(yè)務(wù)邏輯即可。新增的ServiceImpl只需要繼承BaseServiceImpl并實(shí)現(xiàn)新增的業(yè)務(wù)邏輯即可。
        但是別忘了很重要的一點(diǎn):就是修改Spring的配置文件beans.xml中的bean。

<!-- 泛型類是不能實(shí)例化的,所以要加lazy-init屬性 --> <bean id="baseService" class="cn.it.shop.service.impl.BaseServiceImpl" lazy-init="true">  <property name="sessionFactory" ref="sessionFactory" /> </bean>  <bean id="categoryService" class="cn.it.shop.service.impl.CategoryServiceImpl" parent="baseService"/> 

        將原來(lái)categoryService中的property干掉,然后增加parent屬性,指明繼承baseService;然后配置一下baseService,將sessionFactory配到baseService中去,另外要注意一點(diǎn):設(shè)置lazy-init屬性為true,因?yàn)閎aseService是泛型類,泛型類是不能實(shí)例化的。至此,Service層的抽取就搞定了。

2. Service層添加一個(gè)Account
        剛剛抽取好了Service層,那么現(xiàn)在我們想寫(xiě)一個(gè)Account(管理員)的service就很簡(jiǎn)單了:
        首先寫(xiě)一個(gè)AccountService接口繼承BaseService:

public interface AccountService extends BaseService<Account> { //注意BaseService里的泛型現(xiàn)在是Account  /*  * 只要添加AccountService本身需要的新的方法即可,公共方法已經(jīng)在BaseService中了  */ } 

        然后寫(xiě)一個(gè)AccountServiceImpl實(shí)現(xiàn)類繼承BaseServiceImpl實(shí)現(xiàn)類,并實(shí)現(xiàn)AccountService接口即可:

public class AccountServiceImpl extends BaseServiceImpl<Account> implements AccountService {   /*  * 只需實(shí)現(xiàn)AccountService接口中新增的方法即可,公共方法已經(jīng)在BaseServiceImpl中實(shí)現(xiàn)了  */   //管理登陸功能,后期再完善 } 

        最后在beans.xml文件里加上如下配置:
<bean id="accountService" class="cn.it.shop.service.impl.AccountServiceImpl" parent="baseService" />  
        這樣就寫(xiě)好了一個(gè)新的service了,以后需要添加service就遵循這個(gè)流程,非常方便。
3. Action的抽取
3.1 Action中往域(request,session,application等)中存數(shù)據(jù)
        我們知道,在Action中可以直接通過(guò)ActionContext.getContext()去獲取一個(gè)ActionContext對(duì)象,然后通過(guò)該對(duì)象再去獲得相應(yīng)的域?qū)ο螅灰部梢酝ㄟ^(guò)實(shí)現(xiàn)xxxAware接口來(lái)注入相應(yīng)的域?qū)ο蟆N覀兿葋?lái)看一下這兩種方法:

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() {   //解決方案一,采用相應(yīng)的map取代原來(lái)的內(nèi)置對(duì)象,這樣與jsp沒(méi)有依賴,但是代碼量比較大  // ActionContext.getContext().put("categoryList", categoryService.query()); //放到request域中  // ActionContext.getContext().getSession().put("categoryList", categoryService.query()); //放到session域中  // ActionContext.getContext().getApplication().put("categoryList", categoryService.query()); //放到application域中    //解決方案二,實(shí)現(xiàn)相應(yīng)的接口(RequestAware,SessionAware,ApplicationAware),讓相應(yīng)的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;  } } 

還是上一節(jié)整合三大框架時(shí)的CategoryAction類,我們?cè)诶锩婕恿艘粋€(gè)query方法,在該方法中,我們通過(guò)向request域、session域和application域中存入查詢的結(jié)果。第一種方法是直接使用ActionContext來(lái)實(shí)現(xiàn),不需要實(shí)現(xiàn)任何接口,但是代碼量較大;第二種方法通過(guò)實(shí)現(xiàn)RequestAware、SessionAware和ApplicationAware接口,實(shí)現(xiàn)該接口的三個(gè)抽象方法把request、session和application注入進(jìn)來(lái),然后賦給相應(yīng)的成員變量中,這樣就可以在query方法中向域中存放查詢結(jié)果了。這代碼量貌似比第一種方法更大……但是我們可以抽取,先往下看。
我們?cè)趇ndex.jsp中新加一個(gè)查詢連接來(lái)測(cè)試能否將查詢結(jié)果顯示出來(lái):

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/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">訪問(wèn)update</a>  <a href="category_save.action">訪問(wèn)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
        剛剛提到了,第二種方法的代碼量更大,但是我們可以抽取一個(gè)BaseAction,專門(mén)處理這些域相關(guān)的操作。

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如果需要用到這些域?qū)ο髞?lái)存儲(chǔ)數(shù)據(jù)時(shí),直接繼承BaseAction即可,就能直接使用request、session和application對(duì)象了。所以修改后的CategoryAction如下:

public class CategoryAction extends BaseAction {   private Category category; <pre name="code" class="java">  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 獲取參數(shù)(ModelDriven)
        我們繼續(xù)看上面的CategoryAction類,里面有個(gè)成員變量category,這是個(gè)POJO,定義這個(gè)變量并寫(xiě)好set和get方法是為了JSP頁(yè)面可以通過(guò)url后面附帶參數(shù)傳進(jìn)來(lái),參數(shù)是category對(duì)象中的屬性,比如id,type等,但是url中的參數(shù)必須寫(xiě)成category.id、category.type等。這樣struts會(huì)自動(dòng)將這寫(xiě)參數(shù)注入到category對(duì)象中,然后我們就可以直接使用這個(gè)category對(duì)象了,但是這樣有點(diǎn)繁瑣。我們可以使用ModelDriven來(lái)更方便的解決。

public class CategoryAction extends BaseAction implements ModelDriven<Category>{   private Category category;   //使用ModelDriven接口必須要實(shí)現(xiàn)getModel()方法,此方法會(huì)把返回的項(xiàng)壓到棧頂  @Override  public Category getModel() {  category = new Category();  return category;  } <pre name="code" class="java"> 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";  }  } 

這樣我們?cè)谇芭_(tái)JSP頁(yè)面就不用帶category.id這種繁瑣的參數(shù)了,看JSP頁(yè)面中的ModelDriven部分:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/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">訪問(wèn)update</a>  <a href="category_save.action?id=1&type=haha&hot=true">測(cè)試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> 

        測(cè)試結(jié)果是可以獲得catgory,并且將id,type和hot屬性全部賦值好。我們可以看出,通過(guò)實(shí)現(xiàn)ModelDriven接口,我們可以很方便的在url中攜帶參數(shù),Action中只需要實(shí)現(xiàn)getModel方法,new一個(gè)要使用的對(duì)象返回即可。到這里我們很容易想到,struts中肯定會(huì)有很多這種model需要獲取,所以這一塊我們也要抽取到BaseAction中去。
3.4 抽取ModelDriven到BaseAction
        首先我們?cè)贐aseAction中添加ModelDriven部分的代碼,如下:

//因?yàn)橛泻芏嗖煌膍odel都需要使用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() { //這里通過(guò)解析傳進(jìn)來(lái)的T來(lái)new一個(gè)對(duì)應(yīng)的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中的代碼會(huì)越來(lái)越少:

//繼承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";  }  } 

        到這里,還有一個(gè)看著不爽的地方,就是categoryService這個(gè)成員變量,它一直存在在CategoryAction里,因?yàn)镃ategoryAction中有用到categoryService對(duì)象中的方法,所以必須得創(chuàng)建這個(gè)對(duì)象,并且有set方法才能注入進(jìn)來(lái)。這就導(dǎo)致一個(gè)弊端:如果很多Action都需要使用categoryService的話,那就必須在它們的Action里創(chuàng)建這個(gè)對(duì)象和set方法,而且,如果一個(gè)Action中要使用好幾個(gè)不同的service對(duì)象,那就得全部創(chuàng)建,這樣就變得很冗雜。
3.5 抽取service到BaseAction
        針對(duì)上面的問(wèn)題,我們將工程中所有的service對(duì)象都抽取到BaseAction中創(chuàng)建,這樣其他Action繼承BaseAction后,想用什么service就直接拿來(lái)用即可:

//我將BaseAction中的內(nèi)容歸歸類了 public class BaseAction<T> extends ActionSupport implements RequestAware,SessionAware,ApplicationAware,ModelDriven<T> {   //service對(duì)象  protected CategoryService categoryService;  protected AccountService accountService;   public void setCategoryService(CategoryService categoryService) {  this.categoryService = categoryService;  }  public void setAccountService(AccountService accountService) {  this.accountService = accountService;  }   //域?qū)ο? 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中就更加清爽了: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";  }  } 

        有人可能會(huì)問(wèn),BaseAction中注入了那么多service對(duì)象的話不會(huì)冗余么?這是不會(huì)的,因?yàn)榫退悴粚?xiě)在BaseAction中,Spring容器也是會(huì)創(chuàng)建這個(gè)對(duì)象的,這點(diǎn)沒(méi)有關(guān)系,相反,service對(duì)象全放在BaseAction中更加便于其他Action的開(kāi)發(fā),而且BaseAction不需要配到struts.xml文件中,因?yàn)楦揪蜎](méi)有哪個(gè)JSP會(huì)請(qǐng)求BaseAction,它只是讓其他Action來(lái)繼承用的。
        還有一點(diǎn)別忘了:那就是修改在beans.xml中的配置:

<!-- 如果是prototype類型,默認(rèn)是使用時(shí)創(chuàng)建,不是啟動(dòng)時(shí)自動(dòng)創(chuàng)建 --> <bean id="baseAction" class="cn.it.shop.action.BaseAction" scope="prototype">  <property name="categoryService" ref="categoryService"></property>  <property name="accountService" ref="accountService"></property> </bean>  <bean id="categoryAction" class="cn.it.shop.action.CategoryAction" scope="prototype" parent="baseAction"/>

         新加一個(gè)baseAction的bean,將工程中所有service對(duì)象作為property配好,將原來(lái)的categoryAction中的property干掉。
        以后我們?nèi)绻獙?xiě)新的xxxAction,直接繼承BaseAction即可,如果xxxAction中有用到某個(gè)service,直接拿來(lái)用即可,只需要在beans.xml文件中加一個(gè)xxxAction對(duì)應(yīng)的bean,在struts.xml文件中配置好跳轉(zhuǎn)即可。

4. 將xml改成注解
        我們可以看到,隨著項(xiàng)目越寫(xiě)越大,beans.xml中的配置會(huì)越來(lái)越多,而且很多配置有冗余,為了更加便于開(kāi)發(fā),我們現(xiàn)在將xml的配置改成注解的形式,我們先看一下beans.xml中的配置:

        這些是我們之前搭建環(huán)境以及抽取的時(shí)候?qū)懙腷ean,這些都需要轉(zhuǎn)換成注解的形式,下面我們一塊一塊的換掉:首先替換service部分,這部分有三個(gè):baseService、categoryService和accountService。替換如下:


        然后將beans.xml中的相應(yīng)部分干掉即可。接下來(lái)修改ActIon部分,主要有baseAction、categoryAction和accountAction三個(gè),替換如下:


        然后再干掉beans.xml中的Action部分的配置即可,最后在beans.xml文件中添加一個(gè)如下配置,就可以使用注解了。
<context:component-scan base-package="cn.it.shop.."/> 
        有人可能會(huì)問(wèn),為什么service和action兩個(gè)使用注解的時(shí)候不一樣呢?service中使用的是@Service而action中使用的是@Controller呢?其實(shí)是一樣的,只是為了區(qū)分它們是不同層的bean而已,便于閱讀。

整個(gè)項(xiàng)目的源碼下載地址://m.survivalescaperooms.com/article/86099.htm

原文地址:http://blog.csdn.net/eson_15/article/details/51297698

以上就是SSH框架網(wǎng)上商城項(xiàng)目第2戰(zhàn)的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 固原市| 廊坊市| 吉水县| 大冶市| 格尔木市| 永善县| 仙居县| 蚌埠市| 黄陵县| 利津县| 体育| 威海市| 台北县| 普宁市| 长治县| 南昌县| 舟曲县| 探索| 新巴尔虎右旗| 武夷山市| 安塞县| 遂宁市| 巫溪县| 广元市| 丹阳市| 清水县| 张家川| 宁南县| 桑植县| 东丰县| 中西区| 晋中市| 凌云县| 林芝县| 铁岭市| 武汉市| 德惠市| 银川市| 仙游县| 来安县| 襄樊市|