自己练习一个ssm为主的项目

        学习ssm也有段时间了,一直以来没有完整系统的过一遍项目的流程,今天就自己做一个,准备工作比较繁琐,在网上找了一些他人的流程进行参考,也结合自己的实际情况做一个整理。也为自己以后的查漏补缺。只是自己总结,不作分享之用。也是以后再次使用可以直接查看自己的流程文档,省得麻烦。

        一、准备环境

            eclipse-oxypgen

            apache-maven-3.5.0

            apache-tomcat-7.0.70

            jdk 1.8.0_131

        二、系统环境的配置

            eclipse-oxypgen 直接在安装的配置里面把字符集设置为utf-8 一劳永逸
            tomcat
自己练习一个ssm为主的项目_第1张图片

            maven 

                    将eclipse中自带的maven版本换为自己安装的版本

                自己练习一个ssm为主的项目_第2张图片

        修改maven的user setting配置

自己练习一个ssm为主的项目_第3张图片

        三、新建maven项目

        1、鼠标右击--new--other--maven--maven project--next-next

自己练习一个ssm为主的项目_第4张图片

自己练习一个ssm为主的项目_第5张图片

2、maven项目的 工程结构

https://blog.csdn.net/dm1314oooooooo/article/details/70859189 之后如果在测试index.jsp报错就将web.xml文件删除重新生成

自己练习一个ssm为主的项目_第6张图片

z自己练习一个ssm为主的项目_第7张图片

右击项目--build path -- configure build path -- 

自己练习一个ssm为主的项目_第8张图片

maven项目的完整目录

自己练习一个ssm为主的项目_第9张图片

项目成功后的目录结构

自己练习一个ssm为主的项目_第10张图片

        四、测试index.jsp可以运行。我们就可以正式搭建ssm(spring、springmvc、mybatis)+maven+bootstrap+MySQL项目了。在pox.xml中配置项目所需的jar包。之后会自动下载到自己配置的maven仓库中。然后进行相关的xml文件的配置

1、先展示项目所需的相关jar包

spring-core-4.3.7.RELEASE.jar
commons-logging-1.2.jar
spring-context-4.3.7.RELEASE.jar
spring-expression-4.3.7.RELEASE.jar
spring-beans-4.3.7.RELEASE.jar
spring-aop-4.3.7.RELEASE.jar
spring-jdbc-4.3.7.RELEASE.jar
spring-aspects-4.3.7.RELEASE.jar
aspectjweaver-1.8.9.jar
spring-web-4.3.7.RELEASE.jar
spring-test-4.3.8.RELEASE.jar
spring-webmvc-4.3.7.RELEASE.jar
spring-tx-4.3.7.RELEASE.jar
mybatis-3.4.5.jar
mybatis-spring-1.3.1.jar
mybatis-generator-core-1.3.5.jar
pagehelper-5.1.3.jar
jsqlparser-1.0.jar
javax.servlet-api-3.0.1.jar
jackson-databind-2.8.8.jar
jackson-annotations-2.8.0.jar
ackson-core-2.8.8.jar
fastjson-1.2.47.jar
jackson-mapper-asl-1.9.13.jar
jackson-core-asl-1.9.13.jar
hibernate-validator-5.4.1.Final.jar
validation-api-1.1.0.Final.jar
jboss-logging-3.3.0.Final.jar
classmate-1.3.1.jar
mysql-connector-java-5.1.41.jar
c3p0-0.9.5.2.jar
mchange-commons-java-0.2.11.jar
jstl-1.2.jar
junit-4.12.jar
hamcrest-core-1.3.jar

2、在maven项目中的pom.xml文件中配置导入的jar(spring,springmvc,mybatis,junit,c3p0,jsr303数据校验,分页,逆向工程)可去http://mvnrepository.com/中央仓库去寻找依赖配置

pom.xml文件配置好这些后,会自动进行下载。存放到之前配置好的maven的本地仓库中

