目錄
- 前言
- 軟件環境
- 創建項目
- 數據庫文件
- 配置文件
- pom.xml
- log4j.properties
- jdbc.properties
- applicationContext.xml
- spring-mvc.xml
- web.xml
- 運行項目
- 編寫代碼
前言
前陣子突發奇想,想學習下SpringMVC的源碼,于是打算用idea搭建一個簡易的maven版SSM案例,也就是SpringMVC+Spring+MyBatis+Maven,因為之前創建過一些Spring的小demo,相關的軟件環境已經搭建完成,本以為搭建一個入門級的SSM項目應該不難,誰曾想這個過程中遇到了不少千奇百怪的問題,從開始創建到成功運行花了我整整一個下午的時間(我的午覺啊~~~·),最后項目成功跑起來的時候我長出了一口氣,為了以后不在類似的事情上折騰,特此寫下這篇文章記錄一下搭建過程。
軟件環境
先準備好搭建項目的基本環境
Intellij IDEA:2018.1.1
JDK:1.8
Maven:3.6.0
Tomcat:7.0及以上
下載安裝好軟件后,在idea軟件設置里做好JDK、Maven和Tomcat的相關環境配置,這方面網上的資料很多,本文就不介紹了。
創建項目
搭建好環境后,打開idea,點擊New - Project
找到Maven一欄,因為要搭建的SpringMvc項目,所以選擇webapp模板
填寫好GroupId和ArtifactId后,一步步next,最后finish完成
創建成功后,可以看到項目是這樣的目錄結構
除了配置相關依賴的pom.xml,目錄中還有一個文件夾src,src的main目錄提供了一個webapp文件夾,webapp文件夾下有一個WEB-INF文件夾,放置的是前端頁面的文件,以及web.xml文件。
除了模版提供的目錄結構,為了后面項目能成功運行,我們還需要添加一些文件夾,讓項目的目錄結構變成這樣:
數據庫文件
首先,先準備好數據庫文件,并初始化一條記錄
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶ID',`email` varchar(255) NOT NULL COMMENT '用戶郵箱',`username` varchar(255) NOT NULL COMMENT '用戶昵稱',`role` varchar(255) NOT NULL COMMENT '用戶身份',`mobile` varchar(50) DEFAULT '' COMMENT '手機號碼',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf-8;-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '1589585621@qq.com', 'xjt', 'root', '15678635432');
配置文件
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.xjt</groupId><artifactId>mvcDemo</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><name>mvcDemo Maven Webapp</name><!-- 用來設置版本號 --><properties><srping.version>4.0.2.RELEASE</srping.version><mybatis.version>3.2.8</mybatis.version><slf4j.version>1.7.12</slf4j.version><log4j.version>1.2.17</log4j.version><druid.version>1.0.9</druid.version></properties><!-- 用到的jar包 --><dependencies><!-- 單元測試 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><!-- 表示開發的時候引入,發布的時候不會加載此包 --><scope>test</scope></dependency><!-- spring框架包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${srping.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${srping.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-oxm</artifactId><version>${srping.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${srping.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${srping.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${srping.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${srping.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${srping.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>${srping.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${srping.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${srping.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${srping.version}</version></dependency><!-- spring框架包 --><!-- mybatis框架包 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.2.2</version></dependency><!-- mybatis框架包 --><!-- 數據庫驅動 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.35</version></dependency><!-- 導入dbcp的jar包,用來在applicationContext.xml中配置數據庫 --><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version></dependency><!-- jstl標簽類 --><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!-- log --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j.version}</version></dependency><!-- 連接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>${druid.version}</version></dependency></dependencies><build><!-- java編譯插件,如果maven的設置里配置好jdk版本就不用 --><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.2</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin></plugins></build>
</project>
注:以下四個配置文件都是放置在resources文件夾下
log4j.properties
#日志輸出級別
log4j.rootLogger=debug,stdout,D,E#設置stdout的日志輸出控制臺
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#輸出日志到控制臺的方式,默認為System.out
log4j.appender.stdout.Target = System.out
#設置使用靈活布局
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#靈活定義輸出格式
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} -[%p] method:[%c (%rms)] - %m%n
jdbc.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false
#數據庫的用戶名
username=root
#數據庫的密碼,別像我一樣不設置
password=
#定義初始連接數
initialSize=0
#定義最大連接數
maxActive=20
#定義最大空閑
maxIdle=20
#定義最小空閑
minIdle=1
#定義最長等待時間
maxWait=60000
applicationContext.xml
這是Spring的核心配置文件,包括Spring結合Mybatis和數據源的配置信息
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 加載properties文件 --><bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="location" value="classpath:jdbc.properties"/></bean><!-- 配置數據源 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></bean><!-- mybatis和spring完美整合,不需要mybatis的配置映射文件 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><!-- 掃描model包 --><property name="typeAliasesPackage" value="com.xjt.model"/><!-- 掃描sql配置文件:mapper需要的xml文件--><property name="mapperLocations" value="classpath:mapper/*.xml"/></bean><!-- Mapper動態代理開發,掃描dao接口包--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!-- 注入sqlSessionFactory --><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/><!-- 給出需要掃描Dao接口包 --><property name="basePackage" value="com.xjt.dao"/></bean><!-- 事務管理 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!--數據庫連接池--><property name="dataSource" ref="dataSource"/></bean>
spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"><!-- 掃描注解,這樣com.xjt包下的文件都能被掃描 --><context:component-scan base-package="com.xjt"/><!-- 開啟SpringMVC注解模式 --><mvc:annotation-driven/><!-- 靜態資源默認servlet配置 --><mvc:default-servlet-handler/><!-- 配置返回視圖的路徑,以及識別后綴是jsp文件 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean>
</beans>
web.xml
該文件不是放在resources,而是webapp的WEB-INF文件夾下,文件內容如下:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><display-name>mvcDemo</display-name><!--項目的歡迎頁,項目運行起來后訪問的頁面--><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><!-- 注冊ServletContext監聽器,創建容器對象,并且將ApplicationContext對象放到Application域中 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 指定spring核心配置文件 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><!-- 解決亂碼的過濾器 --><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- 配置前端控制器 --><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 指定配置文件位置和名稱 如果不設置,默認找/WEB-INF/<servlet-name>-servlet.xml --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup><async-supported>true</async-supported></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>
運行項目
上面的配置文件編寫好之后,其實我們就可以嘗試著啟動項目了,啟動項目前先把applicationContext.xml的內容都注釋了,然后就可以創建運行環境了。
點擊idea右上角的 Edit Configurations...
選擇Tomcat Server - Local,
編輯好項目的啟動信息,包括項目名,jdk版本,tomcat以及端口
選擇Deployment,添加Atifact,選擇第二項,否則Tomcat運行會報錯
保存后,啟動項目,成功后在瀏覽器輸入http://localhost:8080,返回結果如下:
這是index.jsp文件中的內容,因為index.jsp是啟動頁,所以項目啟動后返回的結果是啟動頁的內容
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>
編寫代碼
項目能跑起來,說明我們前端控制器的配置是成功的,接下來要做的是測試能否訪問數據庫。首先,把基本的類文件創建并編寫好代碼。
實體類:User.java
package com.xjt.model;public class User {private long id;private String email;private String mobile;private String username;private String role;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getMobile() {return mobile;}public void setMobile(String mobile) {this.mobile = mobile;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getRole() {return role;}public void setRole(String role) {this.role = role;}
}
dao文件:IUserDao
package com.xjt.dao;import com.xjt.model.User;public interface IUserDao {User selectUser(long id);
}
mapper文件:UserDao.xml
位于resources - mapper文件夾下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- 設置為IUserDao接口方法提供sql語句配置 -->
<mapper namespace="com.xjt.dao.IUserDao"><select id="selectUser" resultType="User" parameterType="long">SELECT * FROM user WHERE id = #{id}</select></mapper>
service接口:IUserService
package com.xjt.service;import com.xjt.model.User;public interface IUserService {public User selectUser(long userId);
}
UserServiceImpl
package com.xjt.service.impl;import com.xjt.dao.IUserDao;
import com.xjt.model.User;
import com.xjt.service.IUserService;
import org.springframework.stereotype.Service;import javax.annotation.Resource;@Service("userService")
public class UserServiceImpl implements IUserService {@Resourceprivate IUserDao userDao;public User selectUser(long userId) {return userDao.selectUser(userId);}
}
controller文件:UserController
package com.xjt.controller;import com.xjt.model.User;
import com.xjt.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
@RequestMapping("/user")
public class UserController {@Autowiredprivate IUserService userService;@RequestMapping("/select")public ModelAndView selectUser() throws Exception {ModelAndView mv = new ModelAndView();User user = userService.selectUser(1);mv.addObject("user", user);mv.setViewName("user");return mv;}
}
UserController定義了一個方法selectUser
,讀取id為1的User信息,并返回user.jsp頁面,訪問的路徑是/user/select,user.jsp位于 WEB-INF 的 jsp 文件夾下,代碼如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>user</title>
</head>
<body>id:${requestScope.user.id}<br/>email:${requestScope.user.email}<br/>username:${requestScope.user.username}<br/>role:${requestScope.user.role}<br/>mobile:${requestScope.user.mobile}<br/>
</body>
</html>
都編寫完畢以后,撤銷applicationContext.xml文件的注釋符號,然后開啟項目,成功后在瀏覽器輸入http://localhost:8080/user/select
頁面成功的返回了User信息,說明,我們成功訪問到了數據庫的內容。
至此,SSM項目的搭建大功告成,為了方便大家學習,我把源碼放在了github上了,有需要的同學可以自行下載,地址:https://github.com/Taoxj/mvcDemo