国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - SSH框架網上商城項目第2戰之基本增刪查改、Service和Action的抽取

SSH框架網上商城項目第2戰之基本增刪查改、Service和Action的抽取

2020-05-06 11:15eson_15 JAVA教程

SSH框架網上商城項目第2戰之基本增刪查改、Service和Action的抽取,感興趣的小伙伴們可以參考一下

上一節《SSH框架網上商城項目第1戰之整合Struts2、Hibernate4.3和Spring4.2》我們搭建好了Struts2、Hibernate和Spring的開發環境,并成功將它們整合在一起。這節主要完成一些基本的增刪改查以及Service、Dao和Action的抽取。
1. Service層的抽取
        上一節中,我們在service層簡單寫了save和update方法,這里我們開始完善該部分的代碼,然后對service層的代碼進行抽取。
1.1 完善CategoryService層
        對數據庫的操作無非是增刪改查,首先我們來完善CategoryService層的接口和實現:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//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接口的具體實現:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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接口:

?
1
2
3
4
5
6
7
8
9
10
11
12
//基礎接口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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/**
 * @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實現類了。如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//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。

?
1
2
3
4
5
6
<!-- 泛型類是不能實例化的,所以要加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中去,另外要注意一點:設置lazy-init屬性為true,因為baseService是泛型類,泛型類是不能實例化的。至此,Service層的抽取就搞定了。

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

?
1
2
3
4
5
public interface AccountService extends BaseService<Account> { //注意BaseService里的泛型現在是Account
 /*
 * 只要添加AccountService本身需要的新的方法即可,公共方法已經在BaseService中了
 */
}

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

?
1
2
3
4
5
6
7
8
public class AccountServiceImpl extends BaseServiceImpl<Account> implements AccountService {
 
 /*
 * 只需實現AccountService接口中新增的方法即可,公共方法已經在BaseServiceImpl中實現了
 */
 
