使用Maven构建SSM加CRUD功能

使用Maven构建SSM加CRUD功能

  • 项目结构
      • 1. 创建Maven项目,并在pom.xml导入依赖
      • 2. 编写web.xml文件
      • 3. 编写Spring的配置文件(我这里叫applicationContext.xml)
    • 引入命名空间 aop,beans,context,tx,
      • 5. 编写SpringMVC的配置文件(我这里叫springmvc.xml)
    • 引入命名空间 beans,context,mvc,
      • 6. 编写mybatis配置文件(我这里叫mybatis-config.xml)
      • 7. 编写数据库的配置信息(我用的是c3p0)c3p0.properties
      • 8. 创建数据库
      • 9. 使用mybatis逆向工程,根据数据库生成实体类
            • 1.要使用这个先导入依赖
            • 2.在项目下创建xml文件(我这里叫mbg.xml)
            • 3在项目下创建xml文件(我这里叫mbg.xml)
            • 4.编写一个Test运行写好的mybatis逆向工程(这个不用理解,直接复制粘贴就好)
            • 5.运行完成就会生成对应的实体类,mapper.xml,和接口。
            • 6.这个是逆向工程生成的mapper解释 https://www.cnblogs.com/luckypo/p/7356278.html
      • 10. 使用 Bootstrap构建CRUD页面
            • 导入Bootstrap的压缩文件,引入jquery压缩文件
            • Bootstrap下载:https://v3.bootcss.com/getting-started/#download
            • Bootstrap的使用说明:https://v3.bootcss.com/css/
      • 11. 创建jsp文件 在里面引用bootstrap
            • 我使用了Ajax做CRUD
      • 12. 写一个通用的JSON返回类
      • 13. controller类
            • 1.DepartmentController.java
            • 2.EmployeeController.java
      • 14. Service类
            • 1.DepartmentService.java
            • 2.EmployeeService.java
  • 到此SSM-CRUD就全部完成了,代码很多,对于有一定基础的人来说,这些代码可以给你提供一个新的写法,一些新的技巧
  • 谢谢
  • 需要源码的话可以联系我

项目结构

使用Maven构建SSM加CRUD功能_第1张图片

1. 创建Maven项目,并在pom.xml导入依赖

<properties>
		
		<spring.version>4.3.9.RELEASEspring.version>
		
		<mybatis.version>3.4.1mybatis.version>
		
		<slf4j.version>1.7.7slf4j.version>
		<log4j.version>1.2.17log4j.version>
	properties>
	<dependencies>
       
		<dependency>
			<groupId>com.github.pagehelpergroupId>
			<artifactId>pagehelperartifactId>
			<version>5.0.0version>
		dependency>
		<dependency>
			<groupId>com.mchangegroupId>
			<artifactId>mchange-commons-javaartifactId>
			<version>0.2.12version>
		dependency>
		<dependency>
			<groupId>org.springframeworkgroupId>
			<artifactId>spring-aspectsartifactId>
			<version>4.3.9.RELEASEversion>
		dependency>
		<dependency>
			<groupId>junitgroupId>
			<artifactId>junitartifactId>
			<version>4.12version>
			
			<scope>testscope>
		dependency>
		
		<dependency>
			<groupId>c3p0groupId>
			<artifactId>c3p0artifactId>
			<version>0.9.1.2version>
		dependency>

		
		
		<dependency>
			<groupId>org.mybatis.generatorgroupId>
			<artifactId>mybatis-generator-coreartifactId>
			<version>1.3.5version>
		dependency>
		
		
		<dependency>
		    <groupId>org.hibernategroupId>
		    <artifactId>hibernate-validatorartifactId>
		    <version>5.4.1.Finalversion>
		dependency>
		
		
		<dependency>
			<groupId>org.springframeworkgroupId>
			<artifactId>spring-coreartifactId>
			<version>${spring.version}version>
		dependency>

		<dependency>
			<groupId>org.springframeworkgroupId>
			<artifactId>spring-webartifactId>
			<version>${spring.version}version>
		dependency>
		<dependency>
			<groupId>org.springframeworkgroupId>
			<artifactId>spring-oxmartifactId>
			<version>${spring.version}version>
		dependency>
		<dependency>
			<groupId>org.springframeworkgroupId>
			<artifactId>spring-txartifactId>
			<version>${spring.version}version>
		dependency>

		<dependency>
			<groupId>org.springframeworkgroupId>
			<artifactId>spring-jdbcartifactId>
			<version>${spring.version}version>
		dependency>

		<dependency>
			<groupId>org.springframeworkgroupId>
			<artifactId>spring-webmvcartifactId>
			<version>${spring.version}version>
		dependency>
		<dependency>
			<groupId>org.springframeworkgroupId>
			<artifactId>spring-aopartifactId>
			<version>${spring.version}version>
		dependency>

		<dependency>
			<groupId>org.springframeworkgroupId>
			<artifactId>spring-context-supportartifactId>
			<version>${spring.version}version>
		dependency>

		<dependency>
			<groupId>org.springframeworkgroupId>
			<artifactId>spring-testartifactId>
			<version>${spring.version}version>
		dependency>
		
		<dependency>
			<groupId>org.mybatisgroupId>
			<artifactId>mybatisartifactId>
			<version>${mybatis.version}version>
		dependency>
		
		<dependency>
			<groupId>org.mybatisgroupId>
			<artifactId>mybatis-springartifactId>
			<version>1.3.1version>
		dependency>
		
		<dependency>
			<groupId>javaxgroupId>
			<artifactId>javaee-apiartifactId>
			<version>7.0version>
		dependency>
		<dependency>
			<groupId>javax.servletgroupId>
			<artifactId>javax.servlet-apiartifactId>
			<version>4.0.0version>
			<scope>providedscope>
		dependency>
		
		<dependency>
			<groupId>mysqlgroupId>
			<artifactId>mysql-connector-javaartifactId>
			<version>5.1.30version>
		dependency>
		
		<dependency>
			<groupId>commons-dbcpgroupId>
			<artifactId>commons-dbcpartifactId>
			<version>1.2.2version>
		dependency>
		
		<dependency>
			<groupId>jstlgroupId>
			<artifactId>jstlartifactId>
			<version>1.2version>
		dependency>
		
		
		<dependency>
			<groupId>log4jgroupId>
			<artifactId>log4jartifactId>
			<version>${log4j.version}version>
		dependency>


		
		<dependency>
			<groupId>com.alibabagroupId>
			<artifactId>fastjsonartifactId>
			<version>1.1.41version>
		dependency>


		<dependency>
			<groupId>org.slf4jgroupId>
			<artifactId>slf4j-apiartifactId>
			<version>${slf4j.version}version>
		dependency>

		<dependency>
			<groupId>org.slf4jgroupId>
			<artifactId>slf4j-log4j12artifactId>
			<version>${slf4j.version}version>
		dependency>
		
		
		
		
		<dependency>
		    <groupId>com.fasterxml.jackson.coregroupId>
		    <artifactId>jackson-databindartifactId>
		    <version>2.8.8version>
		dependency>		
		<dependency>
			<groupId>org.codehaus.jacksongroupId>
			<artifactId>jackson-mapper-aslartifactId>
			<version>1.9.13version>
		dependency>
		
		<dependency>
			<groupId>commons-fileuploadgroupId>
			<artifactId>commons-fileuploadartifactId>
			<version>1.3.1version>
		dependency>
		<dependency>
			<groupId>commons-iogroupId>
			<artifactId>commons-ioartifactId>
			<version>2.4version>
		dependency>
		<dependency>
			<groupId>commons-codecgroupId>
			<artifactId>commons-codecartifactId>
			<version>1.9version>
		dependency>
	dependencies>