ssmcrud-demo
     
            
            
                org.apache.maven.plugins
                maven-compiler-plugin
                
                    1.8
                    1.8
                
            
        
  
  
	
		
		4.3.7.RELEASE
		
		3.4.5
		
		
	
  
  
  
		
		
		
			org.springframework
			spring-core
			${spring.version}
		
		
		
			org.springframework
			spring-context
			${spring.version}
		
		
		
			org.springframework
			spring-beans
			${spring.version}
		
		
		
			org.springframework
			spring-aop
			${spring.version}
		
		
			org.springframework
			spring-jdbc
			${spring.version}
		
		
			org.springframework
			spring-aspects
			${spring.version}
		
		
		
			org.springframework
			spring-web
			${spring.version}
		
		
                
                        org.springframework
                        spring-test
                        4.3.8.RELEASE
                


		
		
		
			org.springframework
			spring-webmvc
			${spring.version}
		
		
		
		
			org.springframework
			spring-tx
			${spring.version}
		
		

		
		
		
		
			org.mybatis
			mybatis
			${mybatis.version}
		
		
		
			org.mybatis
			mybatis-spring
			1.3.1
		
		
		
		
			org.mybatis.generator
			mybatis-generator-core
			1.3.5
		
		
		
			com.github.pagehelper
			pagehelper
			5.1.3
		
		

		
		
			javax.servlet
			javax.servlet-api
			3.0.1
			provided
		

		
		
		
			com.fasterxml.jackson.core
			jackson-databind
			2.8.8
		
		
		
		
		
			com.alibaba
			fastjson
			1.2.47
		

		
			org.codehaus.jackson
			jackson-mapper-asl
			1.9.13
		 
		

		
		
		
                    org.hibernate
                    hibernate-validator
                    5.4.1.Final
                

		
		
			mysql
			mysql-connector-java
			5.1.41
		

		
		
		
			com.mchange
			c3p0
			0.9.5.2
		

		
		
			javax.servlet
			jstl
			1.2
		

		
		
			junit
			junit
			4.12
			test
		

		
		
		
		


  

3、配置相关的xml文件

自己练习一个ssm为主的项目_第11张图片

    a、在src/main/resources下添加配置文件:applicationContext.xml 配置信息:



	
	 
	
	

	
	
		
	
	
	
	
	
	
	
	
	
	
	
	
		
		
	
	

    b、配置数据库连接池:db.properties

#和数据库的链接配置
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm_crud
jdbc.user=root
jdbc.password=root
#数据库连接池的配置
jdbc.initialPoolSize=20
#当连接池中 的连接耗尽是,c3p0一次同时获取的连接数。
jdbc.acquireIncrement=20
#定义连接池中保留的最大连接数
jdbc.maxPoolSize=30
#定义连接池中保留的最小连接数
jdbc.minPoolSize=10
#定义最大空闲,多少秒内未使用,则连接池被丢弃
jdbc.maxIdleTime=60

    c、配置log4j日志,虽然不用,基本设置还是要知道的 log4j.properties

#定义LOG输出级别    
log4j.rootLogger=INFO,Console,File    
#定义日志输出目的地为控制台    
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=[%c] - %m%n    
    
#文件大小到达指定尺寸的时候产生一个新的文件    
log4j.appender.File = org.apache.log4j.RollingFileAppender    
#指定输出目录    
log4j.appender.File.File = logs/ssm.log    
#定义文件最大大小    
log4j.appender.File.MaxFileSize = 10MB    
# 输出所以日志,如果换成DEBUG表示输出DEBUG以上级别日志    
log4j.appender.File.Threshold = ALL    
log4j.appender.File.layout = org.apache.log4j.PatternLayout    
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n    

    d、配置spring-db.xml



	
	
	
		
		
		
		
			
		
			
		
			
		
			
		
			
		
	


    e、配置spring的事务管理:spring-tx.xml



	
	
	
		
	
	
	
	
		
		
		
		
	
	
		
		
			
		
			
		
	


    f、配置springmvc的整合:spring-mvc.xml



	

	
	
		
	
	
	
	
		
		
	
	
	
	
		
	
	
	

    g、配置和mybati的整合:spring-mybatis-dao.xml



 
	
		
		
		
		
		
		
	
	
	
	
	
		
	


    h、mybatis中还有一些关于分页,命名规则的设置,所以还是需要单独配置:mybatis-config.xml




	
	
		
	
	
	
		
	
	
	
		
			
			
		
	

