1. 程式人生 > >ssm小型專案搭建(增刪改查功能)

ssm小型專案搭建(增刪改查功能)

Crud ssm 小型專案搭建

  • 遇到問題
  1. 建立maven專案時pom檔案中<packaging>war</packing>報錯

原因:缺少相對應的web.xml檔案

解決辦法:右擊建立的maven專案,選擇properties下的Project Facets,先去掉Dynamic web Module,然後再重新新增,新增時注意選擇路徑.

  1. index頁面開啟之後是頁面原始碼,或執行程式碼無法進入到Controller中

原因:web.xml檔案中springmvc.xml檔案的作用路徑配置錯誤.

解決辦法:修改相應路徑.

  1. @ContextConfiguration無法使用

原因:編寫的測試類不在/src/test/java檔案下

解決辦法:右擊專案-選擇build path-source-將Contains test source 設定為yes.

   

 

 

 

Crud 流程

  1. 建立maven專案

建立成功後,如圖所示,pom.xml檔案會報錯,原因是缺少web.xml檔案:

解決辦法,如圖所示新增web.xml檔案:

  1. 匯入相關依賴:

<!--  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>

  1. 編寫相關配置檔案,包括web.xml,spring.xml,springmvc.xml,spring-mybatis.xml
  1. 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>

 

  1. dbconfig.properties

jdbc.jdbcUrl=jdbc:mysql://localhost:3306/ssm_crud?useSSL=true

jdbc.driverClass=com.mysql.jdbc.Driver

jdbc.user=root

jdbc.password=root

  1. 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>

  1. 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>

  1. 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>

  1. 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

  1. 用mybaties generator生成資料mapper,mapper.xml,pojo檔案

參考:

http://www.mybatis.org/generator/running/runningWithJava.html

  1. 引入bootstrap前端框架

  1. 查詢員工資訊編寫
  1. Index頁面直接傳送ajax請求進行員工分頁資料的查詢.
  2. 伺服器將查出的資料以json字串的形式返回給瀏覽器.
  3. 瀏覽器收到json字串,可以使用js對json進行解析,使用js通過dom增刪改,改變頁面.
  4. 返回json實現客戶端的無關性.

過程:

首頁-傳送ajax請求-ajax請求員工json資料-解析json資料-在頁面進行展示.

頁面展示:

  1. 增加員工資訊
  1. 在index.jsp頁面點選”新增”按鈕.
  2. 去資料庫查詢部門列表.
  3. 彈出新增模態框.(參考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>

  1. 使用者輸入資料.
  2. 點選”儲存”按鈕,jquery前端校驗(使用者名稱是否合法等)或JSR303後端校驗(使用者名稱是否合法等),還有後端校驗使用者名稱是否重複等.
  3. 傳送ajax請求,完成儲存.

頁面展示:

注意:

使用者名稱是否重複與使用者名稱合法校驗資訊統一

模態框關閉之後,再次彈出,資訊重置

  1. 修改員工資訊
  1. 點選”編輯”按鈕.
  2. 在資料庫中查詢部門資訊,填充下拉列表.然後查詢員工資訊,選擇下拉列表內容.
  3. 彈出更新模態框.
  4. 修改使用者資訊,點選”儲存”按鈕.
  5. 進行資訊校驗,傳送ajax請求,完成儲存.
  6. 關閉模態框.
  7. 跳到當前頁

頁面展示:

注意:

Ajax同步:async:false:ajax傳送請求並得到返回結果,再進行下一步

Ajax非同步:async:true:ajax傳送請求,進行下一步

更新按鈕點選事件,傳送ajax請求,使用put請求時,需要配置HttpPutFormContentFilter過濾器.

  1. 刪除員工資訊

刪除單個員工:

  1. 點選單個刪除按鈕.
  2. 彈出是否確認刪除.
  3. 傳送ajax請求.
  4. 刪除資料.
  5. 成功,跳轉到最後一頁.

頁面展示:

刪除多個員工:

  1. 建立複選框,用於多選.
  2. 點選總刪除按鈕,彈出是否確認刪除.
  3. 確認,傳送ajax請求,刪除資料.
  4. 成功,跳轉到最後一頁.

頁面展示:

注意:

  1. 對於dom原生的屬性,用prop獲取屬性的值;attr獲取自定義屬性的值.eg.”checked”屬性值的讀取和設定,用prop.
  2. :checked 選擇器.匹配所有被選中的複選框.
  1. 程式碼

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

    </