用idea搭建SSM專案,原來這麼簡單

鄙人薛某發表於2019-01-28

前言

前陣子突發奇想,想學習下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

用idea搭建SSM專案,原來這麼簡單

找到Maven一欄,因為要搭建的SpringMvc專案,所以選擇webapp模板

用idea搭建SSM專案,原來這麼簡單

填寫好GroupId和ArtifactId後,一步步next,最後finish完成

用idea搭建SSM專案,原來這麼簡單

建立成功後,可以看到專案是這樣的目錄結構

用idea搭建SSM專案,原來這麼簡單

除了配置相關依賴的pom.xml,目錄中還有一個資料夾src,src的main目錄提供了一個webapp資料夾,webapp資料夾下有一個WEB-INF資料夾,放置的是前端頁面的檔案,以及web.xml檔案。

除了模版提供的目錄結構,為了後面專案能成功執行,我們還需要新增一些資料夾,讓專案的目錄結構變成這樣:

用idea搭建SSM專案,原來這麼簡單

資料庫檔案

首先,先準備好資料庫檔案,並初始化一條記錄

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/beans
                        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                        http://www.springframework.org/schema/tx
                        http://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/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       http://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...

用idea搭建SSM專案,原來這麼簡單

選擇Tomcat Server - Local,

用idea搭建SSM專案,原來這麼簡單

編輯好專案的啟動資訊,包括專案名,jdk版本,tomcat以及埠

用idea搭建SSM專案,原來這麼簡單

選擇Deployment,新增Atifact,選擇第二項,否則Tomcat執行會報錯

用idea搭建SSM專案,原來這麼簡單

儲存後,啟動專案,成功後在瀏覽器輸入http://localhost:8080,返回結果如下:

用idea搭建SSM專案,原來這麼簡單

這是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 {

    @Resource
    private 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 {

    @Autowired
    private 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

用idea搭建SSM專案,原來這麼簡單

說明,我們成功訪問到了資料庫的內容。

至此,SSM專案的搭建大功告成,為了方便大家學習,我把原始碼放在了github上了,有需要的同學可以自行下載,地址:github.com/Taoxj/mvcDe…

相關文章