云南省建设测量员注册网站,湖南岳阳网站开发网络公司,做网站的 需要续费维护费吗,蒙牛网站是谁做的目录 一、SSM整合1.1 步骤分析1.2 常见疑惑1.3 准备工作1.4 相关配置1.5 编写Controller,Service#xff0c;Dao 二、案例2.1 响应格式统一2.2 查询所有用户2.3 分页查询用户2.4 插入用户2.5 删除用户2.6 更新用户 三、异常统一处理四、拦截器五、声明式事务六、AOP 一、SSM整… 目录 一、SSM整合1.1 步骤分析1.2 常见疑惑1.3 准备工作1.4 相关配置1.5 编写Controller,ServiceDao 二、案例2.1 响应格式统一2.2 查询所有用户2.3 分页查询用户2.4 插入用户2.5 删除用户2.6 更新用户 三、异常统一处理四、拦截器五、声明式事务六、AOP 一、SSM整合
1.1 步骤分析
①Spring整合上Mybatis 把Service层Dao层都注入Spring容器中 ②引入配置SpringMVC 把Controller层注入SpringMVC容器中 ③让web项目启动时自动读取Spring配置文件来创建Spring容器 可以使用ContextLoaderListener来实现Spring容器的创建。 1.2 常见疑惑 为什么要用两个容器 因为Controller如果不放在MVC容器中会没有效果无法处理请求。而Service如果不放在Spring容器中声明式事务也无法使用。 SpringMVC容器中的Controller需要依赖Service能从Spring容器中获取到所依赖的Service对象嘛 Spring容器相当于是父容器MVC容器相当于是子容器。子容器除了可以使用自己容器中的对象外还可以使用父容器中的对象。 是如何实现这样父子容器的关系的 具体可以看源码解析阶段的视频。但是我们目前可以用代码模拟下。 是什么时候让两个容器产生这种父子容器的关系的 在ContextLoaderListener中会在创建好容器后把容器存入servletContext域。这样在DispatcherServlet启动时创建完SpringMVC容器后会从servletContext域中获取到Spring容器对象设置为其父容器,这样子容器就能获取到父容器中的bean了。详情请见源码解析视频。
1.3 准备工作
引入所有依赖 !--Spring-context--dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.1.9.RELEASE/version/dependency!--AOP相关依赖--dependencygroupIdorg.aspectj/groupIdartifactIdaspectjweaver/artifactIdversion1.8.13/version/dependency!-- spring-jdbc --dependencygroupIdorg.springframework/groupIdartifactIdspring-jdbc/artifactIdversion5.1.9.RELEASE/version/dependency!-- mybatis整合到Spring的整合包 --dependencygroupIdorg.mybatis/groupIdartifactIdmybatis-spring/artifactIdversion2.0.4/version/dependency!--mybatis依赖--dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.4/version/dependency!--log4j依赖打印mybatis日志--dependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.17/version/dependency!--日志--dependencygroupIdch.qos.logback/groupIdartifactIdlogback-classic/artifactIdversion1.2.3/version/dependency!--分页查询pagehelper--dependencygroupIdcom.github.pagehelper/groupIdartifactIdpagehelper/artifactIdversion4.0.0/version/dependency!--mysql驱动--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.47/version/dependency!-- druid数据源 --dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.1.16/version/dependency!-- junit --dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/version/dependency!-- spring整合junit的依赖 --dependencygroupIdorg.springframework/groupIdartifactIdspring-test/artifactIdversion5.1.9.RELEASE/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.12/versionscopeprovided/scope/dependency!-- servlet依赖 --dependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion3.1.0/versionscopeprovided/scope/dependency!--springmvc的依赖--dependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.1.9.RELEASE/version/dependency!-- jackson帮助进行json转换--dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.9.0/version/dependency!--commons文件上传如果需要文件上传功能需要添加本依赖--dependencygroupIdcommons-fileupload/groupIdartifactIdcommons-fileupload/artifactIdversion1.4/version/dependency!-- Spring5和Thymeleaf整合包--dependencygroupIdorg.thymeleaf/groupIdartifactIdthymeleaf-spring5/artifactIdversion3.0.12.RELEASE/version/dependency1.4 相关配置
①整合Spring和Mybatis 在resources目录下创建Spring核心配置文件 applicationContext.xml 内容如下
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/context xmlns:txhttp://www.springframework.org/schema/txxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd!--扫描组件除控制层--context:component-scan base-packagecom.lxcontext:exclude-filter typeannotation expressionorg.springframework.stereotype.Controller//context:component-scan!--引入jdbc.properties配置文件--context:property-placeholder locationclasspath:jdbc.properties/context:property-placeholder!--配置数据源--bean iddataSource classcom.alibaba.druid.pool.DruidDataSourceproperty namedriverClassName value${jdbc.driver}/propertyproperty nameurl value${jdbc.url}/propertyproperty nameusername value${jdbc.username}/propertyproperty namepassword value${jdbc.password}/property/bean!--配置事务管理器--bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManagerproperty namedataSource refdataSource/property/bean!--开启事务的注解驱动将使用注解Transactional标识的方法或类中所有的方法进行事务管理--tx:annotation-driven transaction-managertransactionManager/tx:annotation-driven!--配置SqlSessionFactoryBean,可以直接在Spring的IOC中获取SqlSessionFactory--bean classorg.mybatis.spring.SqlSessionFactoryBean!--设置MyBatis的核心配置文件的路径--property nameconfigLocation valueclasspath:mybatis-config.xml/property!--设置数据源--property namedataSource refdataSource/property!--设置类型别名所对应的包--property nametypeAliasesPackage valuecom.lx.pojo/property!--设置映射文件的路径只有映射文件的包和mapper接口的包不-致时需要设置--!-- property namemapperlocations valueclasspath:mappers/*.xml/property--/bean!--开启aop注解支持--aop:aspectj-autoproxy/aop:aspectj-autoproxy!--配置mapper接口的扫描可以将指定包下所有的mapper接口通过sqlSession创建代理实现类对象,并将这些对象交给IOC容器管理--bean classorg.mybatis.spring.mapper.MapperScannerConfigurerproperty namebasePackage valuecom.lx.mapper/property/bean
/beans在resources目录下创建jdbc.properties 文件内容如下:
jdbc.drivercom.mysql.cj.jdbc.Driver
jdbc.urljdbc:mysql://127.0.0.1:3306/ssm_db?serverTimezoneUTC
jdbc.usernameroot
jdbc.passwordroot在resources目录下创建mybatis-config.xml 内容如下
?xml version1.0 encodingUTF-8 ?
!DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd
configurationsettings!--将下划线映射为驼峰--setting namemapUnderscoreToCamelCase valuetrue//settings!--配置分页插件--pluginsplugin interceptorcom.github.pagehelper.PageInterceptor/plugin/plugins
/configuration在resources目录下创建log4j.xml内容如下
?xml version1.0 encodingUTF-8 ?
!DOCTYPE log4j:configuration SYSTEM log4j.dtd
log4j:configuration xmlns:log4jhttp://jakarta.apache.org/log4j/appender nameSTDOUT classorg.apache.log4j.ConsoleAppenderparam nameEncoding valueUTF-8 /layout classorg.apache.log4j.PatternLayoutparam nameConversionPattern value%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n //layout/appenderlogger namejava.sqllevel valuedebug //loggerlogger nameorg.apache.ibatislevel valueinfo //loggerrootlevel valuedebug /appender-ref refSTDOUT //root
/log4j:configuration②SpringMVC配置文件 在resources目录下创建springmvc.xml 内容如下
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:mvchttp://www.springframework.org/schema/mvcxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd!--扫描控制层组件--context:component-scan base-packagecom.lx.controller/context:component-scan!--配置Thymeleaf视图解析器,前后端不分离项目使用--bean idviewResolver classorg.thymeleaf.spring5.view.ThymeleafViewResolverproperty nameorder value1/property namecharacterEncoding valueUTF-8/property nametemplateEnginebean classorg.thymeleaf.spring5.SpringTemplateEngineproperty nametemplateResolverbean classorg.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver!-- 视图前缀--property nameprefix value/WEB-INF/templates//!--视图后缀--property namesuffix value.html/property nametemplateMode valueHTML5/property namecharacterEncoding valueUTF-8 //bean/property/bean/property/bean!--配置默认的servlet处理静态资源--mvc:default-servlet-handler /!--开启mvc注解驱动,解决响应乱码--mvc:annotation-drivenmvc:message-convertersbean classorg.springframework.http.converter.StringHttpMessageConverterconstructor-arg valueutf-8//bean/mvc:message-converters/mvc:annotation-driven!--配置视图控制器 前后端不分离项目使用--mvc:view-controller path/ view-nameindex/mvc:view-controller!--配置文件上传解析器 前后端不分离项目使用--bean idmultipartResolver classorg.springframework.web.multipart.commons.CommonsMultipartResolver/bean
/beans③Spring整合入web项目,配置web,xml ~~~~~~ 让web项目启动的时候就能够创建Spring容器。可以使用Spring提供的监听器ContextLoaderListener所以我们需要再web.xml中配置这个监听器,并且配置上Spring配置文件的路径。 web.xml
!DOCTYPE web-app PUBLIC-//Sun Microsystems, Inc.//DTD Web Application 2.3//ENhttp://java.sun.com/dtd/web-app_2_3.dtd web-appdisplay-nameArchetype Created Web Application/display-name!--配置spring的编码过滤器--filterfilter-nameCharacterEncodingFilter/filter-namefilter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-classinit-paramparam-nameencoding/param-nameparam-valueUTF-8/param-value/init-paraminit-paramparam-nameforceEncoding/param-nameparam-valuetrue/param-value/init-param/filterfilter-mappingfilter-nameCharacterEncodingFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping!--配置处理请求方式的过滤器,前后端不分离使用--filterfilter-nameHiddenHttpMethodFilter/filter-namefilter-classorg.springframework.web.filter.HiddenHttpMethodFilter/filter-class/filterfilter-mappingfilter-nameHiddenHttpMethodFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping!--配置springmvc的前端控制器--servletservlet-nameDispatcherServlet/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-classinit-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:springmvc.xml/param-value/init-param!--将DispatcherServlet的初始化时间提前到服务器启动时--load-on-startup1/load-on-startup/servletservlet-mappingservlet-nameDispatcherServlet/servlet-nameurl-pattern//url-pattern/servlet-mapping!--配置Spring的监听器在服务器启动时加载Spring的配置文件--listenerlistener-classorg.springframework.web.context.ContextLoaderListener/listener-class/listener!--设置Spring配置文件自定义的位置和名称--context-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:applicationContext.xml/param-value/context-param
/web-app
1.5 编写Controller,ServiceDao
我们来编写根据id查询用户的接口来进行测试 Controller层
RestController
public class UserController {Autowiredprivate UserService userService;GetMapping(/user/{id})public User findById(PathVariable(id) Integer id){User user userService.findById(id);return user;}
}Service层
public interface UserService {User findById(Integer id);
}Service
public class UserServiceImpl implements UserService {Autowiredprivate UserDao userDao;public User findById(Integer id) {return userDao.findById(id);}
}Dao层
public interface UserDao {/*** 根据id查询用户* param id* return*/User findById(Integer id);
}mapper.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.lx.dao.UserDaoselect idfindById resultTypecom.lx.domain.Userselect * from user where id #{id}/select
/mapper二、案例
2.1 响应格式统一 ~~~~~~ 我们要保证一个项目中所有接口返回的数据格式的统一。这样无论是前端还是移动端开发获取到我们的数据后都能更方便的进行统一处理。 ~~~~~~ 所以我们定义以下结果封装类
JsonInclude(JsonInclude.Include.NON_NULL)
public class ResponseResultT {/*** 状态码*/private Integer code;/*** 提示信息如果有错误时前端可以获取该字段进行提示*/private String msg;/*** 查询到的结果数据*/private T data;public ResponseResult(Integer code, String msg) {this.code code;this.msg msg;}public ResponseResult(Integer code, T data) {this.code code;this.data data;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg msg;}public T getData() {return data;}public void setData(T data) {this.data data;}public ResponseResult(Integer code, String msg, T data) {this.code code;this.msg msg;this.data data;}
}2.2 查询所有用户
RestController
public class UserController {Autowiredprivate UserService userService;//省略其他无关代码GetMapping(/user)public ResponseResult findAll(){ListUser list userService.findAll();return new ResponseResult(200,操作成功,list);}
}public interface UserService {User findById(Integer id);ListUser findAll();
}Service
public class UserServiceImpl implements UserService {Autowiredprivate UserDao userDao;//省略其他无关代码public ListUser findAll() {return userDao.findAll();}
}public interface UserDao {//省略其他无关代码ListUser findAll();
}?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.lx.dao.UserDaoselect idfindAll resultTypecom.lx.domain.Userselect * from user/select
/mapper2.3 分页查询用户 ~~~~~~ 分页查询的结果除了要包含查到的用户数据外还要有当前页数每页条数总记录数这些分页数据。
分页数据封装类
public class PageResultT {private Integer currentPage;private Integer pageSize;private Integer total;private ListT data;public PageResult(Integer currentPage, Integer pageSize, Integer total, ListT data) {this.currentPage currentPage;this.pageSize pageSize;this.total total;this.data data;}public Integer getCurrentPage() {return currentPage;}public void setCurrentPage(Integer currentPage) {this.currentPage currentPage;}public Integer getPageSize() {return pageSize;}public void setPageSize(Integer pageSize) {this.pageSize pageSize;}public Integer getTotal() {return total;}public void setTotal(Integer total) {this.total total;}public ListT getData() {return data;}public void setData(ListT data) {this.data data;}
}RestController
public class UserController {Autowiredprivate UserService userService;GetMapping(/user/{pageSize}/{pageNum})public ResponseResult findByPage(PathVariable(pageSize) Integer pageSize,PathVariable(pageNum) Integer pageNum){PageResult pageResult userService.findByPage(pageSize,pageNum);return new ResponseResult(200,操作成功,pageResult);}}Service
public class UserServiceImpl implements UserService {Autowiredprivate UserDao userDao;public PageResult findByPage(Integer pageSize, Integer pageNum) {PageHelper.startPage(pageNum,pageSize);ListUser list userDao.findAll();PageInfo pageInfo new PageInfo(list);PageResult pageResult new PageResult(pageInfo.getPageNum(),pageInfo.getPageSize(), (int) pageInfo.getTotal(),list);return pageResult;}
}2.4 插入用户 PostMapping(/user)public ResponseResult insertUser(RequestBody User user){userService.insertUser(user);return new ResponseResult(200,操作成功);}service层 void insertUser(User user);public void insertUser(User user) {userDao.insertUser(user);}Dao层
void insertUser(User user);在mapper映射文件中 insert idinsertUserinsert into user values(null,#{username},#{age},#{address})/insert2.5 删除用户
Controller层 DeleteMapping(/user/{id})public ResponseResult deleteUser(PathVariable(id) Integer id){userService.deleteUser(id);return new ResponseResult(200,操作成功);}Service层
在Service接口中增加方法定义 void deleteUser(Integer id);实现类中实现该方法: public void deleteUser(Integer id) {userDao.deleteUser(id);}Dao层
在接口中定义方法 void deleteUser(Integer id);在mapper映射文件中 delete iddeleteUserdelete from user where id #{id}/delete2.6 更新用户
Controller层 PutMapping(/user)public ResponseResult updateUser(RequestBody User user){userService.updateUser(user);return new ResponseResult(200,操作成功);}Service层
在Service接口中增加方法定义 void updateUser(User user);实现类中实现该方法: public void updateUser(User user) {userDao.updateUser(user);}Dao层
在接口中定义方法 void updateUser(User user);在mapper映射文件中 update idupdateUserupdate user set username #{username},age #{age},address #{address} where id #{id}/update三、异常统一处理
我们可以使用ControllerAdvice实现对异常的统一处理。让异常出现时也能返回响应一个JSON。
代码如下
ControllerAdvice
public class SGControllerAdvice {ExceptionHandler(Exception.class)ResponseBodypublic ResponseResult handleException(Exception e){return new ResponseResult(500,e.getMessage());}
}四、拦截器
public class MyHandlerInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(preHandle);return true;}public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(postHandle);}public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(afterCompletion);}
}springmvc.xml
!--配置拦截器--mvc:interceptorsmvc:interceptor!----mvc:mapping path/**/!--配置排除拦截的路径--!--mvc:exclude-mapping path//--!--配置拦截器对象注入容器--bean classcom.lx.interceptor.MyHandlerInterceptor/bean/mvc:interceptor/mvc:interceptors五、声明式事务
已经做好了相应的配置只要在service方法上加上注解即可Transactionalpublic void test() {userDao.insertUser(new User(null,test1,11,cc));
// System.out.println(1/0);userDao.insertUser(new User(null,test2,12,cc2));}六、AOP ~~~~~~ 注意自己去使用AOP进行增强时应该是对Service进行增强。不能对Controller进行增强因为切面类会被放入父容器而我们的Controller是在子容器中的。父容器不能访问子容器。 ~~~~~~ 并且我们如果需要对Controller进行增强使用拦截器也会更加的好用。
Aspect
Component
public class MyAspect {//定义切点Pointcut(execution(* com.sangeng.service..*.*(..)))public void pt(){}//进行增强Before(pt())public void before(){System.out.println(before);}
}