2. 编写web.xml文件


	
	<context-param>
		<param-name>contextConfigLocationparam-name>
		<param-value>classpath:applicationContext.xmlparam-value>
	context-param>

	
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
	listener>

	
	
	<servlet>
		<servlet-name>dispatcherServletservlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
		<init-param>
			<param-name>contextConfigLocationparam-name>
			<param-value>classpath:springmvc.xmlparam-value>
		init-param>
		<load-on-startup>1load-on-startup>
	servlet>

	
	<servlet-mapping>
		<servlet-name>dispatcherServletservlet-name>
		<url-pattern>/url-pattern>
	servlet-mapping>

	
	<filter>
		<filter-name>CharacterEncodingFilterfilter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
		<init-param>
			<param-name>encodingparam-name>
			<param-value>utf-8param-value>
		init-param>
		
		<init-param>
			<param-name>forceRequestEncodingparam-name>
			<param-value>trueparam-value>
		init-param>
		<init-param>
			<param-name>forceResponseEncodingparam-name>
			<param-value>trueparam-value>
		init-param>
	filter>

	<filter-mapping>
		<filter-name>CharacterEncodingFilterfilter-name>
		<url-pattern>/*url-pattern>
	filter-mapping>
	
	
	<filter>
		<filter-name>HiddenHttpMethodFilterfilter-name>
		<filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
	filter>
	
	<filter-mapping>
		<filter-name>HiddenHttpMethodFilterfilter-name>
		<url-pattern>/*url-pattern>
	filter-mapping>
	
	<filter>
		<filter-name>HttpPutFormContentFilterfilter-name>
		<filter-class>org.springframework.web.filter.HttpPutFormContentFilterfilter-class>
	filter>
	<filter-mapping>
		<filter-name>HttpPutFormContentFilterfilter-name>
		<url-pattern>/*url-pattern>
	filter-mapping>

3. 编写Spring的配置文件(我这里叫applicationContext.xml)

引入命名空间 aop,beans,context,tx,

<context:component-scan base-package="com.ns">
		
		<context:exclude-filter type="annotation"
			expression="org.springframework.stereotype.Controller" />
	context:component-scan>
	
	
	<context:property-placeholder location="classpath:c3p0.properties" />

	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="${jdbc.driver}">property>
		<property name="jdbcUrl" value="${jdbc.url}">property>
		<property name="user" value="${jdbc.username}">property>
		<property name="password" value="${jdbc.password}">property>
	bean>


	
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		
		<property name="configLocation" value="classpath:mybatis-config.xml">property>
		<property name="dataSource" ref="dataSource">property>
		
		<property name="mapperLocations" value="classpath:mapper/*.xml">property>
	bean>

	
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		
		<property name="basePackage" value="com.ns.dao">property>
	bean>
	
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory">constructor-arg>
		
		<constructor-arg name="executorType" value="BATCH">constructor-arg>
	bean>

	

	
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		
		<property name="dataSource" ref="dataSource">property>
	bean>

	
	<tx:annotation-driven transaction-manager="transactionManager" />

	
	<aop:config>
		
		<aop:pointcut expression="execution(* com.ns.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="*" />
			
			<tx:method name="get*" read-only="true" />
		tx:attributes>
	tx:advice>

	

5. 编写SpringMVC的配置文件(我这里叫springmvc.xml)

引入命名空间 beans,context,mvc,

	
	<context:component-scan base-package="com.ns" use-default-filters="false">
		
		<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
		
		<context:exclude-filter type="annotation"
			expression="org.springframework.stereotype.Service" />
	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>
	
	
	
	<mvc:default-servlet-handler/>
	
	<mvc:annotation-driven />

6. 编写mybatis配置文件(我这里叫mybatis-config.xml)



<configuration>
	<settings>
		<setting name="mapUnderscoreToCamelCase" value="true" />
	settings>

	<typeAliases>
		<package name="com.ns.pojo" />
	typeAliases>
    
	<plugins>
		<plugin interceptor="com.github.pagehelper.PageInterceptor">
			
			<property name="reasonable" value="true"/>
		plugin>
	plugins>
configuration>

7. 编写数据库的配置信息(我用的是c3p0)c3p0.properties

jdbc.url=jdbc:mysql://localhost:3306/ssm_curd
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=root

8. 创建数据库

数据库的表

9. 使用mybatis逆向工程,根据数据库生成实体类

1.要使用这个先导入依赖
 
		
		
			org.mybatis.generator
			mybatis-generator-core
			1.3.5
		
2.在项目下创建xml文件(我这里叫mbg.xml)

使用Maven构建SSM加CRUD功能_第2张图片

3在项目下创建xml文件(我这里叫mbg.xml)



<generatorConfiguration>

	<context id="DB2Tables" targetRuntime="MyBatis3">
		<commentGenerator>
			<property name="suppressAllComments" value="true" />
		commentGenerator>


		
		<jdbcConnection driverClass="com.mysql.jdbc.Driver"
			connectionURL="jdbc:mysql://localhost:3306/ssm_curd" userId="root"
			password="root">
		jdbcConnection>

		<javaTypeResolver>
			<property name="forceBigDecimals" value="false" />
		javaTypeResolver>

		
		
		<javaModelGenerator targetPackage="com.ns.pojo"
			targetProject=".\src\main\java">
			<property name="enableSubPackages" value="true" />
			<property name="trimStrings" value="true" />
		javaModelGenerator>

		
		<sqlMapGenerator targetPackage="mapper" targetProject=".\src\main\resources">
			<property name="enableSubPackages" value="true" />
		sqlMapGenerator>

		
		<javaClientGenerator type="XMLMAPPER"
			targetPackage="com.ns.dao" targetProject=".\src\main\java">
			<property name="enableSubPackages" value="true" />
		javaClientGenerator>
		
		
		
		
		<table tableName="tnl_position" domainObjectName="Position">table>
	context>
generatorConfiguration>
4.编写一个Test运行写好的mybatis逆向工程(这个不用理解,直接复制粘贴就好)
public class MBGTest {
	
	public static void main(String[] args) throws Exception{
		List<String> warnings = new ArrayList<String>();
		   boolean overwrite = true;
		   File configFile = new File("mbg.xml");
		   ConfigurationParser cp = new ConfigurationParser(warnings);
		   Configuration config = cp.parseConfiguration(configFile);
		   DefaultShellCallback callback = new DefaultShellCallback(overwrite);
		   MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
		   myBatisGenerator.generate(null);
	}
}
5.运行完成就会生成对应的实体类,mapper.xml,和接口。
6.这个是逆向工程生成的mapper解释 https://www.cnblogs.com/luckypo/p/7356278.html

10. 使用 Bootstrap构建CRUD页面

导入Bootstrap的压缩文件,引入jquery压缩文件
Bootstrap下载:https://v3.bootcss.com/getting-started/#download
Bootstrap的使用说明:https://v3.bootcss.com/css/

使用Maven构建SSM加CRUD功能_第3张图片

11. 创建jsp文件 在里面引用bootstrap

我使用了Ajax做CRUD
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>员工列表title>
<%
pageContext.setAttribute("APP_PATH", request.getContextPath());
%>

<script type="text/javascript" src="${pageContext.request.contextPath }/static/js/jquery-1.10.2.min.js">script>

<link href="${pageContext.request.contextPath }/static/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">
<script src="${pageContext.request.contextPath }/static/bootstrap-3.3.7-dist/js/bootstrap.min.js">script>
head>
<body>




<div class="modal fade" id="empUpdateModal" 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">员工修改h4>
      div>
		 <div class="modal-body">
			<form class="form-horizontal">
				<div class="form-group">
				   
					<label class="col-sm-2 control-label">empNamelabel>
					<div class="col-sm-10">
						 <p class="form-control-static" id="empName_update_static">p>
					<span class="help-block">span>
					div>
				div>
				<div class="form-group">
					<label class="col-sm-2 control-label">emaillabel>
					<div class="col-sm-10">
						<input type="text" name="email" class="form-control" id="email_update_input"
							placeholder="[email protected]">
					<span class="help-block">span>
					div>
				div>
				<div class="form-group">
					<label class="col-sm-2 control-label">genderlabel>
					<div class="col-sm-10">
						<label class="radio-inline">
						  <input type="radio" name="gender" id="gender1_update_input" value="M" checked="checked">label>
						<label class="radio-inline">
						  <input type="radio" name="gender" id="gender2_update_input" value="G">label>
					div>
				div>
				<div class="form-group">
					<label class="col-sm-2 control-label">deptNamelabel>
					<div class="col-sm-4">
						
						<select class="form-control" name="dId" id="dept_update_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="emp_update_btn">更新button>
      div>
    div>
  div>
div>




<div class="modal fade" id="empAddModal" 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">
				<div class="form-group">
				   
					<label class="col-sm-2 control-label">empNamelabel>
					<div class="col-sm-10">
						<input type="text" name="empName" class="form-control" id="empName_add_input"
							placeholder="empName">
					<span class="help-block">span>
					div>
				div>
				<div class="form-group">
					<label class="col-sm-2 control-label">emaillabel>
					<div class="col-sm-10">
						<input type="text" name="email" class="form-control" id="email_add_input"
							placeholder="[email protected]">
					<span class="help-block">span>
					div>
				div>
				<div class="form-group">
					<label class="col-sm-2 control-label">genderlabel>
					<div class="col-sm-10">
						<label class="radio-inline">
						  <input type="radio" name="gender" id="gender1_add_input" value="M" checked="checked">label>
						<label class="radio-inline">
						  <input type="radio" name="gender" id="gender2_add_input" value="G">label>
					div>
				div>
				<div class="form-group">
					<label class="col-sm-2 control-label">deptNamelabel>
					<div class="col-sm-4">
						
						<select class="form-control" name="dId" id="dept_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="emp_save_btn">保存button>
      div>
    div>
  div>
div>

	
	<div class="container">
		
		<div class="row">
			<div class="col-md-12">
				<h1>SSM-CRUDh1>
			div>
		div>
		
		<div class="row">
			 <div class="col-md-4 col-md-offset-8">
			 	<button class="btn btn-primary" id="emp_add_model_btn">新增button>
			 	<button class="btn btn-danger" id="emp_delete_all_btn">删除button>
			 div>
		div>
		
		<div class="row">
			<div class="col-md-12">
				<table class="table table-hover" id="emps_table">
				 	<thead>
						<tr>
							<th>
							<input type="checkbox" id="check_all" />
							th>
							<th>#th>
							<th>empNameth>	
							<th>genderth>	
							<th>emialth>	
							<th>deptNameth>	
							<th>操作th>	
						tr>		
					thead>
					<tbody>
					
					tbody>			
				table>
			div>
		div>
		
		<div class="row">
			
			<div class="col-md-6" id="page_info_area">
			
			div>
			
			<div class="col-md-6" id="page_nav_area">
				
			div>
		div>
		
	div>
	<script type="text/javascript">
	    //总记录数,为了保存员工后显示添加的员工
		var totalRecord;
	    //当前页,方便后面修改员工后跳到修改的那个员工页面
	    var currentPage;
		//1.页面加载完成以后,直接去发生一个ajax请求,要到分页数据
		$(function(){
			//去首页
			to_page(1);
		});
		//跳转页数
		function to_page(pn){
			$.ajax({
				url:"${APP_PATH}/emps",
				data:"pn="+pn,
				type:"get",
				success:function(result){
					//console.log(result)
				//1.解析并显示员工数据
				build_emps_table(result);
				//2.解析并显示分页信息
				build_emps_info(result);
				//3..解析并显示分页数据
				build_emps_nav(result);
				}
			});
		}
		
		//解析并显示员工表格
		function build_emps_table(result){
			//点下一个时清空上一页的数据
			$("#emps_table tbody").empty();
			var emps=result.extend.pageInfo.list;
			$.each(emps,function(index,item){
				var checkBoxTd=$("")
				var empIdTd=$("").append(item.empId);
				var empNameTd=$("").append(item.empName);
				var genderTd=$("").append(item.gender=='M'?"男":"女");
				var emailTd=$("").append(item.email);
				var deptNameTd=$("").append(item.department.deptName);
				/*
				
				**/
				//编辑按钮
				var editBtn=$("").addClass("btn btn-primary btn-sm edit_btn")
					.append($("").addClass("glyphicon glyphicon-pencil"))
					.append("编辑");
				//为编辑按钮添加一个自定义的属性,来表示员工ID,以此修改员工信息
				editBtn.attr("edit-id",item.empId);
				//删除按钮
				var delBtn=$("").addClass("btn btn-danger btn-sm delete_btn")
				.append($("").addClass("glyphicon glyphicon-trash"))
				.append("删除");
				//为删除按钮添加一个自定义的属性,来表示员工ID,以此删除员工信息
				delBtn.attr("delete-id",item.empId);
				var btnTd=$("").append(editBtn).append("").append(delBtn);
				//append方法执行完成以后还是返回原来的元素
				$("").append(checkBoxTd)
						.append(empIdTd)
						.append(empNameTd)
						.append(genderTd)
						.append(emailTd)
						.append(deptNameTd)
						.append(btnTd)
						.appendTo("#emps_table tbody");
			});
		}
		//解析并显示分页信息
		function build_emps_info(result){
			//清空之前的数据
			$("#page_info_area").empty();
			$("#page_info_area").append("当前"+result.extend.pageInfo.pageNum+"页,总"
					+result.extend.pageInfo.pages+"页,总"+
					result.extend.pageInfo.total+"条记录");	
		 	//总记录数
			totalRecord=result.extend.pageInfo.total;
		 	//当前页
			currentPage=result.extend.pageInfo.pageNum;
		}
		//解析并显示分页条,点击分页要能去下一页。。。
		function build_emps_nav(result){
			//清空之前的数据
			$("#page_nav_area").empty();
			//page_nav_area
			var ul=$("
    "
    ).addClass("pagination"); //首页标签 var firstPageLi=$("
  • "
    ).append($("").append("首页").attr("href","#")); //上一个标签 var prePageLi=$("
  • "
    ).append($("").append("«")); //如果当前为第一页时,不能点击上一页和首页 if(result.extend.pageInfo.hasPreviousPage ==false){ firstPageLi.addClass("disabled"); prePageLi.addClass("disabled"); }else{ //点击首页跳转 firstPageLi.click(function(){ to_page(1); }) //点击上一页跳转 prePageLi.click(function(){ to_page(result.extend.pageInfo.pageNum-1); }) } //下一页标签 var nextPageLi=$("
  • "
    ).append($("").append("»")); //末页标签 var lasePageLi=$("
  • "
    ).append($("").append("末页").attr("href","#")); //如果当前为最后一页时,不能点击下一页和末页 if(result.extend.pageInfo.hasNextPage ==false){ nextPageLi.addClass("disabled"); lasePageLi.addClass("disabled"); }else{ //点击下一页跳转 nextPageLi.click(function(){ to_page(result.extend.pageInfo.pageNum+1); }) //点击末页跳转 lasePageLi.click(function(){ to_page(result.extend.pageInfo.pages); }) } //添加上一页和首页提示 ul.append(firstPageLi) .append(prePageLi) //1,2,3 遍历给ul添加页码提示 $.each(result.extend.pageInfo.navigatepageNums,function(index,item){ //每一个页码 var numLi=$("
  • "
    ).append($("").append(item)); //给当前页加上高亮显示 if(result.extend.pageInfo.pageNum == item){ numLi.addClass("active"); } //点击页码跳转 numLi.click(function(){ to_page(item); }); ul.append(numLi); }); //添加下一页和末页提示 ul.append(nextPageLi).append(lasePageLi); //把ul加入到nav中 var navEle=$("").append(ul); navEle.appendTo("#page_nav_area"); } //清空表单样式及内容内容 function reset_form(ele){ $(ele)[0].reset(); //清空表单样式 $(ele).find("*").removeClass("has-error has-success") $(ele).find(".help-block").text(""); } //给新增按钮弹出模态框 $("#emp_add_model_btn").click(function(){ //发送ajax请求,查出部门信息,显示在下拉列表中 //清除表单数据(表单重复) reset_form("#empAddModal form"); //防止重复点击新增出现ajax查询的数据重复叠加 /* $("#dept_add_select").empty(); */ //查出所有的部门信息并显示在下拉列表当中 参数是放到什么元素里面 getDepts("#dept_add_select"); //弹出模态框 $("#empAddModal").modal({ backdrop:"static" }); }); //查出所有的部门信息并显示在下拉列表当中 参数是放到什么元素里面 function getDepts(ele){ //清空之前下拉列表的值 $(ele).empty(); //{"code":100,"msg":"处理成功","extend":{"depts":[{"deptId":1,"deptName":"开发部"},{"deptId":2,"deptName":"测试部"}]}} $.ajax({ url:"${APP_PATH}/depts", type:"GET", success:function(result){ //console.log(result) //$("#dept_add_select").append("") $.each(result.extend.depts,function(index,item){ var optionEle=$("").append(item.deptName).attr("value",item.deptId); optionEle.appendTo(ele); }); } }); } //校验表单数据 function validate_add_form(){ //1.先拿到校验的数据,使用正则表达式 //校验empName var empName=$("#empName_add_input").val(); var regName=/(^[a-zA-Z0-9_-]{4,16}$)|(^[\u2E80-\u9FFF]{2,5})/; if(!regName.test(empName)){ //应该清空这个元素之前的样式 //定义一个方法在通用的验证方法 传入对应的 选择器,状态,错误信息 show_validate_msg("#empName_add_input","error","用户名可以是2-5为中文"); return false; }else{ //定义一个方法在通用的验证方法 传入对应的 选择器,状态,错误信息 show_validate_msg("#empName_add_input","success",""); }; //校验邮箱 var Email=$("#email_add_input").val(); var regEmail=/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/ ; if(!regEmail.test(Email)){ //定义一个方法在通用的验证方法 传入对应的 选择器,状态,错误信息 show_validate_msg("#email_add_input","error","邮箱格式不正确"); return false; }else{ //定义一个方法在通用的验证方法 传入对应的 选择器,状态,错误信息 show_validate_msg("#email_add_input","success",""); }; return true; }; //验证方法 参数:选择器,状态,错误信息 function show_validate_msg(ele,status,msg){ //清楚当前元素的校验状态 $(ele).parent().removeClass("has-success has-error"); $(ele).next("span").text(""); if("success" ==status){ $(ele).parent().addClass("has-success"); $(ele).next("span").text(msg); }else if("error"==status){ $(ele).parent().addClass("has-error"); $(ele).next("span").text(msg); } } $("#empName_add_input").change(function(){ //发送ajax请求校验用户名是否可用 var empName=this.value; $.ajax({ url:"${APP_PATH}/checkuser", data:"empName="+empName, type:"POST", success:function(result){ if(result.code==100){ show_validate_msg("#empName_add_input","success","用户名可用"); //在保存按钮上标记一个属性 $("#emp_save_btn").attr("ajax-va","success"); }else{ show_validate_msg("#empName_add_input","error",result.extend.va_msg); //在保存按钮上标记一个属 $("#emp_save_btn").attr("ajax-va","error"); } } }) }); //点击保存,保存员工。 $("#emp_save_btn").click(function(){ //1.模态框中填写的表单数据提交给服务器进行保存 //先对要提交给服务器的数据进行校验 if(!validate_add_form()){ return false; } //1.判断之前的ajax用户名校验是否成功,如果成功 if($("#emp_save_btn").attr("ajax-va")=="error"){ return false; } //2.发送Ajax请求保存成功 $.ajax({ url:"${APP_PATH}/emp", type:"POST", data:$("#empAddModal form").serialize(), success:function(result){ //alert(result.msg); if(result.code==100){ //员工保存成功 //1.关闭模态框 $("#empAddModal").modal('hide') //2.来到最后一页显示保存的数据 //发送ajax请求显示最后一页数据 to_page(totalRecord); }else{ //显示失败信息 //console.log(result); //有哪个字段的错误信息就显示哪个字段的 if(undefined!=result.extend.errorFields.email){ //显示邮箱错误信息 show_validate_msg("#email_add_input","error",result.extend.errorFields.email); } if(undefined!=result.extend.errorFields.empName){ //显示员工名字的错误信息 show_validate_msg("#empName_add_input","error",result.extend.errorFields.empName); } } } }); }); //员工编辑按钮编写 //1.我们是按钮创建之前就绑定了click,所以绑定不上 // 1)、可以创建按钮的时候绑定 2)、绑定点击live() $(document).on("click",".edit_btn",function(){ //alert("edit") //0.查出员工信息,显示员工信息 //1.查出部门信息,并显示部门列表 getDepts("#empUpdateModal select"); //2.查询员工信息 lookEmp($(this).attr("edit-id")); //3.把员工的ID传递给模态框的更新按钮 $("#emp_update_btn").attr("edit-id",$(this).attr("edit-id")); //弹出模态框 $("#empUpdateModal").modal({ backdrop:"static" }); }); //查询员工信息 function lookEmp(id){ $.ajax({ url:"${APP_PATH}/emp/"+id, type:"GET", success:function(result){ //console.log(result); var empData=result.extend.emp; $("#empName_update_static").text(empData.empName); $("#email_update_input").val(empData.email); $("#empUpdateModal input[name=gender]").val([empData.gender]) $("#empUpdateModal select").val([empData.dId]) } }) } //点击更新,更新员工信息 $("#emp_update_btn").click(function(){ //验证邮箱是否合法 //1.校验邮箱 var Email=$("#email_update_input").val(); var regEmail=/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/ ; if(!regEmail.test(Email)){ //定义一个方法在通用的验证方法 传入对应的 选择器,状态,错误信息 show_validate_msg("#email_update_input","error","邮箱格式不正确"); return false; }else{ //定义一个方法在通用的验证方法 传入对应的 选择器,状态,错误信息 show_validate_msg("#email_update_input","success",""); }; //2.发送ajax请求保存更新的员工数据 //data:$("#empUpdateModal form").serialize()+"&_method=PUT", $.ajax({ url:"${APP_PATH}/emp/"+$(this).attr("edit-id"), type:"PUT", data:$("#empUpdateModal form").serialize(), success:function(reuslt){ //alert(reuslt.msg); //1.关闭对话框 $("#empUpdateModal").modal("hide"); //2.回到本页面 to_page(currentPage); } }) }) //员工删除按钮绑定单击事件 //单个删除 $(document).on("click",".delete_btn",function(){ //1.弹出确认删除对话框 var empName=$(this).parents("tr").find("td:eq(2)").text(); if(confirm("确认删除员工【"+empName+"】吗?")){ //1发送ajax请求删除即可 $.ajax({ url:"${APP_PATH}/emp/"+$(this).attr("delete-id"), type:"DELETE", success:function(result){ alert(result.msg); //回到本页 to_page(currentPage); } }) } }); //完成全选/全不选功能 $("#check_all").click(function(){ //attr获取checked是undefined; //我们这些dom原生的属性,attr获取自定义属性的值, //prop修改和读取dom原生属性的值 //当前单选框的状态 选择了还是没有选 //$(this).prop("checked") $(".check_item").prop("checked", $(this).prop("checked")); }); //check_item $(document).on("click",".check_item",function(){ //判断当前选中的元素是不是5个 //:checked匹配所有选中的复选框 var flag=$(".check_item:checked").length==$(".check_item").length; $("#check_all").prop("checked",flag); }); //点击全部删除,就批量删除 $("#emp_delete_all_btn").click(function(){ //$(".check_item:checked") //要删除员工的名字 var empNames=""; var del_idstr=""; $.each($(".check_item:checked"),function(){ //this. //组转员工名字字符串 empNames+=$(this).parents("tr").find("td:eq(2)").text()+","; //组转员工id字符串 del_idstr+=$(this).parents("tr").find("td:eq(1)").text()+"-"; }); //去除empNames多余的逗号 empNames=empNames.substring(0, empNames.length-1); //去除删除的id多余的- del_idstr=del_idstr.substring(0, del_idstr.length-1); if(confirm("确认删除【"+empNames+"】吗?")){ //发送Ajax请求 $.ajax({ url:"${APP_PATH}/emp/"+del_idstr, type:"DELETE", success:function(result){ alert(result.msg) //回到当前页面 to_page(currentPage); } }) } });
    script> body> html>

    12. 写一个通用的JSON返回类

    /**
     * 通用的返回类
     * @author asus
     *
     */
    public class Msg {
    	//状态码,100-成功,200-失败
    	private int code;
    	//提示信息
    	private String msg;
    	
    	//用户要返回给浏览器的数据
    	private Map<String,Object> extend=new HashMap<String, Object>();
    
    	public static Msg success(){
    		Msg result=new Msg();
    		result.setCode(100);
    		result.setMsg("处理成功");
    		return result;
    	}
    	public static Msg fail(){
    		Msg result=new Msg();
    		result.setCode(200);
    		result.setMsg("处理失败");
    		return result;
    	}
    	public Msg add(String key, Object value) {
    		this.getExtend().put(key, value);
    		return this;
    	}
    	
    	public int getCode() {
    		return code;
    	}
    
    	public void setCode(int code) {
    		this.code = code;
    	}
    
    	public String getMsg() {
    		return msg;
    	}
    
    	public void setMsg(String msg) {
    		this.msg = msg;
    	}
    
    	public Map<String, Object> getExtend() {
    		return extend;
    	}
    
    	public void setExtend(Map<String, Object> extend) {
    		this.extend = extend;
    	}
    }
    

    13. controller类

    1.DepartmentController.java
    /**
     * 处理和部门有关的请求
     * @author asus
     *
     */
    
    @Controller
    public class DepartmentController {
    
    	@Autowired
    	private DepartmentService departmentService;
    
    	/**
    	 * 返回所有的部门信息
    	 */
    	@RequestMapping("/depts")
    	@ResponseBody
    	public Msg AllDepts(){
    		//查出的所有部门信息
    		List<Department> list=departmentService.AllDepts();
    		return Msg.success().add("depts", list);
    	}
    
    }
    
    2.EmployeeController.java
    /**
     * 处理员工CRUD请求
     * @author asus
     *
     */
    @Controller
    public class EmployeeController {
    	
    	@Autowired
    	EmployeeService EmployeeService;
    	
    	/**
    	 * 单个批量二合一
    	 * 批量删除:1-2-3
    	 * 单个删除:1
    	 * @param id
    	 * @return
    	 */
    	@RequestMapping(value="/emp/{ids}",method=RequestMethod.DELETE)
    	@ResponseBody
    	public Msg deleteEmpBy(@PathVariable("ids")String ids){
    		//批量删除
    		//判断参数有没有 - 字符串
    		if(ids.contains("-")){
    			//定义一个Integer类型的集合装要批量删除的id
    			List<Integer> del_id=new ArrayList<Integer>();
    			//分割参数
    			String[] str_ids = ids.split("-");
    			//组装id的集合
    			for (String string : str_ids) {
    				del_id.add(Integer.parseInt(string));
    			}
    			EmployeeService.deleteBatch(del_id);
    		}else{
    			Integer id=Integer.parseInt(ids);
    			//单个删除
    			EmployeeService.deleteEmpById(id);
    		}
    		
    		return Msg.success();
    	}
    	
    	/**
    	 * 如果直接发送Ajax=PUT形式的请求
    	 * 封装的数据
    	 * Employee [empId=69, empName=null, gender=null, email=null, dId=null, department=null]
    	 * 
    	 * 问题
    	 * 请求体中有数据
    	 * 但是Employee对象封装不上
    	 * sql语句就变为
    	 * update tnl_emp  where emo_id=69
    	 * 
    	 * 原因:
    	 * Tomcat:
    	 * 		1.将请求体中的数据,封装到一个map.			
    	 * 		2.request.getParameter("empName")就会从这个map中取值
    	 * 		3.SpringMVC封装POJO对象的时候
    	 * 			会把POJO中每个属性的值,reqeust.getParamter("email");
    	 * Ajax发送PUT请求引发的血案
    	 * 	PUT请求,请求体中的数据 reqeust.getParamter("email");拿不到
    	 * 	Tomcat一看数PUT不会封装请求体中的数据为map,只有POST形式的请求才封装请求体为map
    	 * 
    	 * 解决方案
    	 * 我们要能支持直接发送PUT之类的请求,还要封装请求体中的数据
    	 * 1.配置上HttpPutFormContentFilter
    	 * 2.他的作用:将请求体中的数据解析包装。
    	 * 3.request.getParamter()被重写,就会从自己封装的map中取数据
    	 * 员工更新方法
    	 * 
    	 * @param employee
    	 * @return
    	 */
    	@RequestMapping(value="/emp/{empId}",method=RequestMethod.PUT)
    	@ResponseBody
    	public Msg saveEmp(Employee employee){
    		//System.out.println("要更新的数据"+employee);
    		EmployeeService.updateEmp(employee);
    		return Msg.success();
    	}
    	/**
    	 * 根据id查询员工信息
    	 * @param id
    	 * @return
    	 */
    	@RequestMapping(value="/emp/{id}",method=RequestMethod.GET)
    	@ResponseBody
    	public Msg lookEmp(@PathVariable("id")Integer id){
    		
    		Employee employee=EmployeeService.lookEmp(id);
    		return Msg.success().add("emp", employee);
    	}
    	/**
    	 * 检查用户名是否可用
    	 * @param empName
    	 * @return
    	 */
    	@RequestMapping("/checkuser")
    	@ResponseBody
    	public Msg checkuser(@RequestParam("empName")String empName){
    		//先判断用户名是否是合法的
    		String regx="(^[a-zA-Z0-9_-]{4,16}$)|(^[\u2E80-\u9FFF]{2,5})";
    		if(!empName.matches(regx)){
    			return Msg.fail().add("va_msg","用户名必须是6-16为数字和字母的组合或2-5位中文");
    		}
    		//数据库用户名重复校验
    		Boolean b=EmployeeService.checkuser(empName);
    		if(b){
    			return Msg.success();
    		}else{
    			return Msg.fail().add("va_msg", "用户名不可用");	
    		}
    	
    	}
    	
    	/**
    	 * 员工保存
    	 * 1.支持JSR303校验
    	 * 2.导入Hibernate-Valida
    	 * 
    	 * @param employee
    	 * @return
    	 */
    	@RequestMapping(value="/emp",method=RequestMethod.POST)
    	@ResponseBody
    	public Msg saveEmp(@Valid Employee employee,BindingResult result){
    		if(result.hasErrors()){
    			//校验失败,应该返回失败,在模态框中显示校验失败的作物信息
    			Map<String, Object> map=new HashMap<String, Object>();
    			//取出所有的错误信息
    			List<FieldError> errors = result.getFieldErrors();
    			for (FieldError fieldError : errors) {
    				System.out.println("错误的字段名:"+fieldError.getField());
    				System.out.println("错误信息:"+fieldError.getDefaultMessage());
    				map.put(fieldError.getField(), fieldError.getDefaultMessage());
    			}
    			return Msg.fail().add("errorFields", map);
    		}else{
    		EmployeeService.saveEmp(employee);
    		return Msg.success();
    		}
    	}
    	
    	/**
    	 * 导入Jackson包
    	 * @param pn
    	 * @return
    	 */
    	@RequestMapping("/emps")
    	@ResponseBody
    	public Msg findEmpsWithJSON(
    			@RequestParam(value="pn",defaultValue="1")Integer pn
    			){
    		//这不是一个分页查询
    		//引入pageHelper分页插件
    		//在查询之前只需要调用,传入页码,以及每页的显示的条数
    		PageHelper.startPage(pn, 5);
    		//startPage后面紧跟的这个查询就是一个分页查询
    		List<Employee> emps=EmployeeService.getAll();		
    		//用PageInfo对结果进行包装 ,只需要将pageInfo交给页面就行了
    		//里面封装了详细的分页信息,包含我们查询出来的数据,传入连续显示的页数
    		PageInfo page = new PageInfo(emps,5);
    		return Msg.success().add("pageInfo",page);
    	}
    	
    	
    	
    	
    	
    	
    	/**
    	 * 查询员工数据(分页查询)
    	 * @return
    	 */
    	//@RequestMapping("/emps")
    	public String findEmps(@RequestParam(value="pn",defaultValue="1")Integer pn
    			,Model model){
    		//这不是一个分页查询
    		//引入pageHelper分页插件
    		//在查询之前只需要调用,传入页码,以及每页的显示的条数
    		PageHelper.startPage(pn, 5);
    		//startPage后面紧跟的这个查询就是一个分页查询
    		List<Employee> emps=EmployeeService.getAll();		
    		//用PageInfo对结果进行包装 ,只需要将pageInfo交给页面就行了
    		//里面封装了详细的分页信息,包含我们查询出来的数据,传入连续显示的页数
    		PageInfo page = new PageInfo(emps,5);
    		model.addAttribute("pageInfo", page);
    		
    		return "list";
    	}
    }
    

    14. Service类

    1.DepartmentService.java
    @Service
    public class DepartmentService {
    
    	@Autowired
    	private DepartmentMapper departmentMapper;
    	
    	public List<Department> AllDepts() {
    		List<Department> list = departmentMapper.selectByExample(null);
    		return list;
    	}
    
    }
    
    2.EmployeeService.java
    @Service
    public class EmployeeService {
    	
    	@Autowired
    	EmployeeMapper employeeMapper;
    	
    	/**
    	 * 查询所有员工
    	 * @return
    	 */
    	public List<Employee> getAll() {
    		// TODO Auto-generated method stub
    		return employeeMapper.selectByExampleWithDept(null);
    	}
    	/**
    	 * 员工保存方法
    	 * @param employee
    	 */
    	public void saveEmp(Employee employee) {
    		employeeMapper.insertSelective(employee);
    	}
    	/**
    	 * 检验用户名是否可以用
    	 * 
    	 * @param empName
    	 * @return  true:代表当前姓名可用。 false:不可用
    	 */
    	public Boolean checkuser(String empName) {
    	
    		EmployeeExample example =new EmployeeExample();
    		Criteria criteria = example.createCriteria();
    		criteria.andEmpNameEqualTo(empName);
    		long count=employeeMapper.countByExample(example);
    		return count==0;
    	}
    	/**
    	 * 按照员工ID查询员工
    	 * @param id
    	 * @return
    	 */
    	public Employee lookEmp(Integer id) {
    		Employee employee = employeeMapper.selectByPrimaryKey(id);
    		return employee;
    	}
    	/**
    	 * 员工更新
    	 * @param employee
    	 */
    	public void updateEmp(Employee employee) {		
    		employeeMapper.updateByPrimaryKeySelective(employee);
    	}
    	/**
    	 * 员工删除
    	 * @param id
    	 */
    	public void deleteEmpById(Integer id) {
    		employeeMapper.deleteByPrimaryKey(id);
    	}
    	public void deleteBatch(List<Integer> ids) {
    		EmployeeExample example =new EmployeeExample();
    		Criteria criteria = example.createCriteria();
    		//delete form xxx where emp_id in(1,2,3)
    		criteria.andEmpIdIn(ids);
    		employeeMapper.deleteByExample(example);
    	}
    
    }
    
    

    到此SSM-CRUD就全部完成了,代码很多,对于有一定基础的人来说,这些代码可以给你提供一个新的写法,一些新的技巧

    谢谢

    需要源码的话可以联系我

    你可能感兴趣的:(SSM)