基础环境搭建
创建一个maven工程
引入项目依赖的jar包(pom.xml)
spring、springMVC、mybatis
数据库连接池、驱动包
mybatis逆向工程
其他(jstl、servlet-api、junit)
引入bootstrap前端框架
编写ssm整合的关键配置文件
配置web.xml:
启动spring容器:applicationContext.xml
src/main/resources/applicationContext.xml
springMVC的前端控制器,拦截所有请求:dispatcherServlet
src/main/webapp/WEB-INF/dispatcherServlet-servlet.xml
字符编码过滤器,一定要放在所有过滤器之前
使用Rest风格URI:将页面普通的post请求转为指定的delete或put请求
配置springMVC:包含网站跳转逻辑的控制、配置
dispatcherServlet:src/main/webapp/WEB-INF/dispatcherServlet-servlet.xml
只扫描控制器:
use-default-filters设为false(true为扫描所有)
配置视图解析器:方便页面返回
prefix : 是指访问页面的前缀,指定页面存放的文件夹
suffix : 是指文件的后缀名,常见的后缀名有html,jsp,php,txt,mp3
springMVC两个标准配置:
将springMVC不能处理的请求交给tomcat:mvc:default-servlet-handler
能支持springMVC更高级的一些功能:如映射动态请求、JSR303校验、快捷的ajax:mvc:annotation-driven
配置spring:主要配置与业务逻辑相关的内容
applicationContext.xml:src/main/resources/applicationContext.xml
核心点:配置数据源、与mybatis的整合、事务控制等
数据源:bean id="pooledDataSource"
连接数据库:jdbcUrl
数据库驱动:driverClass
用户名:user
密码:password
创建配置文件设置value:src/main/resources/dbconfig.properties
引入外部文件:
context:property-placeholder location="classpath:dbconfig.properties"
在该文件中取值:如value="${jdbc.jdbcUrl}"
扫描业务逻辑组件:component-scan
配置和mybatis的整合:sqlSessionFactory
指定mybatis全局配置文件:configLocation(mybatis-config.xml)
数据源:dataSource
指定mybatis的mapper文件位置:mapperLocations
(mapper/*.xml:扫描mapper下的所有文件)
配置扫描器,将mybatis接口的实现加入ioc容器
扫描所有dao接口的实现,加入ioc容器中:basePackage
事务控制配置:
事务管理器:transactionManager(DataSourceTransactionManager)
控制数据源即能管理事务:dataSource
开启基于注解的事务,使用xml配置形式的事务(主要都使用配置式)
aop:
切入点表达式:aop:pointcut->哪些方法要切入事务
配置事务增强:aop:advisor
配置事务增强,事务如何切入:tx:advice
所有的方法都是事务方法:tx:method name="*"
以get开始的所有的方法 :tx:method name="get*" read-only="true"
mybatis逆向工程:
mybatis-config.xml
全局配置:
configuration:将不好配置的settings放在全局配置文件中
驼峰命名规则:mapUnderscoreToCamelCase
类型别名:typeAliases
package name="com.atguigu.crud.bean":放入bean包方便引用
分页插件:plugin interceptor="com.github.pagehelper.PageInterceptor"
mapper文件:对应mapper接口(接口是dao层直接与数据库进行交互,增删改查)
使用mybatis逆向工程生成对应的bean和mapper:mybatis.generator.xml
引入jar包:org.mybatis.generator
创建配置文件:mybatis-generator.xml
配置数据库连接信息:jdbcConnection
指定javaBean的生成位置:javaModelGenerator
指定sql映射文件生成的位置:sqlMapGenerator
指定dao接口的生成位置,mapper接口:javaClientGenerator
指定每个表的生成策略:table
commentGenerator:
suppressAllComments属性值:
true:自动生成实体类、SQL映射文件时没有注释
false:自动生成实体类、SQL映射文件,并附有注释
建立测试文件:MybatisGeneratorTest.java
生成java.bean:example做复杂查询
生成java.dao:复杂的增删改查
生成resources.mapper.xml配置
mapper文件:.java中声明方法;.xml中实现方法
测试mapper:src/test/java/test/MapperTest.java
推荐spring的项目使用spring的单元测试,可以自动注入需要的组件
导入springtest模块
ContextConfiguration指定spring配置文件的位置
RunWith(SpringJUnit4ClassRunner.class)指定运用进行单元测试的模块
直接autowired要使用的组件即可
插入部门
生成员工数据,测试员工插入
批量插入多个员工,使用可以执行批量操作的sqlsession
在applicationContext.xml中配置可以执行批量的sqlsession查询:
访问index.jsp页面->页面发送查询员工列表请求->EmployeeController接受请求,查出员工数据->来到list页面进行展示
服务器将有效的数据以json的形式返回给客户端:使用ajax
index.jsp页面直接发送ajax请求进行员工分页数据的查询
服务器将查出的数据,以json字符串的形式返回给浏览器
浏览器收到js字符串,可以使用js对json进行解析,使用js通过dom增删改来改变页面
返回json,实现客户端的无关性(浏览器、安卓等)
使用一个msg通用的返回类,在bean下创建一个Msg.java(需用导入json包)
index使用js发送一个ajax请求,ajax请求要到员工数据后返回给js,js解析json数据,然后在页面进行显示
页面加载完成以后,直接发送ajax请求,要到分页数据
解析并显示员工数据
解析并显示分页信息
解析并显示分页条数据
使用Spring测试模块提供的测试请求功能,测试crud请求的正确性
spring4测试时,需要servlet3.0的支持
传入springMvc的ioc容器:@Autowired WebApplicationContext context;
虚拟mvc请求,获取处理结果:MockMvc
模拟请求拿到返回值
请求成功以后,请求域中会有pageInfo,可以取出pageInfo进行验证
获取员工数据
分页查询(不使用)
引入分页插件,在查询之前只需调用,传入页码以及每页的大小
使用pageinfo包装查询后的结果,只需将pageinfo交给页面,封装了详细的分页信息,包括查询出的数据,传入连续显示的页数
搭建bootstrap分页页面(不使用list.jsp)
web路径:
不以/开始的相对路径找资源,以当前资源的路径为基准,经常容易出问题
以/开始的相对路径找资源,以服务器的路径为标准,需要加上项目名
如http://localhost:3306/crud
使用pageContext.setAttribute("APP_PATH", request.getContextPath());
在取路径时,在开头使用${APP_PATH}+/+路径
以row为单位设置页面内容新增:
在index.jsp页面点击“新增”
弹出新增对话框
清除表单数据:表单完整重置,包括表单数据、表单样式
在数据库中查询部门列表,显示在对话框中
DepartmentService.java查询部门信息给controller
DepartmentController.java将数据返回给index.jsp
用户输入数据,完成保存
模态框中填写的表单数据提交给服务器进行保存(controller、service)
对要提交给服务器的数据进行JQuery前端校验
拿到要校验的数据,使用正则表达式
显示校验结果的提示信息
首先清除当前元素的校验状态
发送ajax请求校验用户名是否可用(controller、service)
先判断用户名是否是合法的表达式
再判断数据库用户名是否重复
判断之前的ajax用户名校验是否成功
后端校验JSR303:重要数据,进行唯一约束
支持JSR303校验,需要导入Hibernate-Validator包(pom.xml)
发送ajax请求保存员工(controller、service)
校验失败,应该返回失败,在模态框中显示校验失败的错误信息
校验成功,则返回成功
员工保存
如果成功:关闭模态框,来到最后一页,发送ajax请求显示刚才保存的数据
如果失败,则显示失败信息
URI:
/emp/{id} GET:查询员工
/emp POST:保存员工
/emp/{id} PUT:修改员工
/emp/{id} DELETE:删除员工修改:
点击编辑
在按钮创建之前就绑定了click,绑定的方式有两种
在创建按钮时绑定
绑定点击.on() //jQuery新版使用on,旧版使用.live()
查出部门信息,显示部门列表
查出员工信息,显示员工信息
把员工的id传递给模态框的更新按钮
弹出用户修改的模态框:显示用户信息
点击更新,完成用户修改
验证邮箱是否合法
发送ajax请求,保存更新员工信息
发送PUT请求时,请求体中的数据拿不到(request.getParameter),Tomcat检测到时PUT请求不会封装请求体中的数据为map,只有POST形式的请求才封装请求体为map
要能支持直接发送PUT之类的请求,还要封装请求体中的数据,配置HttpPutFormContentFilter,将请求体中的数据解析包装成一个map,reques被重新包装,request.getParameter()被重写,就会从自己封装的map中取数据删除:
删除单个:
URI:/emp/{id} DELETE
弹出删除对话框,发送ajax请求删除
删除多个:
attr获取checked时undefined,attr获取自定义属性的值
用prop获取和修改dom原生属性的值
全选/全不选:先判断当前选择元素是否选满,点击全部删除就批量删除,发送ajax请求总结:
前端用户界面UI使用bootstrap搭建,向界面发送请求,来到tomcat服务器
使用Tomcat作为servlet容器进行处理
当前项目收到请求后,使用SSM处理请求
SpringMVC前端控制器判断能不能处理请求:若能,则调用Controller控制器层某一个处理请求的方法;若不能,交给tomcat服务器(静态资源交给服务器直接返回);
controller调用service层的处理逻辑:若要进行数据库的交互,则调用Dao层的组件,Dao的组件都是用Mybatis写的,由mybatis生成的mapper直接与数据库进行交互,操纵数据库的增删改查
使用MybatisGenerator生成mapper接口、mapper文件,复杂的查询在基于mapper上定义一些新的方法
mapper能实现是因为项目启动时被扫描进ioc容器中,也因为组件之间都自动装配autowired,在spring容器中
大部分使用ajax请求,返回结果为json,使用js解析json数据在页面显示
项目中调用的jar包,都由maven自动导入到服务器中



