博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java | SSM简要笔记
阅读量:6410 次
发布时间:2019-06-23

本文共 6671 字,大约阅读时间需要 22 分钟。

最近有一个项目需要去做,在选择语言时确定用Java。首先是因为很长一段时间没有使用Java,再不重拾多半是要废了;再则是暑假准备找个实习了,首选肯定还是Java方向。

这篇文章主要是我复习SSM(SpringMVC,Spring,MyBatis)框架时所做的笔记,侧重于回忆和梳理,写得比较粗糙,适用于理解结构和快速上手。 所以本篇适合人群:有Java基础,对SSM框架有所了解但是基础不牢概念模糊者。

后面有空的话我会针对单个框架,写一些更加细节与原理有关的文章,帮助一些初学者,也使自己更加深入理解其中思想,毕竟这些都是开源世界的精髓!

Spring

最基本的几个jar包:

  • commons-logging
  • spring-beans
  • spring-context
  • spring-core
  • spring-expression

依赖注入

基本配置:resource/application-context

复制代码
复制代码

在函数中调用:

ApplicationContext context=new ClassPathXmlApplicationContext("./xx/xx/resource/application-context");User user=(User)context.getBean("user")//根据id获得User user=context.getrBean(User.Class)//根据类型获得复制代码

注解方式注入:

  1. 四大注解:
  • @Service:业务层
  • @Component:公共组件
  • @Controller:控制用户请求,SpringMVC核心注解
  • @Repository
  1. 需要jar包支持:
  • aopalliance
  • spring-sop
  • aspectjweaver
  1. 简单实现:
public  interface UserService{  void hello();}复制代码
@Servicepublic class UserServiceImpl implements UserService{  @override  public void hello(){  }}复制代码

此时,在使用了Service注解后,不需要再在resource/application-context.xml中声明bean,只需加入一个包扫描声明,即可将所有打上注解的组件读取。

复制代码

面向切面编程

统一组织代码,拦截某些方法,在其执行前后,做一些操作。一种基于注解,一种基于xml。

  • 基于注解
  1. 在application-context.xml中配置 <aop:aspectj-autoproxy>
  2. 新建一个切面
@Component@Aspect //声明切面public class UserAspect{  @PointCut(value="execution(* cn.jihangyu.service.*.*(..))")//声明切点以及切点所应用的范围  public void pointCut(){}  @After(value="pointCut()")//声明切点之后要做的  public void doAfter(JoinPoint joinPoint){//连接点,程序执行的点,多指程序的方法}  @Before(value="pointCut()")//声明切点之前要做的  public void doBefore(JoinPoint joinPoint){}  @AfterReturning(value="pointCut()",returning="result")//获取切点方法返回值的方法  public void afterReturning(JoinPoint joinPoint,Object result){}  @Around(value="pointCut()")//在整个运行过程中环绕运行  public void around(ProceedingJoinPoint proceedingJoinPoint){   proceedingJoinPoint.proceed();}  //等等}复制代码
  • 基于xml配置 在application-context.xml中
复制代码

切面编程原理

两种实现方式

  1. JDK的Proxy,InvocationHandler。 要求:必须实现接口 优势:使用反射,创建效率高。

  2. cglib,使用asm,有关字节码 基于继承 优势:执行效率高


####SpringMVC Browser-DispatcherServlet-HandlerMapping-Controller-Service-ModelAndView-Model-ViewResolver

需要:

  • 以上spring相关包
  • spring-web
  • spring-webmvc

配置:

  • /resource/spring-mvc.xml下 mvc:annotation-driven //注解驱动 context:component-scan base-package="cn.jihangyu.*.*"//包扫描
复制代码

//配置viewResolver

  • web.xml 下
test
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:XXX/resource/spring-mvc.xml
1
//优先级
复制代码
test
/
复制代码

//配置DispatcherServlet

GET,POST

  • 获取带参数Get 请求方式