4、配置web.xml 

对spring和springmvc进行监听,字符编码集进行设置,使用Rest风格的增删改查url 设置PUT和Delete



  ssm-crud
  
    index.jsp
  
    
	
  
    contextConfigLocation
    classpath:applicationContext.xml
  
  
    org.springframework.web.context.ContextLoaderListener
  
  
  
    springDispatcherServlet
    org.springframework.web.servlet.DispatcherServlet

    
      contextConfigLocation
      classpath:spring-mvc.xml
    
    1
  
  
  
    springDispatcherServlet
    /
  

  
    CharacterEncodingFilter
    org.springframework.web.filter.CharacterEncodingFilter
    
      encoding
      utf-8
    
    
      forceRequestEncoding
      true
    
    
      forceResponseEncoding
      true
    
  
  
    CharacterEncodingFilter
    /*
  
  
  
    HiddenHttpMethodFilter
    org.springframework.web.filter.HiddenHttpMethodFilter
  
  
    HiddenHttpMethodFilter
    /*
  
  
    HttpPutFormContentFilter
    org.springframework.web.filter.HttpPutFormContentFilter
  
  
    HttpPutFormContentFilter
    /*
  

5、设置包名 根据功能模块进行包命名设置

自己练习一个ssm为主的项目_第12张图片

6、使用逆向工程 生成数据库和pojo对象之间的关联

    a、数据库表结构和数据 tbl_emp 和 tbl_dept

        自己练习一个ssm为主的项目_第13张图片

自己练习一个ssm为主的项目_第14张图片

自己练习一个ssm为主的项目_第15张图片

自己练习一个ssm为主的项目_第16张图片

    b、设置逆向工程配置mbg.xml





	
	
		
			
		
		
		
		

		
			
		

		
		
			
			
		

		
		
			
		

		
		
			
		


		
		

    c、运行逆向工程主程序,进行文件生成  在cn.qyl.ssmcrud.test包里面运行Mbg.java

package cn.qyl.ssmcrud.test;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

public class Mbg {
	public static void main(String[] args) throws Exception {

		List warnings = new ArrayList();
		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);
	}

}

    d、生成的效果图

自己练习一个ssm为主的项目_第17张图片

    e、修改mapper.dao和mapper.xml文件,添加自定义功能件 比如带有部门名字的员工信息查询

            1、package cn.qyl.ssmcrud.dao

            

package cn.qyl.ssmcrud.dao;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import cn.qyl.ssmcrud.pojo.Employee;
import cn.qyl.ssmcrud.pojo.EmployeeExample;

public interface EmployeeMapper {
	long countByExample(EmployeeExample example);

	int deleteByExample(EmployeeExample example);

	int deleteByPrimaryKey(Integer empId);

	int insert(Employee record);

	int insertSelective(Employee record);

	List selectByExample(EmployeeExample example);

	Employee selectByPrimaryKey(Integer empId);

	// 带上部门信息的查询,需要自定义在mapper.xml文件中
	List selectByExampleWithDpet(EmployeeExample example);

	// 带上部门信息的查询,需要自定义在mapper.xml文件中
	Employee selectByPrimaryKeyWithDept(Integer empId);

	int updateByExampleSelective(@Param("record") Employee record, @Param("example") EmployeeExample example);

	int updateByExample(@Param("record") Employee record, @Param("example") EmployeeExample example);

	int updateByPrimaryKeySelective(Employee record);

	int updateByPrimaryKey(Employee record);
}

        2、修改mapper.xml文件 里面大部分功能可由逆向工程来为我们生成,修改添加自定义功能模块 比如:带有部门名字的员工信息查询




  
    
    
    
    
    
  
  
  
    
    
    
    
    
    
    	
    	
    
  
  
  
   emp_id,emp_name,gender,email,dept_name 
  
  
  
  
    
      
        
          
            
              
                
                  and ${criterion.condition}
                
                
                  and ${criterion.condition} #{criterion.value}
                
                
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                
                
                  and ${criterion.condition}
                  
                    #{listItem}
                  
                
              
            
          
        
      
    
  
  
    
      
        
          
            
              
                
                  and ${criterion.condition}
                
                
                  and ${criterion.condition} #{criterion.value}
                
                
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                
                
                  and ${criterion.condition}
                  
                    #{listItem}
                  
                
              
            
          
        
      
    
  
  
    emp_id, emp_name, gender, email, d_id
  
  
  
  
  
  
   
    
  
  
  
  
  
    delete from tbl_emp 
    where emp_id = #{empId,jdbcType=INTEGER}
  
  
    delete from tbl_emp
    
      
    
  
  
    insert into tbl_emp (emp_id, emp_name, gender, 
      email, d_id)
    values (#{empId,jdbcType=INTEGER}, #{empName,jdbcType=VARCHAR}, #{gender,jdbcType=CHAR}, 
      #{email,jdbcType=VARCHAR}, #{dId,jdbcType=INTEGER})
  
  
    insert into tbl_emp
    
      
        emp_id,
      
      
        emp_name,
      
      
        gender,
      
      
        email,
      
      
        d_id,
      
    
    
      
        #{empId,jdbcType=INTEGER},
      
      
        #{empName,jdbcType=VARCHAR},
      
      
        #{gender,jdbcType=CHAR},
      
      
        #{email,jdbcType=VARCHAR},
      
      
        #{dId,jdbcType=INTEGER},
      
    
  
  
  
    update tbl_emp
    
      
        emp_id = #{record.empId,jdbcType=INTEGER},
      
      
        emp_name = #{record.empName,jdbcType=VARCHAR},
      
      
        gender = #{record.gender,jdbcType=CHAR},
      
      
        email = #{record.email,jdbcType=VARCHAR},
      
      
        d_id = #{record.dId,jdbcType=INTEGER},
      
    
    
      
    
  
  
    update tbl_emp
    set emp_id = #{record.empId,jdbcType=INTEGER},
      emp_name = #{record.empName,jdbcType=VARCHAR},
      gender = #{record.gender,jdbcType=CHAR},
      email = #{record.email,jdbcType=VARCHAR},
      d_id = #{record.dId,jdbcType=INTEGER}
    
      
    
  
  
    update tbl_emp
    
      
        emp_name = #{empName,jdbcType=VARCHAR},
      
      
        gender = #{gender,jdbcType=CHAR},
      
      
        email = #{email,jdbcType=VARCHAR},
      
      
        d_id = #{dId,jdbcType=INTEGER},
      
    
    where emp_id = #{empId,jdbcType=INTEGER}
  
  
    update tbl_emp
    set emp_name = #{empName,jdbcType=VARCHAR},
      gender = #{gender,jdbcType=CHAR},
      email = #{email,jdbcType=VARCHAR},
      d_id = #{dId,jdbcType=INTEGER}
    where emp_id = #{empId,jdbcType=INTEGER}
  

        f、数据库里面的数据,手动添加太麻烦,可设置自动添加数据 在cn.qyl.ssmcrud.test做一个MbgTest.java类,帮我们实现员工数据的大量添加

package cn.qyl.ssmcrud.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import cn.qyl.ssmcrud.dao.EmployeeMapper;
//使用spring提供的junit测试工具类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
public class MbgTest {

	@Autowired
        EmployeeMapper employeeMapper;

	@Autowired
	SqlSession sqlSession;
        //批量为我们生成一千个员工数据
	@Test
	public void testCRUD() {
		for(int i=0;i<1000;i++){
			String uid = UUID.randomUUID().toString().substring(0, 5)+i;
			mapper.insertSelective(new Employee(null, uid, "F", uid+"@qyl.com", 1));
			
		
		}
		System.out.println("批量完成");
	}
}

五.前期准备工作完成后,进行业务逻辑代码的编写

    1、导入bootstrap和jQuery,在maven工程下的src目录下的wabapp目录下创建static文件夹放入,如下:

自己练习一个ssm为主的项目_第18张图片

       2、根据功能模块创建jsp页面  在views文件夹下放入jsp页面

自己练习一个ssm为主的项目_第19张图片

   3、项目启动会直接打开index.jsp页面。如果有心情可以在index.jsp做一个登陆页面,或者其他的,我做了个计时跳转。emmmm不是因为懒。。。

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here
<%
	//将当前项目的路径上下文获取。 在下面需要路径的地方直接使用 不因为路径的改变而出错
	pageContext.setAttribute("APP_PATH", request.getContextPath());
%>
 


	
   

    4、直接根据不同的功能模块在不同的jsp页面中实现不同的功能,通过controller判断请求找到service使用dao操作数据mysql

controller 和 service  如下:

自己练习一个ssm为主的项目_第20张图片

下面放jsp页面 controller和service的代码

    1、  员工信息展示页面 也是主页面 还需要通过selectEmp.jsp将查询到的数据进行分页的操作 所以有两步

    welcome.jsp中有一些功能代码是给其他的jsp调用而存在的共有模块:例:部门信息获取  校验提示模块

        a、welcome.jsp

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




<%@ include file="deleteEmp.jsp"%>
<%--   --%>
<%--   --%>




员工信息
<%
	//将当前项目的路径上下文获取。 在下面需要路径的地方直接使用 不因为路径的改变而出错
	pageContext.setAttribute("APP_PATH", request.getContextPath());
%>







	
	

SSM_CRUD

# empName gender email deptName 操作

    b、selectEmp.jsp 将员工数据查询出来,分页展示在welcome.jsp页面

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




员工查询
<%
	//将当前项目的路径上下文获取。 在下面需要路径的地方直接使用 不因为路径的改变而出错
	pageContext.setAttribute("APP_PATH", request.getContextPath());
%>







	
	
	


2、insertEmp.jsp 增加功能

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




员工增加
<%
	//将当前项目的路径上下文获取。 在下面需要路径的地方直接使用 不因为路径的改变而出错
	pageContext.setAttribute("APP_PATH", request.getContextPath());
%>







	
	

3、deleteEmp.jsp 删除功能,单个删除和批量删除

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





员工删除
<%
	//将当前项目的路径上下文获取。 在下面需要路径的地方直接使用 不因为路径的改变而出错
	pageContext.setAttribute("APP_PATH", request.getContextPath());
%>









	

4、updateEmp.jsp 更新功能模块

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




员工修改
<%
	//将当前项目的路径上下文获取。 在下面需要路径的地方直接使用 不因为路径的改变而出错
	pageContext.setAttribute("APP_PATH", request.getContextPath());
%>







	
	

5、selectByempName.jsp  根据名字进行模糊查询功能模块

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




员工姓名查询
<%
	//将当前项目的路径上下文获取。 在下面需要路径的地方直接使用 不因为路径的改变而出错
	pageContext.setAttribute("APP_PATH", request.getContextPath());
	String name = request.getParameter("name");
%>







模糊查询

# empName gender email deptName 操作
${employee.empId } ${employee.empName } ${employee.gender=="M"?"男":"女" } ${employee.email } ${employee.dept.deptName }
当前${pageInfo.pageNum }页总${pageInfo.pages }页总${pageInfo.total }条记录

6、error.jsp根据名字查不到员工数据,一个提示页面。然后进行计时跳转主页

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


<%
	//将当前项目的路径上下文获取。 在下面需要路径的地方直接使用 不因为路径的改变而出错
	pageContext.setAttribute("APP_PATH", request.getContextPath());
%>
 


	
   


7、controller 代码

    EmployeeController.java

package cn.qyl.ssmcrud.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.PathVariable;
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.bind.annotation.ResponseBody;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

import cn.qyl.ssmcrud.pojo.Employee;
import cn.qyl.ssmcrud.pojo.Msg;
import cn.qyl.ssmcrud.service.EmployeeService;

@Controller
@RequestMapping("/emps")
public class EmployeeController {

	@Autowired
	EmployeeService employeeService;

	@RequestMapping("/selectAll")
	@ResponseBody // json字符串 注解
	public Msg getEmps(@RequestParam(value = "pn", defaultValue = "1") Integer pn) {
		// 调用分页插件
		PageHelper.startPage(pn, 5);
		// 查询数据
		List emps = employeeService.getAll();
		// 数据进行分页操作,连续展示5页的数据
		PageInfo info = new PageInfo<>(emps, 5);

		// success()是静态方法,add()是非静态方法,不能直接调用add()方法
		return Msg.success().add("pageInfo", info);
	}

	// 新增用户
	// 测试用。。。。功能简单
	// @RequestMapping(value = "/insertemp1", method = RequestMethod.POST)
	//
	// @ResponseBody
	// public Msg insertemp(Employee employee) {
	// String empName = employee.getEmpName();
	// boolean b = employeeService.yanzhengUser(empName);
	// if (b) {
	//
	// employeeService.saveemp(employee);
	// return Msg.success();
	// } else {
	// return Msg.fail().add("yz_msg", "用户名重复");
	// }
	// }

	// 验证前台用户名是否重复
	@RequestMapping(value = "/checkuser", method = RequestMethod.POST)
	@ResponseBody
	public Msg change(@RequestParam("empName") String empName) {
		// 首先验证下是否符合规范,和在前台有些许不同
		String regx = "(^[a-zA-Z0-9_-]{6,16}$)|(^[\\u2E80-\\u9FFF]{2,5})";
		// String 自带的验证方法
		// 验证有两种的结果。一种是就不符合命名规则,另一种是符合,但是用户名重复
		// 最后才是用户名可用
		if (!empName.matches(regx)) {
			return Msg.fail().add("yz_msg", "用户名必须是2-5中文或者6-16英文字母和数字组合");
		}
		// 验证用户名是否重复。创建一个方法,调用mapper中提供的方法,有一样的名字,即重复,返回false 不重复返回false
		boolean b = employeeService.yanzhengUser(empName);
		if (b) {

			return Msg.success();
		} else {
			return Msg.fail().add("yz_msg", "用户名重复");
		}
	}

	/**
	 * jsr303校验 避免前台的漏洞 绕过了前台的校验 BindingResult jsr303提供的方法
	 * 
	 * @param ids
	 * @return
	 */
	// 新增用户
	@RequestMapping("/insertemp2")

	@ResponseBody
	public Msg jsr303(@Valid Employee employee, BindingResult result) {
		// 在javabean中 EmpLoyee中的使用的jsr303校验校验如果失败,应该返回失败信息,在模态框中显示校验失败的提示信息
		// 如果校验失败 // 封装提示信息 前台获取使用
		change(employee.getEmpName());
		if (result.hasErrors()) {
			Map map = new HashMap();
			// 获取在Employee里面 校验失败的信息 result.getFieldErrors();
			List error = result.getFieldErrors();
			// 遍历每一个错误信息
			for (FieldError fieldError : error) {
				// 将错误的字段名 和 错误信息 都打印出来 System.out.println("错误字段名:" +fieldError.getField());
				// System.out.println("错误信息:" +fieldError.getDefaultMessage());
				// 将每一个错误的字段名 和 错误信息 放入map集合种
				map.put(fieldError.getField(), fieldError.getDefaultMessage());
			}
			return Msg.fail().add("errorFields", map);
		} else {
			employeeService.saveemp(employee);
			return Msg.success();
		}
	}

	// 单个删除
	/*
	 * 批量删除功能做好后不再使用该方法
	 * 
	 * @RequestMapping(value = "/emp/{empId}", method = RequestMethod.DELETE)
	 * 
	 * @ResponseBody // @PathVariable 将路径中的/emp/{empId} 的empid值拿到手 public Msg
	 * deletebyId(@PathVariable("empId") Integer id) {
	 * employeeService.deleteById(id); return Msg.success(); }
	 */

	// 批量删除
	@RequestMapping(value = "/emp/{empIds}", method = RequestMethod.DELETE)
	@ResponseBody
	public Msg deleteAll(@PathVariable("empIds") String ids) {
		// 将请求路径中的ids字符串进行拆分,获取被删除的id值
		// 如果包含- 说明是多个id值组合
		// 要将一个字符串ids拆分为字符串数组。再将每个字符串格式化为integer装入list集合中,作为条件传入service中
		if (ids.contains("-")) {
			List int_ids = new ArrayList();
			String[] string_ids = ids.split("-");
			for (String string : string_ids) {
				int_ids.add(Integer.parseInt(string));
			}
			employeeService.deletAll(int_ids);

		} else {
			// 否则调用单个删除的方法
			Integer id = Integer.parseInt(ids);
			employeeService.deleteById(id);
		}
		return Msg.success();
	}

	// 单个查询,将员工数据传回去,进行修改用
	@RequestMapping(value = "/emp/{empId}", method = RequestMethod.GET)
	@ResponseBody
	public Msg getById(@PathVariable("empId") Integer id) {
		Employee employee = employeeService.selectById(id);
		return Msg.success().add("emp", employee);
	}

	// 修改
	@RequestMapping(value = "/emp/{empId}", method = RequestMethod.PUT)
	@ResponseBody
	// 更新前台传递的对象。通过id确认对象
	public Msg updateById(Employee employee) {
		employeeService.updateById(employee);
		return Msg.success();
	}

	// 查询 模糊查询
	@RequestMapping("/selectByName")
	public String getByempName(@RequestParam(value = "empName", required = false) String empName,
			@RequestParam(value = "pn", defaultValue = "1") Integer pn, Model model, HttpServletRequest req,
			HttpServletResponse resp) throws IOException, ServletException {
		// 判断传递过来的用户名是否存在,分两步走 因为模糊查询,名字输入可能不规范。不适合直接调用上面的验证用户名是否重复的验证方法
		req.setAttribute("name", empName);
		boolean bs = employeeService.selectUser(empName);
		// 如果bs==true;说明用户名存在 调用模糊查询方法。和 分页插件 返回前台进行数据展示
		if (bs) {
			// 进行分页
			PageHelper.startPage(pn, 5);
			List empByName = employeeService.selectByName(empName);
			PageInfo info = new PageInfo<>(empByName, 5);
			model.addAttribute("pageInfo", info);
			return "selectByempName";
		} else {
			// 用户不存在,返回提示用户不存在
			return "error";
		}
	}

	/**
	 * 使用分页插件, 获取后才员工信息,将分页设置信息和员工信息一起传递给前台
	 * 
	 * @return 返回员工list信息,和分页设置信息
	 */
	/*
	 * public String getEmps(@RequestParam(value = "pn", defaultValue = "1") Integer
	 * pn, Model model) { // 调用分页插件 PageHelper.startPage(pn, 5); // 查询数据
	 * List emps = employeeService.getAll(); // 数据进行分页操作,连续展示5页的数据
	 * PageInfo info = new PageInfo<>(emps, 5); model.addAttribute("info", info);
	 * return "查询页面"; }
	 */

}

    DeptController.java

