任務驅動 搭建SSM開發環境

本篇主要闡述(IntelliJ IDEA + Maven + Spring + Spring MVC + Mybatis)搭建

爲何想要搭建ssm?

  近期正好本身有一個小的點子要實現,剛好這學期開了java web的課,也算是略懂一些,因此技術方案採用java作後端,使用ssm框架。前幾天把需求簡單分析了一下,喏,僅僅紙上談兵對程序員來講可不是一個好的習慣,因此準備整合一下ssm框架,供後期編碼作地基。html

遇到的問題:

  不得不說,百度的東西魚龍混雜,看了幾篇博客,最終都沒能搭建一個完整的ssm環境。不是這有問題就是那有問題。一想到這裏就氣,不過氣歸氣,想到可能之後也會有好多人也會像我同樣遇到相似的狀況,但又得不到一個有效的指導,往嚴重了說,可能就此 一個夢想成爲大牛的童鞋就此隕落🤨,因此,我決定本身再堅持搞一搞,而後出一篇文章,但願將來能夠幫助到須要幫助的童鞋。java

本教程思路:

  本文采用任務驅動方式來搭建ssm開發環境,這樣能夠更加清晰的瞭解整個流程,且目標性更強,使得整個流程更爲連貫,方便理解。mysql

任務:程序員

  使用ssm框架實現簡單的用戶信息的增刪查改(數據庫採用Mysql)web

