最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年05月26日 10:21:10   作者:eson_15  
SSH框架網(wǎng)上商城項目第2戰(zhàn)之基本增刪查改、Service和Action的抽取,感興趣的小伙伴們可以參考一下

上一節(jié)《SSH框架網(wǎng)上商城項目第1戰(zhàn)之整合Struts2、Hibernate4.3和Spring4.2》我們搭建好了Struts2、Hibernate和Spring的開發(fā)環(huán)境,并成功將它們整合在一起。這節(jié)主要完成一些基本的增刪改查以及Service、Dao和Action的抽取。
1. Service層的抽取
        上一節(jié)中,我們在service層簡單寫了save和update方法,這里我們開始完善該部分的代碼,然后對service層的代碼進行抽取。
1.1 完善CategoryService層
        對數(shù)據(jù)庫的操作無非是增刪改查,首先我們來完善CategoryService層的接口和實現(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); //獲取一個Category 
 
 public List<Category> query(); //獲取全部Category 
 
} 

        對CategoryService接口的具體實現(xiàn):

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

/** 
 * @Description TODO(公共模塊的抽?。?
 * @author eson_15 
 * 
 */ 
@SuppressWarnings("unchecked") 
public class BaseServiceImpl<T> implements BaseService<T> { 
 
 private Class clazz; //clazz中存儲了當(dāng)前操作的類型,即泛型T 
 private SessionFactory sessionFactory; 
 
