快速搭建SSM項目
開發環境:jdk1.8、服務器Tomcat8、項目管理工具apache-maven-3.6.0、MySQL數據庫
1、新建項目:
選擇【Maven】,勾選【Create from archetype】,選擇【maven-archetype-webapp】 (可以選擇jdk),具體如下圖:

填寫【GroupId】和【ArtifactId】等信息,具體如下圖:

在【Maven home directory】中選擇Maven的安裝路徑,在【User settings】和【Local repository】中選擇Maven的配置文件和倉庫的位置(盡量不要使用默認的位置,因為它是放在C盤,需要在Maven文件夾中創建一個文件夾repository),在【Properties】屬性列表中添加屬性名name:archetypeCatalog,Value:internal,具體如下圖:

點擊【Finish】,如下圖:

創建完成后,在/src/main目錄下創建java和resource目錄,將java標記為Sources Root、resource標記為Resources Root,具體如下:

2、集成Spring
在pom文件中添加Spring相關的依賴,具體代碼如下:
<properties>
<spring.version>5.0.5.RELEASE</spring.version>
</properties>
<!--spring start-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring end-->
在/src/main/resources目錄下創建applicationContext.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" 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"> <context:component-scan base-package="com"/>
<!-- <context:component-scan/>注解:掃描base-package包或者子包下所有的Java類,並把匹配的Java類注冊成Bean。這里我們設置成掃描com包下所有的Java類 -->
</beans>
在web.xml配置文件中添加如下代碼:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <!--<web-app>--> <display-name>Archetype Created Web Application</display-name>
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
</web-app>
3、集成Spring MVC框架
在pom.xml添加相關依賴,具體代碼如下:
<properties>
<javax.servlet.version>4.0.0</javax.servlet.version>
<jstl.version>1.2</jstl.version>
</properties>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${javax.servlet.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring mvc end-->
在web.xml配置文件中添加DispatcherServlet配置,具體代碼如下:
DispatcherServlet類:DispatcherServlet是前置控制器,主要用於攔截匹配的請求,攔截匹配規則要自己定義,把攔截下來的請求,依據相應的規則分發到目標Controller來處理。
<!-- 配置DispatcherServlet-->
<servlet>
<servlet-name>spring-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置SpringMVC需要加載的配置文件spring-mvc.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>
</servlet>
<servlet-mapping>
<servlet-name>spring-dispatcher</servlet-name>
<!--匹配以.do為后綴的所有請求 -->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
在/src/main/resources目錄下創建配置文件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" xmlns:aop="http://www.springframework.org/schema/aop" 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.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <!-- 掃描controller(后端控制器),並且掃描其中的注解 --> <context:component-scan base-package="com.controller"/> <!-- 設置配置方案--> <!--開啟注解--> <mvc:annotation-driven/>
<!-- 配置JSP 顯示ViewResolver(視圖解析器) --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
4、集成MyBatis框架
在pom.xml文件中添加相關依賴,具體代碼如下:
<properties>
<mybatis.version>3.4.6</mybatis.version>
<mysql.connector.java.version>8.0.9-rc</mysql.connector.java.version>
<druid.version>1.1.9</druid.version>
<mybatis.spring.version>1.3.2</mybatis.spring.version>
</properties>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.connector.java.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis.spring.version}</version>
</dependency>
<!-- mybatis end-->
在/src/main/resources目錄下創建jdbc.properties配置文件,具體代碼如下:
#驅動 jdbc.driverClassName=com.mysql.cj.jdbc.Driver #mysql連接信息 jdbc.url=jdbc:mysql://127.0.0.1:3306/goodsapplydb?serverTimezone=GMT #goodsapplydb為數據庫名稱
#用戶名 jdbc.username=root #密碼 jdbc.password=123456
在applicationContext.xml配置文件中添加如下配置,具體代碼如下:
<!-- 1、配置數據庫相關參數-->
<context:property-placeholder location="classpath:jdbc.properties" ignore-unresolvable="true"/>
<!-- 2、數據源druid-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 3、配置SqlSessionFactory對象-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入數據庫連接池-->
<property name="dataSource" ref="dataSource"/>
<!-- 掃描sql配置文件:mapper需要的xml文件-->
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<!-- 掃描basePackage下所有以@MyBatisDao注解的接口-->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="com.dao"/>
</bean>
5、集成Log4j日志框架
在pom.xml中添加相關依賴,具體代碼如下:
<properties>
<slf4j.version>1.7.7</slf4j.version>
<log4j.version>1.2.17</log4j.version>
</properties>
<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>
<!-- log4j2 end-->
在/src/main/resources目錄下創建log4j.properties配置文件,具體代碼如下:
#log levels log4j.rootLogger = DEBUG,Console #輸出到控制台 log4j.appender.Console = org.apache.log4j.ConsoleAppender log4j.appender.Console.Target = System.out log4j.appender.Console.layout = org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n
6、配置服務器
在IDEA開發菜單欄中,選擇【run】—>【Edit Configuration】,點擊【+】—>【Tomcat Server】—>【Local】,在【Aplication server】中選擇Tomcat的安裝路徑,在【JRE】中選擇JDK的安裝路徑。