紙上得來終覺淺,說幹就幹:

  1.  首先,在本地建立一個數據庫名爲SSM,而後在庫中建張user表,具體以下:spring

 1 -- ----------------------------
 2 --  Table structure for `user`
 3 -- ----------------------------
 4 DROP TABLE IF EXISTS `user`;
 5 CREATE TABLE `user` (
 6   `id` int(11) NOT NULL AUTO_INCREMENT,
 7   `name` varchar(255) DEFAULT NULL,
 8   `password` varchar(255) DEFAULT NULL,
 9   PRIMARY KEY (`id`)
10 ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

  如圖,sql

 

    那麼,準備工做結束後,咱們便開始正式的環境搭建。數據庫

  2.  打開IDEA,點擊建立新項目,如圖apache

  而後,按圖中標註的序號選擇Maven,並勾選「Create from  archetype」,選擇「 ................22-archetype-webapp」,最後Next,如圖json

而後填寫Groupid和artifactid,如圖

名詞解釋:

而後下一步,這裏引用另外一位博主的說法,我沒作測試,你們能夠作個參考

引用:   這裏須要注在Properties中添加一個參數 archetypeCatalog=internal,不加這個參數,在maven生成骨架的時候將會很是慢,有時候直接卡住。來自網上的解釋:
archetypeCatalog表示插件使用的archetype元數據,不加這個參數時默認爲remote,local,即中央倉庫archetype元數據,因爲中央
倉庫的archetype太多了因此致使很慢,指定internal來表示僅使用內部元數據。

 

我直接下一步,這裏會讓你輸入項目名詞和存儲路徑,用默認的就OK。

點擊Finish,完成建立。

  3.  建立完成後,默認的目錄結構如圖:

  因此,咱們須要從新編排一下項目的結構,更改後以下:

這裏,各個文件夾及包的意義已經在圖中作簡要說明,若不理解,請自行學習。

至此,項目的基本框架已經搭建完成,接下來咱們繼續學習 使用maven來集成ssm框架。

  4.  這裏咱們使用maven類管理jar包,和他們之間的依賴(自行了解maven相關知識),下面咱們來編輯項目下的pom.xml文件

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 
  3 <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/maven-v4_0_0.xsd">  
  4 
  5 
  6   <modelVersion>4.0.0</modelVersion>
  7   <packaging>war</packaging>
  8 
  9   <name>SSMTest</name>
 10   <groupId>com.xykj</groupId>
 11   <artifactId>SSMTest</artifactId>
 12   <version>1.0-SNAPSHOT</version>
 13 
 14   <build>
 15     <plugins>
 16       <plugin>
 17         <groupId>org.mortbay.jetty</groupId>
 18         <artifactId>maven-jetty-plugin</artifactId>
 19         <version>6.1.7</version>
 20         <configuration>
 21           <connectors>
 22             <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
 23               <port>8888</port>
 24               <maxIdleTime>30000</maxIdleTime>
 25             </connector>
 26           </connectors>
 27           <webAppSourceDirectory>${project.build.directory}/${pom.artifactId}-${pom.version}</webAppSourceDirectory>
 28           <contextPath>/</contextPath>
 29         </configuration>
 30       </plugin>
 31     </plugins>
 32   </build>
 33 
 34 
 35 <properties>
 36     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 37     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 38 
 39     <!-- spring版本號 -->
 40     <spring.version>4.2.5.RELEASE</spring.version>
 41 
 42     <!-- mybatis版本號 -->
 43     <mybatis.version>3.2.8</mybatis.version>
 44 
 45     <!-- mysql驅動版本號 -->
 46     <mysql-driver.version>5.1.29</mysql-driver.version>
 47 
 48     <!-- log4j日誌包版本號 -->
 49     <!--<slf4j.version>1.7.18</slf4j.version>-->
 50     <!--<log4j.version>1.2.17</log4j.version>-->
 51     <!--暫時 用不到-->
 52   </properties>
 53 
 54   <dependencies>
 55     <!--dependency>
 56       <groupId>com.xykj</groupId>
 57       <artifactId>[the artifact id of the block to be mounted]</artifactId>
 58       <version>1.0-SNAPSHOT</version>
 59     </dependency-->
 60 
 61     <!-- 添加junit4依賴 -->
 62     <dependency>
 63       <groupId>junit</groupId>
 64       <artifactId>junit</artifactId>
 65       <version>4.11</version>
 66       <!-- 指定範圍,在測試時纔會加載 -->
 67       <scope>test</scope>
 68     </dependency>
 69 
 70     <!-- 添加spring核心依賴 -->
 71     <dependency>
 72       <groupId>org.springframework</groupId>
 73       <artifactId>spring-core</artifactId>
 74       <version>${spring.version}</version>
 75     </dependency>
 76     <dependency>
 77       <groupId>org.springframework</groupId>
 78       <artifactId>spring-web</artifactId>
 79       <version>${spring.version}</version>
 80     </dependency>
 81     <dependency>
 82       <groupId>org.springframework</groupId>
 83       <artifactId>spring-oxm</artifactId>
 84       <version>${spring.version}</version>
 85     </dependency>
 86     <dependency>
 87       <groupId>org.springframework</groupId>
 88       <artifactId>spring-tx</artifactId>
 89       <version>${spring.version}</version>
 90     </dependency>
 91     <dependency>
 92       <groupId>org.springframework</groupId>
 93       <artifactId>spring-jdbc</artifactId>
 94       <version>${spring.version}</version>
 95     </dependency>
 96     <dependency>
 97       <groupId>org.springframework</groupId>
 98       <artifactId>spring-webmvc</artifactId>
 99       <version>${spring.version}</version>
100     </dependency>
101     <dependency>
102       <groupId>org.springframework</groupId>
103       <artifactId>spring-context</artifactId>
104       <version>${spring.version}</version>
105     </dependency>
106     <dependency>
107       <groupId>org.springframework</groupId>
108       <artifactId>spring-context-support</artifactId>
109       <version>${spring.version}</version>
110     </dependency>
111     <dependency>
112       <groupId>org.springframework</groupId>
113       <artifactId>spring-aop</artifactId>
114       <version>${spring.version}</version>
115     </dependency>
116 
117     <dependency>
118       <groupId>org.springframework</groupId>
119       <artifactId>spring-test</artifactId>
120       <version>${spring.version}</version>
121     </dependency>
122 
123     <!-- 添加mybatis依賴 -->
124     <dependency>
125       <groupId>org.mybatis</groupId>
126       <artifactId>mybatis</artifactId>
127       <version>${mybatis.version}</version>
128     </dependency>
129 
130     <!-- 添加mybatis/spring整合包依賴 -->
131     <dependency>
132       <groupId>org.mybatis</groupId>
133       <artifactId>mybatis-spring</artifactId>
134       <version>1.2.2</version>
135     </dependency>
136 
137     <!-- 添加mysql驅動依賴 -->
138     <dependency>
139       <groupId>mysql</groupId>
140       <artifactId>mysql-connector-java</artifactId>
141       <version>${mysql-driver.version}</version>
142     </dependency>
143     <!-- 添加數據庫鏈接池依賴 -->
144     <dependency>
145       <groupId>commons-dbcp</groupId>
146       <artifactId>commons-dbcp</artifactId>
147       <version>1.2.2</version>
148     </dependency>
149 
150     <!--添加jackson-->
151     <dependency>
152       <groupId>com.fasterxml.jackson.core</groupId>
153       <artifactId>jackson-databind</artifactId>
154       <version>2.7.0</version>
155     </dependency>
156 
157     <dependency>
158       <groupId>commons-io</groupId>
159       <artifactId>commons-io</artifactId>
160       <version>1.3.2</version>
161     </dependency>
162 
163     <dependency>
164       <groupId>commons-fileupload</groupId>
165       <artifactId>commons-fileupload</artifactId>
166       <version>1.2.1</version>
167     </dependency>
168 
169 
170 
171   </dependencies>

以上,就是咱們項目中用到的組件,只須要在<dependency>標籤中引入maven就會自動幫咱們引入並管理。

  5.  接下來,咱們在resource文件夾下,新建新建jdbc.properties文件,具體以下:

模板以下,相關參數,請自行更改:

driverClasss=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/SSM?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
username=root
password=admin

#定義初始鏈接數
initialSize=0
#定義最大鏈接數
maxActive=20
#定義最大空閒
maxIdle=20
#定義最小空閒
minIdle=1
#定義最長等待時間
maxWait=60000

  6. 緊接着,在resource文件夾下,繼續新建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:p="http://www.springframework.org/schema/p"
       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-4.0.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-4.0.xsd
                        http://www.springframework.org/schema/mvc
                        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

    <!-- 自動掃描  @Controller-->
    <context:component-scan base-package="com.xykj.controller"/>

    <!--避免IE執行AJAX時,返回JSON出現下載文件 -->
    <bean id="mappingJacksonHttpMessageConverter"
          class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
            </list>
        </property>
    </bean>
    <!-- 啓動SpringMVC的註解功能,完成請求和註解POJO的映射 -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="mappingJacksonHttpMessageConverter"/> <!-- JSON轉換器 -->
            </list>
        </property>
    </bean>


    <!-- 定義跳轉的文件的先後綴 ,視圖模式配置 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/" />
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- 文件上傳配置 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 默認編碼 -->
        <property name="defaultEncoding" value="UTF-8"/>
        <!-- 上傳文件大小限制爲31M,31*1024*1024 -->
        <property name="maxUploadSize" value="32505856"/>
        <!-- 內存中的最大值 -->
        <property name="maxInMemorySize" value="4096"/>
    </bean>
</beans>

  7.  繼續在resource下,新建spring和mybatis整合所需的配置文件,名爲spring-mybatis.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:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd
                        http://www.springframework.org/schema/tx
                        http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 開啓組件掃描 -->
    <context:component-scan base-package="com.xykj.blog"/>

    <!-- 第一種方式:加載一個properties文件 -->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:jdbc.properties"/>
    </bean>


    <!-- 第二種方式:加載多個properties文件
    <bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="locations">
            <list>
                <value>classpath:jdbc.properties</value>
                <value>classpath:common.properties</value>
            </list>
        </property>
        <property name="fileEncoding" value="UTF-8"/>
    </bean>
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
        <property name="properties" ref="configProperties"/>
    </bean>
    -->

    <!-- 配置數據源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
          destroy-method="close">
        <property name="driverClassName" value="${driverClasss}"/>
        <property name="url" value="${jdbcUrl}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
        <!-- 初始化鏈接大小 -->
        <property name="initialSize" value="${initialSize}"></property>
        <!-- 鏈接池最大數量 -->
        <property name="maxActive" value="${maxActive}"></property>
        <!-- 鏈接池最大空閒 -->
        <property name="maxIdle" value="${maxIdle}"></property>
        <!-- 鏈接池最小空閒 -->
        <property name="minIdle" value="${minIdle}"></property>
        <!-- 獲取鏈接最大等待時間 -->
        <property name="maxWait" value="${maxWait}"></property>
    </bean>

    <!-- mybatis和spring完美整合,不須要mybatis的配置映射文件 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!-- 自動掃描mapping.xml文件 -->
        <property name="mapperLocations" value="classpath:sql/*.xml"></property>
    </bean>

    <!-- DAO接口所在包名,Spring會自動查找其下的類 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.xykj.dao"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>


    <!-- (事務管理)transaction manager, use JtaTransactionManager for global tx -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- (事務管理)transaction manager, use JtaTransactionManager for global tx -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
</beans>

  8.  web.xml配置,以下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-mybatis.xml</param-value>
  </context-param>

 <!-- 編碼過濾器 -->
  <filter>
    <filter-name>encodingFilter</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>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>


 <!-- spring監聽器 -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <!-- 防止spring內存溢出監聽器,好比quartz -->
  <!-- 話說這個我也不知道幹嗎的 -->
  <listener>
    <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
  </listener>


  <!-- spring mvc servlet-->
  <servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <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>
    <!-- 此處也能夠配置成 *.do 形式 -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>


  <welcome-file-list>
    <welcome-file>/index.jsp</welcome-file>
  </welcome-file-list>

  <!-- session配置 -->
  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

</web-app>

忘記上這張圖,進入File -> Project Structure,把對應文件夾,修改爲,我這個樣子:

 

  9.  配置tomcat,步驟以下:

而後,點擊窗口左上角➕,配置一個本地tomcat server

選擇第一個,跳轉到以下界面,點擊OK。

  10.  tomcat配置完成後,在entity包下新建一個User實體類,以下:

User類代碼:

package com.xykj.entity;

import java.io.Serializable;

public class User implements Serializable{

    private int id;
    private String name;
    private String password;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User [id= " + id + " ,name= " + name + " ,password= " + password + " ]";
    }
}

