SSM架構中的配置檔案繁雜,此文幫大家疏通一下整體流程!
一 環境準備
1.1 建立maven工程
如圖所示:

輸入一下資訊:
groupId:組織名稱
artifactId:項目名稱
便可進入項目中
1.2添加本次項目需要的jar包
jar包版本号
<spring.version>5.0.2.RELEASE</spring.version>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<shiro.version>1.2.3</shiro.version>
<mysql.version>5.1.6</mysql.version>
<mybatis.version>3.4.5</mybatis.version>
對應的說明(坐标檔案)
1 <dependency>
2 <groupId>junit</groupId>
3 <artifactId>junit</artifactId>
4 <version>4.11</version>
5 <scope>test</scope>
6 </dependency>
7
8 <!-- spring -->
9 <dependency>
10 <groupId>org.aspectj</groupId>
11 <artifactId>aspectjweaver</artifactId>
12 <version>1.6.8</version>
13 </dependency>
14
15 <dependency>
16 <groupId>org.springframework</groupId>
17 <artifactId>spring-aop</artifactId>
18 <version>${spring.version}</version>
19 </dependency>
20
21 <dependency>
22 <groupId>org.springframework</groupId>
23 <artifactId>spring-context</artifactId>
24 <version>${spring.version}</version>
25 </dependency>
26
27 <dependency>
28 <groupId>org.springframework</groupId>
29 <artifactId>spring-web</artifactId>
30 <version>${spring.version}</version>
31 </dependency>
32
33 <dependency>
34 <groupId>org.springframework</groupId>
35 <artifactId>spring-webmvc</artifactId>
36 <version>${spring.version}</version>
37 </dependency>
38
39 <dependency>
40 <groupId>org.springframework</groupId>
41 <artifactId>spring-test</artifactId>
42 <version>${spring.version}</version>
43 </dependency>
44
45 <dependency>
46 <groupId>org.springframework</groupId>
47 <artifactId>spring-tx</artifactId>
48 <version>${spring.version}</version>
49 </dependency>
50
51 <dependency>
52 <groupId>org.springframework</groupId>
53 <artifactId>spring-jdbc</artifactId>
54 <version>${spring.version}</version>
55 </dependency>
56
57 <dependency>
58 <groupId>junit</groupId>
59 <artifactId>junit</artifactId>
60 <version>4.12</version>
61 <scope>test</scope>
62 </dependency>
63
64 <dependency>
65 <groupId>mysql</groupId>
66 <artifactId>mysql-connector-java</artifactId>
67 <version>${mysql.version}</version>
68 </dependency>
69
70 <dependency>
71 <groupId>javax.servlet</groupId>
72 <artifactId>servlet-api</artifactId>
73 <version>2.5</version>
74 <scope>provided</scope>
75 </dependency>
76
77 <dependency>
78 <groupId>javax.servlet.jsp</groupId>
79 <artifactId>jsp-api</artifactId>
80 <version>2.0</version>
81 <scope>provided</scope>
82 </dependency>
83
84 <dependency>
85 <groupId>jstl</groupId>
86 <artifactId>jstl</artifactId>
87 <version>1.2</version>
88 </dependency>
89
90 <!-- log start -->
91 <dependency>
92 <groupId>log4j</groupId>
93 <artifactId>log4j</artifactId>
94 <version>${log4j.version}</version>
95 </dependency>
96
97 <dependency>
98 <groupId>org.slf4j</groupId>
99 <artifactId>slf4j-api</artifactId>
100 <version>${slf4j.version}</version>
101 </dependency>
102
103 <dependency>
104 <groupId>org.slf4j</groupId>
105 <artifactId>slf4j-log4j12</artifactId>
106 <version>${slf4j.version}</version>
107 </dependency>
108 <!-- log end -->
109 <dependency>
110 <groupId>org.mybatis</groupId>
111 <artifactId>mybatis</artifactId>
112 <version>${mybatis.version}</version>
113 </dependency>
114
115 <dependency>
116 <groupId>org.mybatis</groupId>
117 <artifactId>mybatis-spring</artifactId>
118 <version>1.3.0</version>
119 </dependency>
120
121 <dependency>
122 <groupId>c3p0</groupId>
123 <artifactId>c3p0</artifactId>
124 <version>0.9.1.2</version>
125 <type>jar</type>
126 <scope>compile</scope>
127 </dependency>
128 <dependency>
129 <groupId>org.junit.jupiter</groupId>
130 <artifactId>junit-jupiter-api</artifactId>
131 <version>RELEASE</version>
132 <scope>compile</scope>
133 </dependency>
134 <dependency>
135 <groupId>org.junit.jupiter</groupId>
136 <artifactId>junit-jupiter-api</artifactId>
137 <version>RELEASE</version>
138 <scope>compile</scope>
139 </dependency>
1.3 标記檔案夾
需要注意,要用IDEA中的mark as将檔案夾分别标注為源代碼和配置檔案
1.4 編寫實體類
1 public class User {
2 private int id;
3 private String username;
4 private Date birthday;
5 private String sex;
6 private String address;
7
8 public int getId() {
9 return id;
10 }
11
12 public void setId(int id) {
13 this.id = id;
14 }
15
16 public String getUsername() {
17 return username;
18 }
19
20 public void setUsername(String username) {
21 this.username = username;
22 }
23
24 public Date getBirthday() {
25 return birthday;
26 }
27
28 public void setBirthday(Date birthday) {
29 this.birthday = birthday;
30 }
31
32 public String getSex() {
33 return sex;
34 }
35
36 public void setSex(String sex) {
37 this.sex = sex;
38 }
39
40 public String getAddress() {
41 return address;
42 }
43
44 public void setAddress(String address) {
45 this.address = address;
46 }
47
48 @Override
49 public String toString() {
50 return "User{" +
51 "id=" + id +
52 ", username=\'" + username + \'\\'\' +
53 ", birthday=" + birthday +
54 ", sex=\'" + sex + \'\\'\' +
55 ", address=\'" + address + \'\\'\' +
56 \'}\';
57 }
58 }
1.5 編寫業務層接口和持久層接口
持久層接口
1 public interface IUserDao {
2 public List<User> findAll();
3 }
業務層接口
1 public interface IUserService {
2 public List<User> findAll();
3 }
二、Spring架構
2.1 編寫spring配置檔案
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:aop="http://www.springframework.org/schema/aop"
5 xmlns:tx="http://www.springframework.org/schema/tx"
6 xmlns:context="http://www.springframework.org/schema/context"
7 xsi:schemaLocation="http://www.springframework.org/schema/beans
8 http://www.springframework.org/schema/beans/spring-beans.xsd
9 http://www.springframework.org/schema/tx
10 http://www.springframework.org/schema/tx/spring-tx.xsd
11 http://www.springframework.org/schema/aop
12 http://www.springframework.org/schema/aop/spring-aop.xsd
13 http://www.springframework.org/schema/context
14 http://www.springframework.org/schema/context/spring-context.xsd">
15 <!-- 配置 spring 建立容器時要掃描的包 -->
16 <context:component-scan base-package="com.justnow">
17 <!--制定掃包規則,不掃描@Controller 注解的 JAVA 類,其他的還是要掃描 -->
18 <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
19 </context:component-scan>
20 </beans>
使用componet-scan,可以讓Spring自動識别哪些類需要被裝配程Bean,進而減少在xml中的配置
2.2 使用注解配置業務層和持久層
此時,需要實作類,實作注解配置
其中持久層
1 import java.util.List;
2
3 @Repository("userDao")
4 public class UserDaoImpl implements IUserDao {
5 @Override
6 public List<User> findAll() {
7 System.out.println("查詢了所有賬戶");
8 return null;
9 }
10 }
業務層
1 @Service("userService")
2 public class UserService implements IUserService {
3
4 @Autowired
5 private IUserDao userDao;
6
7 @Override
8 public List<User> findAll() {
9 return userDao.findAll();
10 }
11 }
因為我們使用的是自動檢測Bean的方式,是以要明确知道哪些類需要注冊為spring Bean。此時,需要使用構造性(stereotype)來注解所标注的類
@Component:把資源讓spring來管理,相當于在xml中配置了一個Bean
@Controller:一般用于表現層的注解
@Service:一般用于業務層的注解
@Repository:一般用于持久層的注解
後面三個是第一個的衍生注解,與@Commponent作用和屬性是都一樣,隻不過是提供了更加明确的使用場景。
注解的value指定了Bean的id。如@Service("userService"),可以表示将該類注冊為Bean,其中id為userService。如果沒有指定value的話,該Bean的id為類名第一個字母小寫
@Autowired:當Spring發現@Autowired注解時,将自動在代碼上下文中找到與其比對(預設是類型比對)的Bean,并自動注入到相應的地方去。
2.3 測試spring能否獨立運作
1 public class Test01Spring {
2 public static void main(String[] args) {
3 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
4 IUserService userService = (IUserService) context.getBean("userService");
5 userService.findAll();
6 }
7 }
拿到配置檔案,根據id值執行個體化類,執行findAll方法
執行的結果為:
說明,上述的配置過程無問題!
三、配置SpringMvc架構
3.1 在web.xml中配置核心控制器(DIspatcherServlet)
① 配置spring mvc的核心控制器
② 解決中文亂碼過濾器
③ 預設通路的檔案
代碼如下:
1 <!-- 1、配置 spring mvc 的核心控制器 -->
2 <servlet>
3 <servlet-name>springmvcDispatcherServlet</servlet-name>
4 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
5 <!-- 配置初始化參數,用于讀取 springmvc 的配置檔案 -->
6 <init-param>
7 <param-name>contextConfigLocation</param-name>
8 <param-value>classpath:spring-mvc.xml</param-value>
9 </init-param>
10 <!-- 配置 servlet 的對象的建立時間點:應用加載時建立。取值隻能是非 0 正整數,表示啟動順序 -->
11 <load-on-startup>1</load-on-startup>
12 </servlet>
13 <servlet-mapping>
14 <servlet-name>springmvcDispatcherServlet</servlet-name>
15 <url-pattern>/</url-pattern>
16 </servlet-mapping>
17
18 <!-- 2、解決中文亂碼過濾器 -->
19 <filter>
20 <filter-name>characterEncodingFilter</filter-name>
21 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
22 <!--設定過濾中的屬性值-->
23 <init-param>
24 <param-name>encoding</param-name>
25 <param-value>UTF-8</param-value>
26 </init-param>
27 <!--啟動過濾器-->
28 </filter>
29 <!--過濾所有請求-->
30 <filter-mapping>
31 <filter-name>characterEncodingFilter</filter-name>
32 <url-pattern>/*</url-pattern>
33 </filter-mapping>
34
35 <!--3、預設的通路檔案-->
36 <welcome-file-list>
37 <welcome-file>index.html</welcome-file>
38 <welcome-file>index.htm</welcome-file>
39 <welcome-file>index.jsp</welcome-file>
40 <welcome-file>default.html</welcome-file>
41 <welcome-file>default.htm</welcome-file>
42 <welcome-file>default.jsp</welcome-file>
43 </welcome-file-list>
3.2 編寫SpringMVC的配置檔案spring-mvc.xml
① 掃描controller的注解,别的不掃描
② 配置視圖解析器
③ 開啟對SpringMVC注解的支援
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:mvc="http://www.springframework.org/schema/mvc"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
6 xmlns:aop="http://www.springframework.org/schema/aop"
7 xsi:schemaLocation="
8 http://www.springframework.org/schema/beans
9 http://www.springframework.org/schema/beans/spring-beans.xsd
10 http://www.springframework.org/schema/mvc
11 http://www.springframework.org/schema/mvc/spring-mvc.xsd
12 http://www.springframework.org/schema/context
13 http://www.springframework.org/schema/context/spring-context.xsd
14 http://www.springframework.org/schema/aop
15 http://www.springframework.org/schema/aop/spring-aop.xsd
16 ">
17
18 <!-- 1、掃描controller的注解,别的不掃描 -->
19 <context:component-scan base-package="com.justnow.controller">
20 </context:component-scan>
21
22 <!-- 2、配置視圖解析器 -->
23 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
24 <!-- JSP檔案所在的目錄 -->
25 <property name="prefix" value="/pages/" />
26 <!-- 檔案的字尾名 -->
27 <property name="suffix" value=".jsp" />
28 </bean>
29
30 <!--3、開啟對SpringMVC注解的支援 -->
31 <mvc:annotation-driven />
32
33
34 </beans>
3.3 編寫Controller和jsp視圖,測試
此處并沒有連接配接資料庫,是以隻是測試
建立UserController
1 package com.justnow.controller;
2
3 import org.springframework.stereotype.Controller;
4 import org.springframework.web.bind.annotation.RequestMapping;
5
6 @Controller
7 @RequestMapping("/user")
8 public class UserController {
9 @RequestMapping("/findAll")
10 public String findAll(){
11 System.out.println("測試通過");
12 return "userList";
13 }
14 }
當通路/user/findAll的時候,就會在控制台列印"測試通過"
修改index.jsp為
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
2 <html>
3 <body>
4 <h2>Hello World!</h2>
5 <a href="${pageContext.request.contextPath}/user/findAll">click</a>
6 </body>
7 </html>
最後的測試效果
四、整合Spring和SpringMVC
4.1 配置監聽器實作啟動服務建立容器
在web.xml中添加以下内容
1 <!--配置spring提供的監聽器,用于啟動伺服器時加載容器。該監聽器隻能加載WEB-INF目錄中名稱為applicationContext.xml的配置檔案,是以需要手動指定spring配置檔案的位置-->
2 <listener>
3 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
4 </listener>
5
6 <!--手動指定spring配置檔案位置-->
7 <context-param>
8 <param-name>contextConfigLocation</param-name>
9 <param-value>classpath:applicationContext.xml</param-value>
10 </context-param>
五、使用Mybatis
MyBatis 是一款優秀的持久層架構,它支援定制化 SQL、存儲過程以及進階映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設定參數以及擷取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生類型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 對象)為資料庫中的記錄。
5.1 編寫SqlMapConfig.xml的配置檔案
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE configuration
3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
4 "http://mybatis.org/dtd/mybatis-3-config.dtd">
5 <configuration>
6 <properties resource="jdbcConfig.properties"></properties>
7 <environments default="mysql">
8 <environment id="mysql">
9 <transactionManager type="JDBC"></transactionManager>
10 <dataSource type="pooled">
11 <property name="driver" value="${jdbc.driver}"/>
12 <property name="url" value="${jdbc.url}"/>
13 <property name="username" value="${jdbc.username}"/>
14 <property name="password" value="${jdbc.password}"/>
15 </dataSource>
16 </environment>
17 </environments>
18 <mappers>
19 <!--該包下所有的dao接口-->
20 <package name="com.justnow.dao"/>
21 </mappers>
22 </configuration>
使用mybatis的注解配置,是以不需要再寫對應接口的映射檔案
5.2 在IUserDao接口的方法上添加注解,編寫SQL語句
1 package com.justnow.dao;
2
3 import com.justnow.domain.User;
4 import org.apache.ibatis.annotations.Select;
5
6 import java.util.List;
7
8 public interface IUserDao {
9 @Select("select * from user")
10 public List<User> findAll();
11 }
5.3 寫測試類,檢視結果
強調,Resource類來自mybatis的包下,不要導錯了
1 package test;
2
3 import com.justnow.dao.IUserDao;
4 import com.justnow.domain.User;
5 import org.apache.ibatis.io.Resources;
6 import org.apache.ibatis.session.SqlSession;
7 import org.apache.ibatis.session.SqlSessionFactory;
8 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
9 import org.junit.jupiter.api.Test;
10
11 import java.io.IOException;
12 import java.io.InputStream;
13 import java.util.List;
14
15
16 public class Test02Mybatis {
17 @Test
18 public void test() throws IOException {
19 //加載配置檔案
20 InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
21 //建立工廠
22 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
23 //建立sqlSession對象
24 SqlSession session = factory.openSession();
25 //擷取代理對象
26 IUserDao dao = session.getMapper(IUserDao.class);
27 //調用查詢的方法
28 List<User> list = dao.findAll();
29 for (User user : list) {
30 System.out.println(user);
31 }
32 //釋放資源
33 session.close();
34 inputStream.close();
35 }
36 }
檢視測試結果
六 Spring整合Mybatis架構
6.1 SqlMapConfig.xm配置檔案的内容配置到applicationContext.xml中
注意:配置完成後,直接删除SqlMapConfig.xml。
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:aop="http://www.springframework.org/schema/aop"
5 xmlns:tx="http://www.springframework.org/schema/tx"
6 xmlns:context="http://www.springframework.org/schema/context"
7 xsi:schemaLocation="http://www.springframework.org/schema/beans
8 http://www.springframework.org/schema/beans/spring-beans.xsd
9 http://www.springframework.org/schema/tx
10 http://www.springframework.org/schema/tx/spring-tx.xsd
11 http://www.springframework.org/schema/aop
12 http://www.springframework.org/schema/aop/spring-aop.xsd
13 http://www.springframework.org/schema/context
14 http://www.springframework.org/schema/context/spring-context.xsd">
15 <!-- 配置 spring 建立容器時要掃描的包 -->
16 <context:component-scan base-package="com.justnow">
17 <!--制定掃包規則,不掃描@Controller 注解的 JAVA 類,其他的還是要掃描 -->
18 <context:exclude-filter type="annotation"
19 expression="org.springframework.stereotype.Controller" />
20 </context:component-scan>
21
22 <!--加載配置檔案-->
23 <context:property-placeholder location="classpath:jdbcConfig.properties" />
24
25 <!--配置資料源-->
26 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
27 <property name="driverClass" value="${jdbc.driver}"></property>
28 <property name="jdbcUrl" value="${jdbc.url}"></property>
29 <property name="user" value="${jdbc.username}"></property>
30 <property name="password" value="${jdbc.password}"></property>
31 </bean>
32 <!--配置mybatis的Session工廠-->
33 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
34 <!--資料庫連接配接池-->
35 <property name="dataSource" ref="dataSource"/>
36
37 <!-- 掃描sql配置檔案:mapper需要的xml檔案 -->
38 <property name="mapperLocations" value="classpath:mapper/*.xml"/>
39 </bean>
40
41 <!--配置掃描dao接口包,動态實作dao接口,注入到spring容器中-->
42 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
43 <!-- 注入sqlSessionFactory -->
44 <property name="basePackage" value="com.justnow.ssm.dao"/>
45 </bean>
46
47
48 </beans>
6.2 删除dao接口的實作類,并修改Controller
1 package com.justnow.controller;
2
3 import com.justnow.domain.User;
4 import com.justnow.service.IUserService;
5 import org.springframework.beans.factory.annotation.Autowired;
6 import org.springframework.stereotype.Controller;
7 import org.springframework.web.bind.annotation.RequestMapping;
8 import org.springframework.web.servlet.ModelAndView;
9
10 import java.util.List;
11
12 @Controller
13 @RequestMapping("/user")
14 public class UserController {
15 @Autowired
16 private IUserService userService;
17
18 @RequestMapping("/findAll")
19 public ModelAndView findAll(){
20 ModelAndView mv = new ModelAndView();
21 List<User> userList = userService.findAll();
22 mv.addObject("userList", userList);
23 mv.setViewName("userList");
24 return mv;
25 }
26 }
6.3 修改jsp頁面,讀取伺服器傳回的參數
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
2 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3 <html>
4 <head>
5 <title>title</title>
6 </head>
7 <body>
8 我是userList界面
9 展示user資訊
10 <table border="1px">
11 <tr>
12 <th>id</th>
13 <th>username</th>
14 <th>birthday</th>
15 <th>sex</th>
16 <th>address</th>
17 </tr>
18
19 <c:forEach items="${userList}" var="user">
20 <tr>
21 <td>${user.id}</td>
22 <td>${user.username}</td>
23 <td>${user.birthday}</td>
24 <td>${user.sex}</td>
25 <td>${user.address}</td>
26 </tr>
27 </c:forEach>
28
29 </table>
30 </body>
31 </html>
6.4 通路後的結果為:
七 Spring 配置注解事務
7.1 配置注解事務
如果不同的使用者同時插入資料,那麼這時候就需要事務來處理問題。在applicationContenxt.xml中配置用注解的方法來設定事務的相關屬性
1 <!--3 配置Spring的聲明式事務管理 -->
2 <!--3.1 配置事務管理器 -->
3 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
4 <property name="dataSource" ref="dataSource"/>
5 </bean>
6
7 <!--3.2 事務驅動注解-->
8 <tx:annotation-driven transaction-manager="transactionManager"/>
同時在service的實作類中添加@Transactional
這裡使用的預設的事務屬性,找到注解的源代碼
7.2 添加jsp頁面、修改controller、service、dao代碼
userInsert.jsp
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
2 <html>
3 <head>
4 <title>title</title>
5 </head>
6 <body>
7
8 <form action="${pageContext.request.contextPath}/user/save" method="post">
9 id<input type="text" name="id">
10 username<input type="text" name="username"><br>
11 birthday<input type="date" name="birthday"><br>
12 sex<input type="text" name="sex"><br>
13 address<input type="text" name="address"><br>
14 <input type="submit" value="送出">
15 </form>
16 </body>
17 </html>
在dao中添加插入方法
package com.justnow.dao;
import com.justnow.domain.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
public interface IUserDao {
@Select("select * from user")
public List<User> findAll();
@Insert("insert into user(id, username, birthday, sex, address) values (#{id}, #{username}, #{birthday}, #{sex}, #{address})")
public void save(User user);
}
在service中添加插入方法
在controller中添加兩個映射,一個跳轉到userInsert.jsp頁面,一個是form表單中送出後,重定向到使用者清單頁面userList.jsp中
注意:因為送出中參數出現了日期,是以必須在實體類中确定日期的格式。用注解的方法實作
現在開始測試,
第一步:打開user/add,并填入内容
第二步:檢視是否插入成功
ok!,搞定
附上本次項目源代碼:
https://github.com/justn0w/javawebdemo/tree/master/ssmdemo