package cn.qyl.ssmcrud.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import cn.qyl.ssmcrud.pojo.Dept;
import cn.qyl.ssmcrud.pojo.Msg;
import cn.qyl.ssmcrud.service.DeptService;

@Controller
public class DeptController {

	@Autowired
	DeptService deptService;

	@RequestMapping("/depts")
	@ResponseBody
	public Msg selectAll() {
		List depts = deptService.selectAll();
		return Msg.success().add("dept", depts);
	}

}

EmployeeService.java

package cn.qyl.ssmcrud.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import cn.qyl.ssmcrud.dao.EmployeeMapper;
import cn.qyl.ssmcrud.pojo.Employee;
import cn.qyl.ssmcrud.pojo.EmployeeExample;
import cn.qyl.ssmcrud.pojo.EmployeeExample.Criteria;

@Service
public class EmployeeService {

	@Autowired
	EmployeeMapper employeeMapper;

	// 全部查询,不带条件。所以放入null
	public List getAll() {
		return employeeMapper.selectByExampleWithDpet(null);
	}

	// 单个删除
	public void deleteById(Integer id) {
		employeeMapper.deleteByPrimaryKey(id);
	}

	// 批量删除
	public void deletAll(List int_ids) {
		EmployeeExample example = new EmployeeExample();
		// 该条件等同sql中 delete from xxx where emp_id id(1,2,3)
		Criteria criteria = example.createCriteria().andEmpIdIn(int_ids);
		employeeMapper.deleteByExample(example);
	}