點擊【Deployment】—>【+】—>【Artifact】

選擇 【下圖中選擇的】

下圖中畫紅線的地方 刪掉(我之前因為沒有刪掉 就總是報錯)

注意下圖畫紅線的地方,在【Deployment】配置好之后,改變下圖中的地方。設置這個的目的是:在修改一些東西之后就只需要在瀏覽器上面刷新一下就可以了,不需要改一點東西重新運行一下程序。

配置好服務器之后,就可以運行程序了。
結果如下圖:

下面開發一個比較復雜的畫面,將數據庫中的數據查詢出來顯示在畫面上
下圖為項目的目錄: 注意靜態資源文件,如css、js等,最好放在webapp目錄下面,之前我是放在WEB-INF下面,最后文件總是獲取不到

在model目錄下創建數據表的實體類
package com.model; import java.io.Serializable; public class goodsApply implements Serializable { //屬性首字母需小寫 否則在JSP畫面中獲取時,會報錯 private Integer id; private String goodsName; private String claimant; private String applyTime; private String unit; private Integer quantity; private Integer isApply; private String comment; public Integer getId() { return id; } public String getApplyTime() { return applyTime; } public String getClaimant() { return claimant; } public Integer getIsApply() { return isApply; } public String getGoodsName() { return goodsName; } public String getUnit() { return unit; } public Integer getQuantity() { return quantity; } public String getComment() { return comment; } public void setId(Integer id) { this.id = id; } public void setApplyTime(String applyTime) { this.applyTime = applyTime; } public void setClaimant(String claimant) { this.claimant = claimant; } public void setComment(String comment) { this.comment = comment; } public void setGoodsName(String goodsName) { this.goodsName = goodsName; } public void setIsApply(Integer isApply) { this.isApply = isApply; } public void setQuantity(Integer quantity) { this.quantity = quantity; } public void setUnit(String unit) { this.unit = unit; } }
在【dao】目錄下創建相應接口,該接口與之后的...mapper.xml文件有關
package com.dao; import com.model.goodsApply; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface GoodsApplyDao { List<goodsApply> findAll(); int delGoods(@Param("id") int id); goodsApply findGoodsById(@Param("id") int id); int addGoods(goodsApply goods); int updateGoods(goodsApply goods); }
在【mapper】目錄下創建與表相關的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">
<mapper namespace="com.dao.GoodsApplyDao">
<sql id="goodsApplyField">
${prefix}.id as "id",
${prefix}.goodsName as "goodsName",
${prefix}.claimant as "claimant",
${prefix}.applyTime as "applyTime",
${prefix}.unit as "unit",
${prefix}.quantity as "quantity",
${prefix}.isApply as "isApply",
${prefix}.comment as "comment"
</sql>
<!-- 獲取所有物品申請記錄-->
<resultMap id="goodsApplyMap" type="com.model.goodsApply">
<id property="id" column="id"/>
<id property="goodsName" column="goodsName"/>
<id property="claimant" column="claimant"/>
<id property="applyTime" column="applyTime"/>
<id property="unit" column="unit"/>
<id property="quantity" column="quantity"/>
<id property="isApply" column="isApply"/>
<id property="comment" column="comment"/>
</resultMap>
<!-- 下面的id與dao文件中的方法名稱相同 -->
<select id="findAll" resultMap="goodsApplyMap">
select
<include refid="goodsApplyField">
<property name="prefix" value="a"/>
</include>
from goodsApplyTb as a
</select>
<!-- 根據id刪除一條物品記錄-->
<delete id="delGoods" parameterType="int">
delete from goodsApplyTb
where id=#{id}
</delete>
<!-- 根據id查詢一條物品記錄-->
<select id="findGoodsById" resultMap="goodsApplyMap" parameterType="int">
select
<include refid="goodsApplyField">
<property name="prefix" value="a"/>
</include>
from goodsApplyTb as a
where id=#{id}
</select>
<!-- 新增一條記錄-->
<insert id="addGoods" useGeneratedKeys="true" keyProperty="id" parameterType="com.model.goodsApply">
insert into goodsApplyTb(goodsName,claimant,applyTime,unit,quantity,isApply,comment)
value(#{goodsName},#{claimant},#{applyTime},#{unit},#{quantity},#{isApply},#{comment})
</insert>
<!-- 修改一條記錄-->
<update id="updateGoods" parameterType="com.model.goodsApply">
update goodsApplyTb set
goodsName=#{goodsName},
claimant=#{claimant},
applyTime=#{applyTime},
unit=#{unit},
quantity=#{quantity},
isApply=#{isApply},
comment=#{comment}
where id=#{id}
</update>
</mapper>
在【service】目錄下創建相應的接口
package com.service; import com.model.goodsApply; import java.util.List; public interface GoodsApplyService { List<goodsApply> findAll(); int delGoods(int id); goodsApply findGoodsById(int id); int addGoods(goodsApply goods); int updateGoods(goodsApply goods); }
在【impl】目錄下創建相應的service接口的實現類
package com.service.impl; import com.dao.GoodsApplyDao; import com.model.goodsApply; import com.service.GoodsApplyService; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; @Service public class GoodsApplyServiceImpl implements GoodsApplyService { @Resource private GoodsApplyDao goodsApplyDao; public List<goodsApply> findAll(){ return goodsApplyDao.findAll(); } public int delGoods(int id){ return goodsApplyDao.delGoods(id); } public goodsApply findGoodsById(int id){ return goodsApplyDao.findGoodsById(id); } public int addGoods(goodsApply goods){ return goodsApplyDao.addGoods(goods); } public int updateGoods(goodsApply goods){ return goodsApplyDao.updateGoods(goods); } }
在【controller】目錄下創建controlle類
import com.model.goodsApply; import com.service.GoodsApplyService; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.List; import static java.lang.Integer.parseInt; @Controller public class GoodsApplyController { @Resource private GoodsApplyService goodsApplyService; @GetMapping("/goodsList.do") public ModelAndView findAll(){ List<goodsApply> goodsApplyList=goodsApplyService.findAll(); // for (goodsApply goods : goodsApplyList) { // System.out.println(goods.getClaimant()+"申請了"+goods.getGoodsName()); // } ModelAndView mv = new ModelAndView(); mv.addObject("goodsApplyList",goodsApplyList);
//將查詢到的數據返回到畫面
mv.setViewName("goodsList"); return mv; } }
下面是相應的jsp畫面
在index.jsp中直接跳轉到goodsList.jsp畫面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%> <% String path = request.getContextPath(); // http://localhost:8080 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML> <html> <head> <base href="<%=basePath%>"> <script type="text/javascript"> window.location = "<%=basePath%>goodsList.do"; </script> </head> <body> <h2>Hello World!</h2> </body> </html>
下面為goodsList.jsp畫面
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ page import="com.model.goodsApply" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path+"/"; %> <!DOCTYPE html> <html> <head> <%-- <base href="<%=basePath%>">--%> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>物品申請</title> <link rel="stylesheet" href="<%=path%>/css/goodsList.css"> <link href="<%=path%>/css/jquery-confirm.min.css" rel="stylesheet"> <script src="<%=path%>/js/jquery.min.js" type="text/javascript"></script> <script src="<%=path%>/js/jquery-confirm.min.js" type="text/javascript"></script> <script type="text/javascript"> //刪除操作 function del(obj) { $('.delete').confirm({ title: '提示!', content: '您確定要刪除這條數據?', type:'green', buttons: { 確定: function () { var id = $(obj).attr("rel"); window.location = "<%=basePath%>goodsDel.do?id=" + id; }, 取消: function () { // $.alert('取消!'); } } }); } // 跳轉新增頁面 function addGoods() { window.location="<%=basePath%>addGoods.do"; } // 修改記錄 function updateGoods(obj) { var id = $(obj).attr("rel"); window.location = "<%=basePath%>selectGoods.do?id=" + id; } </script> </head> <body> <div class="content"> <div> <input type="button" value="新增" class="button" onclick="addGoods()"> <input type="hidden" value="${delete_result}" id="del_result"> <input type="hidden" value="${insert_result}" id="ins_result"> <input type="hidden" value="${update_result}" id="upd_result"> </div> <table id="goodsContent"> <thead> <tr> <th class="table-goodsname">物品名稱</th> <th class="table-claimant">申領人</th> <th class="table-applyTime">申領時間</th> <th class="table-unit">單位</th> <th class="table-quantity">數量</th> <th class="table-isApply">已領</th> <th class="table-operate">操作</th> </tr> </thead> <tbody> <c:if test="${empty goodsApplyList}"> <tr> <td colspan="7" style="color: red"><b>沒有數據!</b></td> </tr> </c:if> <c:forEach var="goodsApply" items="${goodsApplyList}"> <tr> <td>${goodsApply.goodsName}</td> <td>${goodsApply.claimant}</td> <td>${goodsApply.applyTime}</td> <td>${goodsApply.unit}</td> <td>${goodsApply.quantity}</td> <td id="isApply">${goodsApply.isApply}</td> <td> <input type="hidden" value="${goodsApply.id}" id="goodsId"> <a href="javascript:void(0)" class="operate alter" id="update" rel="${goodsApply.id}" onclick="updateGoods(this)">修改</a> <a href="javascript:void(0)" class="operate delete" id="delete" rel="${goodsApply.id}" onclick="del(this)">刪除</a> </td> </tr> </c:forEach> </tbody> </table> </div> <script type="text/javascript"> var del_result = $('#del_result').val(); if(del_result==="success"){ alert("刪除成功!"); } if(del_result==="failed"){ alert("刪除失敗!"); } var ins_result=$('#ins_result').val(); if(ins_result==="success"){ alert("新增成功!"); } var upd_result = $('#upd_result').val(); if(upd_result==="success"){ alert("修改成功!"); } if(upd_result==="failed"){ alert("修改失敗!"); } $(document).ready(function () { $('#goodsContent tr').each(function () { var isApply=$(this).children('td:eq(5)').text(); if(isApply==="1"){ $(this).children('td:eq(5)').html('是'); // 當已經領用了的,不允許再刪除 把刪除按鈕禁用 $(this).children('td:eq(6)').find('#delete').css("cursor","default"); $(this).children('td:eq(6)').find('#delete').css("color","grey"); $(this).children('td:eq(6)').find('#delete').removeAttr("onclick"); } else { $(this).children('td:eq(5)').html('否'); } }); }); </script> </body> </html>
最后還需要改一下web.xml文件。
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <!--<web-app>-->
<!--將web-app改為上面的-->
如果不改,會是下圖這種情況

程序運行結果如下圖

該程序還有新增、修改以及刪除功能,具體可以下載全部程序查看
https://pan.baidu.com/s/15Jjrd4P6oWpa9gRLm2XLiQ
