ssm小型專案搭建(增刪改查功能)
Crud ssm 小型專案搭建
- 遇到問題
- 建立maven專案時pom檔案中<packaging>war</packing>報錯
原因:缺少相對應的web.xml檔案
解決辦法:右擊建立的maven專案,選擇properties下的Project Facets,先去掉Dynamic web Module,然後再重新新增,新增時注意選擇路徑.
- index頁面開啟之後是頁面原始碼,或執行程式碼無法進入到Controller中
原因:web.xml檔案中springmvc.xml檔案的作用路徑配置錯誤.
解決辦法:修改相應路徑.
- @ContextConfiguration無法使用
原因:編寫的測試類不在/src/test/java檔案下
解決辦法:右擊專案-選擇build path-source-將Contains test source 設定為yes.
Crud 流程
- 建立maven專案
建立成功後,如圖所示,pom.xml檔案會報錯,原因是缺少web.xml檔案:
解決辦法,如圖所示新增web.xml檔案:
- 匯入相關依賴:
<!-- spring MVC-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<!--spring JDBC 事務控制 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<!-- spring 面向切面 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.20.RELEASE</version>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.4</version>
</dependency>
<!-- spring-mybatis 適配 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!--資料庫,連線池包 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<!--驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--jstl servlet-api junit -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.17.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.7</version>
</dependency>
<!-- jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.6</version>
</dependency>
<!-- JSR303資料校驗 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.10.Final</version>
</dependency>
<!-- log4j相關依賴-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
- 編寫相關配置檔案,包括web.xml,spring.xml,springmvc.xml,spring-mybatis.xml等
- web.xml
<!-- spring -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- Bootstraps the root web application context before servlet initialization -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--spring-mvc 前端控制器 -->
<!-- The front controller of this Spring Web application, responsible for handling all application requests -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map all requests to the DispatcherServlet for handling -->
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--字元編碼過濾器,所有過濾器之前 -->
<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>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class> org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>HttpPutFormContentFilter</filter-name>
<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HttpPutFormContentFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- dbconfig.properties
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/ssm_crud?useSSL=true
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=root
- spring.xml
<context:component-scan base-package="com.ssm.maven"></context:component-scan>
<!--spring的配置檔案,主要配置和業務邏輯有關的 -->
<!--資料來源 事務控制 -->
<context:property-placeholder location="classpath:dbconfig.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--mybatis和spring -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:spring-mybatis.xml" />
<property name="mapperLocations"value="classpath:/com/ssm/maven/mapper/*.xml" />
</bean>
<!--配置掃描器:將mybatis介面加入到IOC容器中-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ssm.maven.mapper" />
</bean>
<!-- 配置批量插入sqlSession -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
<constructor-arg name="executorType" value="BATCH"/>
</bean>
<!-- 配置事務管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!--開始基於註解的配置,使用xml配置形式的事務(主要的都是使用配置式) -->
<aop:config>
<aop:pointcut expression="execution(public * com.ssm.maven.service..*(..))" id="txPoint"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>
</aop:config>
<!--配置事務增強,事務如何切入 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 切入的所有方法都是事務方法 -->
<tx:method name="*"/>
<!-- 切入的所有以get開始的方法都是事務方法 -->
<tx:method name="get" read-only="true"/>
</tx:attributes>
</tx:advice>
- springmvc.xml
<mvc:annotation-driven></mvc:annotation-driven>
<mvc:default-servlet-handler/>
<context:component-scan base-package="com.ssm.maven">
</context:component-scan>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
- spring-mybatis.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<package name="com.ssm.maven.pojo"/>
</typeAliases>
<!-- 分頁外掛 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!--使分頁資訊合理化引數 -->
<property name="reasonable" value="true"/>
</plugin>
</plugins>
</configuration>
- log4j.properties:列印日誌
### \u8BBE\u7F6E###
log4j.rootLogger = debug,stdout,D,E
### \u8F93\u51FA\u4FE1\u606F\u5230\u63A7\u5236\u62AC ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
- 用mybaties generator生成資料mapper,mapper.xml,pojo檔案
參考:
http://www.mybatis.org/generator/running/runningWithJava.html
- 引入bootstrap前端框架
- 查詢員工資訊編寫
- Index頁面直接傳送ajax請求進行員工分頁資料的查詢.
- 伺服器將查出的資料以json字串的形式返回給瀏覽器.
- 瀏覽器收到json字串,可以使用js對json進行解析,使用js通過dom增刪改,改變頁面.
- 返回json實現客戶端的無關性.
過程:
首頁-傳送ajax請求-ajax請求員工json資料-解析json資料-在頁面進行展示.
頁面展示:
- 增加員工資訊
- 在index.jsp頁面點選”新增”按鈕.
- 去資料庫查詢部門列表.
- 彈出新增模態框.(參考bootstrap中文文件元件)
<!-- Modal:增加員工模態框 -->
<div class="modal fade" id="myAddModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title" id="myModalLabel">增加員工</h4>
</div>
<div class="modal-body">
<form class="form-horizontal" id="add_form">
<div class="form-group" >
<label for="empName_input" class="col-sm-2 control-label">empName</label>
<div class="col-sm-10" id="add_empName_div">
<input type="text" name="empName" class="form-control" id="empName_input" placeholder="empName">
</div>
</div>
<div class="form-group">
<label for="email_add" class="col-sm-2 control-label">Email</label>
<div class="col-sm-10">
<input type="email" name="email" class="form-control" id="email_add" placeholder="Email">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">gender</label>
<div class="col-sm-10">
<label class="radio-inline">
<input type="radio" name="gender" id="gender_input_1" value="1"> 男
</label>
<label class="radio-inline">
<input type="radio" name="gender" id="gender_input_2" value="0"> 女
</label>
</div>
</div>
<div class="form-group">
<label for="add_select" class="col-sm-2 control-label">deptName</label>
<div class="col-sm-10">
<select class="form-control" name="dId" id="add_select">
</select>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">關閉</button>
<button type="button" class="btn btn-primary" id="add_save">儲存</button>
</div>
</div>
</div>
</div>
- 使用者輸入資料.
- 點選”儲存”按鈕,jquery前端校驗(使用者名稱是否合法等)或JSR303後端校驗(使用者名稱是否合法等),還有後端校驗使用者名稱是否重複等.
- 傳送ajax請求,完成儲存.
頁面展示:
注意:
使用者名稱是否重複與使用者名稱合法校驗資訊統一
模態框關閉之後,再次彈出,資訊重置
- 修改員工資訊
- 點選”編輯”按鈕.
- 在資料庫中查詢部門資訊,填充下拉列表.然後查詢員工資訊,選擇下拉列表內容.
- 彈出更新模態框.
- 修改使用者資訊,點選”儲存”按鈕.
- 進行資訊校驗,傳送ajax請求,完成儲存.
- 關閉模態框.
- 跳到當前頁
頁面展示:
注意:
Ajax同步:async:false:ajax傳送請求並得到返回結果,再進行下一步
Ajax非同步:async:true:ajax傳送請求,進行下一步
更新按鈕點選事件,傳送ajax請求,使用put請求時,需要配置HttpPutFormContentFilter過濾器.
- 刪除員工資訊
刪除單個員工:
- 點選單個刪除按鈕.
- 彈出是否確認刪除.
- 傳送ajax請求.
- 刪除資料.
- 成功,跳轉到最後一頁.
頁面展示:
刪除多個員工:
- 建立複選框,用於多選.
- 點選總刪除按鈕,彈出是否確認刪除.
- 確認,傳送ajax請求,刪除資料.
- 成功,跳轉到最後一頁.
頁面展示:
注意:
- 對於dom原生的屬性,用prop獲取屬性的值;attr獲取自定義屬性的值.eg.”checked”屬性值的讀取和設定,用prop.
- :checked 選擇器.匹配所有被選中的複選框.
- 程式碼
Index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<%
pageContext.setAttribute("APP_PATH",request.getContextPath());
%>
<script type="text/javascript" src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
<link href="${APP_PATH}/static/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">
<script src="${APP_PATH}/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</head>
<body>
<!-- Modal:增加員工模態框 -->
<div class="modal fade" id="myAddModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title" id="myModalLabel">增加員工</h4>
</div>
<div class="modal-body">
<form class="form-horizontal" id="add_form">
<div class="form-group" >
<label for="empName_input" class="col-sm-2 control-label">empName</label>
<div class="col-sm-10" id="add_empName_div">
<input type="text" name="empName" class="form-control" id="empName_input" placeholder="empName">
</