	public Employee selectById(Integer id) {
		return employeeMapper.selectByPrimaryKey(id);
	}

	// 更新
	public void updateById(Employee employee) {
		employeeMapper.updateByPrimaryKeySelective(employee);

	}

	// 新增
	public void saveemp(Employee employee) {
		employeeMapper.insertSelective(employee);

	}

	// 判断用户名是否重复或者存在
	public boolean yanzhengUser(String empName) {
		EmployeeExample example = new EmployeeExample();
		Criteria criteria = example.createCriteria();
		// 通过提供的方法判断是否有用户名一样的
		criteria.andEmpNameEqualTo(empName);
		// employeeMapper.countByExample(example)校验符合这个规则的数据有几个
		// >0 说明存在, =0 说明不存在
		long count = employeeMapper.countByExample(example);
		// 如果验证的结果==0 返回的就是true 说明用户名不存在
		return count == 0;
	}

	// 先判断模糊查询的结果,是否存在
	public boolean selectUser(String empName) {
		// 判断模糊查询到 结果
		// 根据模糊查询的list集合的长度进行判断
		EmployeeExample example = new EmployeeExample();
		example.createCriteria().andEmpNameLike("%" + empName + "%");

		List list = employeeMapper.selectByExampleWithDpet(example);
		if (list.size() > 0) {
			// 说明存在数据,返回true
			return true;
		} else {
			return false;
		}
	}

	// 根据输入的name信息进行模糊查询。返回list集合
	public List selectByName(String empName) {
		// 上接 controller中判断,模糊查询到 结果存在,获取模糊查询后的结果
		EmployeeExample example = new EmployeeExample();
		example.createCriteria().andEmpNameLike("%" + empName + "%");

		List list = employeeMapper.selectByExampleWithDpet(example);
		return list;
	}

}

DeptService.java

package cn.qyl.ssmcrud.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import cn.qyl.ssmcrud.dao.DeptMapper;
import cn.qyl.ssmcrud.pojo.Dept;

@Service
public class DeptService {
	@Autowired
	DeptMapper deptMapper;

	public List selectAll() {
		return deptMapper.selectByExample(null);
	}

}

六、页面效果

自己练习一个ssm为主的项目_第21张图片

新增

自己练习一个ssm为主的项目_第22张图片


修改

自己练习一个ssm为主的项目_第23张图片


模糊查询效果

自己练习一个ssm为主的项目_第24张图片

莫道君行早,更有早行人

    --END--



你可能感兴趣的:(自己练习一个ssm为主的项目)