 public BaseServiceImpl() { 
  //下面三個打印信息可以去掉,這里是給自己看的 
  System.out.println("this代表的是當(dāng)前調(diào)用構(gòu)造方法的對象" + this); 
 System.out.println("獲取當(dāng)前this對象的父類信息" + this.getClass().getSuperclass()); 
 System.out.println("獲取當(dāng)前this對象的父類信息(包括泛型信息)" + 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,如果沒有則創(chuàng)建一個新的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實現(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 { 
 
 /* 
 * 只需實現(xiàn)CategoryService接口中新增的方法即可,公共方法已經(jīng)在BaseServiceImpl中實現(xiàn)了 
 */ 
} 

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

<!-- 泛型類是不能實例化的,所以要加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"/> 

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

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

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

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

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

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

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取代原來的內(nèi)置對象,這樣與jsp沒有依賴,但是代碼量比較大 
 // ActionContext.getContext().put("categoryList", categoryService.query()); //放到request域中 
 // ActionContext.getContext().getSession().put("categoryList", categoryService.query()); //放到session域中 
 // ActionContext.getContext().getApplication().put("categoryList", categoryService.query()); //放到application域中 
  
 //解決方案二,實現(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é)整合三大框架時的CategoryAction類,我們在里面加了一個query方法,在該方法中,我們通過向request域、session域和application域中存入查詢的結(jié)果。第一種方法是直接使用ActionContext來實現(xiàn),不需要實現(xiàn)任何接口,但是代碼量較大;第二種方法通過實現(xiàn)RequestAware、SessionAware和ApplicationAware接口,實現(xiàn)該接口的三個抽象方法把request、session和application注入進來,然后賦給相應(yīng)的成員變量中,這樣就可以在query方法中向域中存放查詢結(jié)果了。這代碼量貌似比第一種方法更大……但是我們可以抽取,先往下看。
我們在index.jsp中新加一個查詢連接來測試能否將查詢結(jié)果顯示出來:

<%@ 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">訪問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,專門處理這些域相關(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ū)ο髞泶鎯?shù)據(jù)時,直接繼承BaseAction即可,就能直接使用request、session和application對象了。所以修改后的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類,里面有個成員變量category,這是個POJO,定義這個變量并寫好set和get方法是為了JSP頁面可以通過url后面附帶參數(shù)傳進來,參數(shù)是category對象中的屬性,比如id,type等,但是url中的參數(shù)必須寫成category.id、category.type等。這樣struts會自動將這寫參數(shù)注入到category對象中,然后我們就可以直接使用這個category對象了,但是這樣有點繁瑣。我們可以使用ModelDriven來更方便的解決。

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

這樣我們在前臺JSP頁面就不用帶category.id這種繁瑣的參數(shù)了,看JSP頁面中的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">訪問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> 

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

//因為有很多不同的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一個對應(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中的代碼會越來越少:

//繼承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對象中的方法,所以必須得創(chuàng)建這個對象,并且有set方法才能注入進來。這就導(dǎo)致一個弊端:如果很多Action都需要使用categoryService的話,那就必須在它們的Action里創(chuàng)建這個對象和set方法,而且,如果一個Action中要使用好幾個不同的service對象,那就得全部創(chuàng)建,這樣就變得很冗雜。
3.5 抽取service到BaseAction
        針對上面的問題,我們將工程中所有的service對象都抽取到BaseAction中創(chuàng)建,這樣其他Action繼承BaseAction后,想用什么service就直接拿來用即可:

//我將BaseAction中的內(nèi)容歸歸類了 
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 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"; 
 } 
 
} 

        有人可能會問,BaseAction中注入了那么多service對象的話不會冗余么?這是不會的,因為就算不寫在BaseAction中,Spring容器也是會創(chuàng)建這個對象的,這點沒有關(guān)系,相反,service對象全放在BaseAction中更加便于其他Action的開發(fā),而且BaseAction不需要配到struts.xml文件中,因為根本就沒有哪個JSP會請求BaseAction,它只是讓其他Action來繼承用的。
        還有一點別忘了:那就是修改在beans.xml中的配置:

<!-- 如果是prototype類型,默認是使用時創(chuà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"/>

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

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

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


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


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

整個項目的源碼下載地址:http://m.fzitv.net/article/86099.htm

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

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

相關(guān)文章

  • 消息中間件詳解以及比較選擇

    消息中間件詳解以及比較選擇

    這篇文章主要介紹了消息中間件詳解以及比較選擇,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • hibernate 三種狀態(tài)的轉(zhuǎn)換

    hibernate 三種狀態(tài)的轉(zhuǎn)換

    本文主要介紹了hibernate三種狀態(tài)的轉(zhuǎn)換。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • springboot實現(xiàn)多模塊項目添加一新模塊

    springboot實現(xiàn)多模塊項目添加一新模塊

    這篇文章主要介紹了springboot實現(xiàn)多模塊項目添加一新模塊,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • SpringBoot?Web項目增刪改查入門實戰(zhàn)案例

    SpringBoot?Web項目增刪改查入門實戰(zhàn)案例

    這篇文章主要給大家介紹了關(guān)于SpringBoot?Web項目增刪改查入門實戰(zhàn)的相關(guān)資料,文中詳細介紹了如何實現(xiàn)新增、刪除、修改和查詢員工的功能,并使用統(tǒng)一響應(yīng)結(jié)果進行前后端交互,需要的朋友可以參考下
    2024-11-11
  • SpringBoot環(huán)境下junit單元測試速度優(yōu)化方式

    SpringBoot環(huán)境下junit單元測試速度優(yōu)化方式

    這篇文章主要介紹了SpringBoot環(huán)境下junit單元測試速度優(yōu)化方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java實現(xiàn)的簡單數(shù)字時鐘功能示例

    Java實現(xiàn)的簡單數(shù)字時鐘功能示例

    這篇文章主要介紹了Java實現(xiàn)的簡單數(shù)字時鐘功能,涉及java日期時間及JFrame框架圖形界面操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2019-02-02
  • 基于TCP通信丟包原因總結(jié)(推薦)

    基于TCP通信丟包原因總結(jié)(推薦)

    下面小編就為大家?guī)硪黄赥CP通信丟包原因總結(jié)(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • java設(shè)計模式之簡單工廠模式詳解

    java設(shè)計模式之簡單工廠模式詳解

    這篇文章主要介紹了java設(shè)計模式之簡單工廠模式的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • SpringBatch跳過異常和限制方式

    SpringBatch跳過異常和限制方式

    這篇文章主要介紹了SpringBatch跳過異常和限制方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java過濾器Filter的基本使用教程

    Java過濾器Filter的基本使用教程

    過濾器通常對一些web資源進行攔截,做完一些處理器再交給下一個過濾器處理,直到所有的過濾器處理器,再調(diào)用servlet實例的service方法進行處理。本文將通過示例為大家講解Java中過濾器Filter的用法與實現(xiàn),需要的可以參考一下
    2023-02-02

最新評論

平泉县| 酒泉市| 阳朔县| 凭祥市| 奉节县| 松桃| 随州市| 永胜县| 西丰县| 福安市| 桓台县| 濮阳县| 佛教| 灯塔市| 蛟河市| 沛县| 涟水县| 灌南县| 秦皇岛市| 宁乡县| 永城市| 休宁县| 多伦县| 且末县| 永德县| 郑州市| 焉耆| 本溪市| 大厂| 眉山市| 炎陵县| 秦皇岛市| 武胜县| 大庆市| 仁布县| 石台县| 滨海县| 靖边县| 响水县| 防城港市| 和平区|