 //管理登陸功能,后期再完善
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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中新加一個查詢連接來測試能否將查詢結果顯示出來:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<%@ 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,專門處理這些域相關的操作。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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如下:

?
1
2
3
4
5
6
7
8
9
10
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 獲取參數(ModelDriven)
        我們繼續看上面的CategoryAction類,里面有個成員變量category,這是個POJO,定義這個變量并寫好set和get方法是為了JSP頁面可以通過url后面附帶參數傳進來,參數是category對象中的屬性,比如id,type等,但是url中的參數必須寫成category.id、category.type等。這樣struts會自動將這寫參數注入到category對象中,然后我們就可以直接使用這個category對象了,但是這樣有點繁瑣。我們可以使用ModelDriven來更方便的解決。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class CategoryAction extends BaseAction implements ModelDriven<Category>{
 
 private Category category;
 
 //使用ModelDriven接口必須要實現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這種繁瑣的參數了,看JSP頁面中的ModelDriven部分:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<%@ 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>

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//因為有很多不同的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中的代碼會越來越少:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//繼承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就直接拿來用即可:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//我將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 setAccountService(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中就更加清爽了:
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中的配置:

?
1
2
3
4
5
6
7
<!-- 如果是prototype類型,默認是使用時創建,不是啟動時自動創建 -->
<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干掉。
        以后我們如果要寫新的xxxAction,直接繼承BaseAction即可,如果xxxAction中有用到某個service,直接拿來用即可,只需要在beans.xml文件中加一個xxxAction對應的bean,在struts.xml文件中配置好跳轉即可。

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

        這些是我們之前搭建環境以及抽取的時候寫的bean,這些都需要轉換成注解的形式,下面我們一塊一塊的換掉:首先替換service部分,這部分有三個:baseService、categoryService和accountService。替換如下:

SSH框架網上商城項目第2戰之基本增刪查改、Service和Action的抽取

SSH框架網上商城項目第2戰之基本增刪查改、Service和Action的抽取

SSH框架網上商城項目第2戰之基本增刪查改、Service和Action的抽取

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

SSH框架網上商城項目第2戰之基本增刪查改、Service和Action的抽取

SSH框架網上商城項目第2戰之基本增刪查改、Service和Action的抽取

SSH框架網上商城項目第2戰之基本增刪查改、Service和Action的抽取

SSH框架網上商城項目第2戰之基本增刪查改、Service和Action的抽取

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

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

以上就是SSH框架網上商城項目第2戰的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
  • JAVA教程Java中遍歷數組使用foreach循環還是for循環?

    Java中遍歷數組使用foreach循環還是for循環?

    這篇文章主要介紹了Java中遍歷數組使用foreach循環還是for循環?本文著重講解for語句的語法并給出使用實例,同時總結出盡量使用foreach語句遍歷數組,需要的...

    junjie3632019-12-23
  • JAVA教程java實現圖片裁切的工具類實例

    java實現圖片裁切的工具類實例

    這篇文章主要介紹了java實現圖片裁切的工具類實例,涉及Java針對圖片的讀取、修改等相關操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下 ...

    5iasp3742020-01-15
  • JAVA教程詳解Java的線程的優先級以及死鎖

    詳解Java的線程的優先級以及死鎖

    這篇文章主要介紹了詳解Java的線程的優先級以及死鎖,線程是Java編程學習中的重要知識,需要的朋友可以參考下 ...

    goldensun3452020-01-07
  • JAVA教程論Java Web應用中調優線程池的重要性

    論Java Web應用中調優線程池的重要性

    這篇文章主要論述Java Web應用中調優線程池的重要性,通過了解應用的需求,組合最大線程數和平均響應時間,得出一個合適的線程池配置 ...

    lijiao3222020-04-15
  • JAVA教程Java中的雙重檢查(Double-Check)詳解

    Java中的雙重檢查(Double-Check)詳解

    這篇文章主要為大家詳細介紹了Java中的雙重檢查(Double-Check),感興趣的小伙伴們可以參考一下 ...

    882503062020-04-06
  • JAVA教程scala 操作數據庫的方法

    scala 操作數據庫的方法

    這篇文章主要介紹了scala 操作數據庫的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著...

    張樂19933822019-06-29
  • JAVA教程java操作excel的方法

    java操作excel的方法

    這篇文章主要介紹了java操作excel的方法,實例分析了java針對excel文件的讀寫、打開、保存等操作技巧,需要的朋友可以參考下 ...

    愷哥3752019-12-26
  • JAVA教程Java如何利用Mybatis進行數據權限控制詳解

    Java如何利用Mybatis進行數據權限控制詳解

    這篇文章主要介紹了Java如何利用Mybatis進行數據權限控制詳解,數據權限控制最終的效果是會要求在同一個數據請求方法中,根據不同的權限返回不同的數據...

    陳晨_軟件五千言5262019-06-27
主站蜘蛛池模板: 羞羞视频在线观看 | 日韩中文字幕无码一区二区三区 | 日韩欧美中文字幕在线视频 | 大香一网 | 91免费在线视频 | 国产成人精品一区二区三区四区 | 久久99久久99精品免观看粉嫩 | 欧美日韩一区二区三区 | 精品国产一区二区三区性色av | 日韩91 | 亚洲激情一区二区三区 | 在线成人国产 | 精品国产乱码久久久久久丨区2区 | ts人妖另类精品视频系列 | 亚洲福利在线观看 | 先锋久久 | 国产在线观看一区二区三区 | 成人网址在线观看 | 国产成人久久 | 日本三级中文在线电影 | 亚洲男人的天堂在线观看 | 污视频网站在线观看 | 国产精品视频一区二区三区四 | 亚洲天堂高清 | 日本视频一区二区三区 | 久久精品中文字幕 | 国产综合视频在线观看 | 香蕉亚洲| 亚洲日本视频 | av成人在线观看 | 久久综合九色综合网站 | 国产精品亚洲一区二区三区在线 | 国产成人一区二区三区 | 一本色道久久综合狠狠躁的推荐 | 亚洲精品国偷拍自产在线观看 | 在线精品国产 | 午夜精品久久久久久久男人的天堂 | 欧美涩涩网站 | 国产视频三区 | 国产精品久久一区 | 羞羞动漫在线观看 |