接着,咱們在dao包下新增一個接口,名爲:UserDao

UserDao代碼以下:

package com.xykj.dao;

import com.xykj.entity.User;

public interface UserDao {
    public User findByUserId(int id);
}

而後,在resource下的sql包下新建一個UserMapper.xml文件,具體以下:

<?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">

<mapper namespace="com.xykj.dao.UserDao">
    <select id="findByUserId" parameterType="int" resultType="com.xykj.entity.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>

好嘞,到這裏,咱們就能夠簡單的測試一下咱們的增刪查改功能了,固然,咱們的例子是findByUserId,按id查詢,那麼咱們先在數據庫中增長一條記錄。

而後,在test文件夾下新建一個測試類,名爲TestUserDao,如圖:

TestUserDao代碼以下:

import com.xykj.dao.UserDao;
import com.xykj.entity.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestUserDao {

    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-mybatis.xml");
    UserDao userDao = applicationContext.getBean(UserDao.class);

    @Test
    public void test1(){
        User user = userDao.findByUserId(1);
        System.out.println(user);
    }

}

這裏,咱們使用了Junit的單元測試,詳情請自行了解。

運行test(),輸出:

說明咱們的mybatis和spring的整合已經完成。

  11.  接下來咱們繼續測試spring及spring mvc

  一樣的方法,咱們來編寫service層及其單元測試

  首先,在service包下,新建接口UserService,以下