@RequestMapping("/test/{id}/{name}")public String test(ModelMap modelMap,@PathVariable(“id”) Integer sid,@PathVariable String name){  //PathVariable 获取传过来值的参数名在不用(“”)标注的情况下,需要和传过来参数的名字一致,如@PathVariable String name;如业务对变量名有特殊需要,可使用@PathVariable(“id”) Integer sid方式。  //ModelMap是用来返回的model的map,其中放键值对即可。  return "user"//返回名为test的view}复制代码
  • 获取POST请求
@RequestMapping("/test")public String test(ModelMap modelMap,HttpServletRequest request){  String id=request.getParameter("id")  return "user"}复制代码

@RequestMapping("/test")public String test(ModelMap modelMap,User user){  //直接操作封装好的user对象  return "user"}复制代码
  • 使用阿里fastjson
  1. 导包
  2. /resource/spring-mvc.xml
//具体配置就不写了,随用随查
复制代码

//【重要】注意书写顺序,要写在全局<mvc:annotation-driven>/之前,否则会有406错误 3. 返回json数据体

@RequestMapping("/test")@ResponseBody//这个注解将会被上述配置的注解驱动识别,表示返回数据体public User test(){   User user=new User(20,"hanshijun");    return user;}复制代码
  1. 接收json数据体
@RequestMapping("/test")public String test(@RequestBody User user){        return "user";//返回view}复制代码

拦截器

  • 拦截器和过滤器的比较 拦截器:基于反射,和Spring结合紧密,可以拿到处理IOC中的bean。 过滤器:基于Servlet,基于函数回调,可以拦截所有请求。

  • 实现: /src/xxx/xxx/interceptor

public class TestInterceptor implements HandlerInterceptor{  //三个重写函数preHandler,postHandler,afterHandler}复制代码

/src/xxx/xxx/resource/spring-mvc.xml

//拦截所有请求
//拦截指定请求
复制代码

上传下载

  1. 导包 commons-io,commons-upload
  2. /src/xxx/xxx/resource/spring-mvc.xml
复制代码
  1. controller(上传)
@RequestMapping("/upload")public String upload(MultipartFile file,HttpServletRequest request){  String name=file.getOriginalFileName();  File uploadfile=new File("/"+name);  file.transFerTo(uploadfile);  return  "upload"}复制代码
  1. controller(下载)
@RequestMapping("download")public ResponseEntity
download(){ String path="e:/xxx.txt"; File file=new File(path); HttpHeaders headers=new HttpHeaders(); headers.setContentDispositionFormData("attachment",path); headers.setContentType(MediaType.TXT); return new ResponseEntity
(FileUtils.readFileToByteArray(file),headers,HttpStatus.CREATE);}复制代码

MyBatis

  1. 导包 mysql-connector,mybatis
  2. 流程 App-Configuration(AqlMapConfig.xml,Config.xml)-SqlSessionFactory-SqlSession-MappedStatements-Transaction
  3. 配置 jdbc.properties
jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/testjdbc.username=jdbc.password=复制代码

mybatis-cfg.xml

//读取数据库连接配置
//需要封装的实体
//配置环境
//指定mapper的位置
复制代码

UserMapper.xml

//主键
//其余字段和实体属性一一匹配
复制代码

Main.java

public static void main(String [] args){  InputStream in=Main.class.getResourceAsStream("resource/mybatis-cfg.xml");//加载配置文件  SQLSessionFactory factory=new SQLSessionFactoryBuilder().build(in);//构建工厂  SqlSesion session=factory.openSession();创建会话  UserMapper mappr=session.getMapper(UserMapper.class);  //可以开始调用mapper的操作数据库方法  session.commit();  session.close();}复制代码

SSM整合

  1. 导包 mybatis-spring druid连接池 spring-jdbc spring-tx管理事务
  2. spring-config.xml
//开启切面
//扫描组件注解
//读取配置文件//配置sqlsession工厂
//数据源位置
//mapper位置
//配置事务管理
//配置数据源(略)
//等等
复制代码
  1. spring-mvc.xml 同上文mvc配置

  2. web.xml

contextConfigLoader
cn/jihangyu/resource/spring-config.xml
org.springframework.web.context.ContextLoaderListener
复制代码

事务传播机制

springMVC作为spring的子容器,假如在springMVC配置文件中扫描全局注解,那么会将springMVC需要的除了controller以外的组件也扫描进去,而mvc子容器中扫描到的service是没用事务能力的,所以会造成sql回滚失败,导致数据库插入脏数据。

所以需要在mvc配置文件中扫描注解组件时加入额外的声明。

//声明除去service注解复制代码

事务传播机制有七种

  • REQUIRED:spring的默认事务传播级别,特点是,如果上下文已经存在事务,那么就加到事务中执行,如果不存在,就新建事务。
@Transactional("propagation=Propagation.REQUIRED")复制代码
  • 其他的遇到实际的业务场景手动查资料

转载地址:http://fzkra.baihongyu.com/

你可能感兴趣的文章
Java Web开发详解——XML+DTD+XML Schema+XSLT+Servlet 3.0+JSP 2.2深入剖析与实例应用
查看>>
topcoder srm 680 div1 -3
查看>>
具体数学第二版第四章习题(1)
查看>>
高效前端优化工具--Fiddler入门教程
查看>>
【翻译】我钟爱的HTML5和CSS3在线工具
查看>>
Java多线程学习(吐血超详细总结)
查看>>
css3 变形
查看>>
Win7 64bit 安装Mysql5 出错 无法启动服务。
查看>>
嵌入式 H264参数语法文档: SPS、PPS、IDR以及NALU编码规律
查看>>
初识Opserver,StackExchange的监控解决方案
查看>>
给大家讲解一下JavaScript与后台Java天衣无缝相结合
查看>>
探索HTML5之本地文件系统API - File System API
查看>>
javascript有用代码块(1)
查看>>
libevent 笔记
查看>>
PHP实现人人OAuth登录和API调用
查看>>
redis源码笔记 - initServer
查看>>
FindBugs工具常见问题
查看>>
ECSHOP报错误Deprecated: preg_replace(): The /e modifier is depr
查看>>
【iOS】iOS之Button segue弹出popOver消除(dismiss)问题
查看>>
java多线程系列5-死锁与线程间通信
查看>>