代碼爲:

package com.xykj.service;

import com.xykj.entity.User;
import org.springframework.stereotype.Service;

@Service
public interface UserService {
    //查詢User
    User queryUser(int id);
}

而後,繼續在service包下,新建一個該接口的實現類UserServiceImp,以下:

代碼爲:

package com.xykj.service;

import com.xykj.dao.UserDao;
import com.xykj.entity.User;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class UserServiceImp implements UserService {

    @Resource
    private UserDao userDao;

    public User queryUser(int id) {
        User user = userDao.findByUserId(id);
        return user;
    }
}

到這裏以後,咱們在test目錄下,新建測試類TestUserService,以下

代碼爲:

import com.xykj.entity.User;
import com.xykj.service.UserService;
import com.xykj.service.UserServiceImp;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestUserService {

    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-mybatis.xml");
    UserService userService = applicationContext.getBean(UserService.class);

    @Test
    public void test1(){
        User user = userService.queryUser(1);
        System.out.println(user);
    }

}

運行,獲得以下結果,則成功,不然檢查上述操做是否有誤

👌,到了這步,其實咱們的spring已經測試完成了。在這過程當中,咱們使用的註解和自動注入等spring功能均可正常使用。

  12.  13

首先,咱們在controller包下新建一個類,如圖:

代碼爲:

package com.xykj.controller;

import com.xykj.entity.User;
import com.xykj.service.UserService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;

@Controller
@RequestMapping("/test")
public class UserController {

    @Resource
    private UserService userService;

    @ResponseBody
    @RequestMapping(method = RequestMethod.GET)
    public User func(){
        User user = userService.queryUser(1);
        return user;
    }

}

👌,接下來咱們在webapp目錄下新建一個index.jsp文件(默認啓動該頁面),編寫該頁面測試UserController,進而測試spring mvc.

不過在這以前,請先將UserController的func()方法添加一個參數,更改以下:

index.jsp以下:

  13.  最後,咱們啓動tomcat服務器,進行最後的測試:

輸入1,點擊提交

見到改返回,那麼一切大功告成。

但願你們遇到什麼問題,能夠在留言區留言,有時間的話會第一時間給予解答😁

相關文章
相關標籤/搜索