spring+springmvc+mybatis
SSM
spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架
SpringMVC分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架
1. spring框架
核心组件:版本4.3.12
spring-core
spring-context
spring-beans
spring-expression
2. spring框架核心组件
core,beans,context,spEL(核心,Bean,上下文,表达式)
在maven项目中添加四个组件的依赖
创建有关联关系的bean java OOP中bean之间的关系(UML:泛化,实现,依赖,关联(聚合,组合))
泛化:子类继承父类
实现:接口和实现类
依赖:一类中的方法参数类型是另一个类
关联:聚合和合成
聚合:关联关系是可以分割的
合成:关联关系是不可分割的
在项目中添加spring核心配置文件
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http:
</beans>
主要元素<bean>
包括:
<bean id="ybook" class="demo.YellowBook">
负责管理bean,实例化bean id用于唯一标识,class用于指定bean全路径
<bean><property name="bname" value="曹雪芹">
name找寻bean中属性对应的set方法,value赋值可以用于简单类型(8种基本数据类型+字符串),属于单例模式 ,只产生一块内存
<constructor-arg name="color" value="绿">
constructor-arg用于注入构造参数的值,name表示注入的属性名称,value用于注入简单类型的值
spring测试包以注解方式引入spring框架中 @RunWith(SpringJUnit4ClassRunner.class)
Junit注解 @ContextConfiguration({"/app2.xml","..."})
引入spring配置文件 @Autowired
在类中,表示按当前类的类型在spring中查询已经实例化的bean @Qualifier("p")
在@Autowired之后,表示指定spring中的bean的name,可省略 @Test
同junit用法
3. Spring生命周期
scope表示bean的创建方式,取值为:
singleton,默认,单例模式
prototype,原型模式,为每次请求创建新的bean实例
request,开发web时bean的生命周期为一次请求
session,同上,一次会话
portal,web项目中spring提供的portal组件(门户级别项目)
autowire表示自动注入的属性,取值为:
autowire表示自动注入的属性值
no,默认,不自动注入
byName,按属性名自动注入
byType,按类型自动注入
constructor,对应构造方法按类型自动注入
创建新的<bean>
<bean id="tea" class="demo04.TeaA"></bean>
id对应name,class对应type
destroy-method表示销毁的方法,即结束生命周期
4. spring注解与xml结合的方式注入
加载spring上下文环境,首先加载spring配置文件
如果配置是基于注解,需要对原有xml进行修改,添加两部分内容
添加context的验证,是注解配置的基础 xmlns:context=”http://www.springframework.org/schema/context” http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
添加到验证指定部分,与beans对应的位置,复制后修改为context
添加注解所在包(如控制器)的扫描 <context:component-scan base-package="controller包名"/>
包名支持多个包和子包
在扫描包所在的类上添加对应的注解 @Component("别名")
如果不写别名,默认加载为所在类的类名(字母小写)
在类中添加@Value("属性的值")
到属性上行,相当于为属性赋值省却了setter方法
通过@Autowired
按类型方式完成注入,类型可以为自定义bean
由于添加注解所在包扫描的时候写的是根包名,所以可以通过@Component
加载多个包,通过spring完成关联
5. spring aop
如何记录日志 java提供记录日志的组件,常用第三方日志组件
log4j
在maven中添加log4j组件(版本号1.2.17)
在src目录下创建log4j对应配置文件,名称log4j.properties
Logger log=Logger.getLogger(Book.class);
实例化日志对象
可以生成.log日志文件导出
spring aop理论基础
(Aspect-Oriented Programming)AOP面向切面编程
java代理模式,为了在被代理方法上下添加自定义代码
静态代理
动态代理
jdk提供动态代理
实现被代理对象操作模板(接口),实现该接口完成被代理类;
jdk1.0提供的动态代理,其核心是实现被代理对象方法的拦截
通过代理对象创建被代理对象,返回接口后,执行接口中的方法,完成代理
cglib动态代理(需要第三方组件支持) 不需要被代理类提供接口,原理是通过反射修改被代理对象内存的字节码,spring使用该组件
6. springMVC
MVC=(Model+View+Controller)(模型层+视图层+控制层)
模型层: 提供数据,如实体bean(po,包含get/set方法)
视图层: 提供展示,如html5,jsp
控制层: 接收客户端/浏览器传来的请求并转发给业务层处理,并跳转到新的视图层,如controller
业务层: service,负责处理控制器转发来的数据,通过调用实体bean,连接数据库等进行处理 配置文件: 放置xml文件,用于映射sql操作等
spring mvc框架需要两部分的依赖
spring web库
spring mvc库
spring mvc概述 spring mvc框架是围绕DispatcherServlet (前置控制器)开发的,
它负责从自定义的spring mvc配置文件中读取映射信息,映射信息包含(处理请求映射的句柄,视图处理模板等)
根据自定义配置文件映射句柄分发请求并调用指定处理模块(Model)
按照视图处理模板跳转到指定的视图
7. spring mvc开发详细步骤
添加spring的web和mvc依赖库
在当前web项目中添加spring mvc及spring web框架
修改/WEB-INF/web.xml文件,添加spring web配置和spring mvc核心DispatcherServlet映射
DispatcherServlet配置:
负责当前用户发起url请求,通过其核心分发器启动spring mvc
在web.xml中配置servlet使将url-pattern赋值为”/”表示所有的网址访问都调用MVC,在servlet-class赋值DispatcherServlet的全路径org.springframework.web.servlet.DispatcherServlet
配置替换默认spring-mvc配置文件的位置默认位置:WEB-INF/springmvc-servlet.xml contextConfigLocation对应springmvc自定义配置文件的路径,要求从WEB-INF/目录出发”/WEB-INF/classes/mvc/abc.xml”或者classpath:相当于(/WEB-INF/classes/)
任何项目不会孤立存在,需要与其他部分(业务bean,持久层)结合,需要配置spring web组合和其他部分进行结合
创建配置文件app-mvc.xml(resources文件夹下)
修改spring抬头context改为mvc下载规范
在web.xml中初始化加载app-mvc.xml配置文件 contextConfigLocation classpath:mvc/app-*.xml
配置自定义响应请求的控制器bean,通过spring2.5以后版本普遍支持的注解方式,上下文的组件包的扫描 <context:component-scan base-package="com.demo.controller"/>
导入包
配置资源跳转的统一模板
<bean class ="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name ="prefix" value ="/" > </property >
<property name ="suffix" value =".jsp" > </property >
//prefix前缀:统一规定跳转后页面的目录"/"表示在WEB-INF/下找网页
//suffix后缀:统一规定跳转页面的扩展名
自定义控制器
创建一个index.jsp(需加载jsp和servlet组件)
创建一个普通类,注解@Controller标识其为控制器
响应客户端请求@RequestMapping(“/hello”)表示网址为/hello时调用下边的方法,该注解需跟着方法,返回类型分为void,String,ModelAndView三种
void: 表示转发,转发到注解@RequestMapping(“/hello”)的hello.jsp
String: 普通情况则跳转到该字符串.jsp
8. 过滤器
不常用 创建一个普通类,实现Filter接口,重写doFilter方法,在web项目中称为过滤器 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
FilterChain能够识别请求的目标路径,通过这个对象能将请求继续发送
重定向实现拦截 HttpServletResponse r=(HttpServletResponse) response; r.sendRedirect(“”);
通过chain记住请求目标路径,继续请求发送 HttpServletRequest x=(HttpServletRequest) request; x.setCharacterEncoding(“UTF-8”);//在重新发送之前可以进行修改中文字符集 chain.doFilter(x, r);
常用 在web.xml中添加<filter>
,可以通过spring自带的encoding过滤器在web.xml中修改过滤器的字符集
<filter >
<filter -name>x</filter -name>
<filter -class>org.springframework.web.filter .CharacterEncodingFilter</filter -class>
<init-param >
<param -name>encoding</param -name>
<param -value >UTF-8 </param -value >
</init-param >
<init-param >
<param -name>forceRequestEncoding</param -name>
<param -value >true </param -value >
</init-param >
</filter >
<filter -mapping>
<filter -name>x</filter -name>
<servlet-name>springmvc</servlet-name>
</filter -mapping>
9. springmvc开发流程
添加依赖库
修改WEB-INF/web.xml,添加springMVC框架,添加springmvc核心控制器DispatcherServlet.为了将springmvc与相关业务Bean结合,需要添加添加spring配置信息
添加springmvc和spring配置文件
手工添加mvc中视图,自定义的控制器
10. springmvc工作原理
由客户端发送请求到前端控制器(DispatcherServlet),读取springmvc配置文件将请求的url按配置信息分发指定的自定义控制器(javaBean,@Controller,@RequestMapping)
自定义控制器调用业务bean(spring容器处理),存储业务数据(模型数据),自定义控制器的处理方法返回封装了模型数据和跳转URL对象,发送给前端控制器
前端控制器,安装springmvc中视图解析配置,安装自定义控制器返回的url路径,springmvc使用视图模板封装模型数据和跳转信息,传递给前端控制器
前端控制器通过节点视图模板对象,进行跳转到指定视图view
11. springmvc参数处理
从web容器中接收上下文环境对象 HttpServletRequest,HttpServletResponse,HttpSession
接收单值进行自动类型的转换 @RequestParam在参数前用于处理单值
自动封装POJO(简单的java对象)
通过springmvc提供存储状态对象
传统方式: HttpServletRequest,HttpSession
springmvc方式: Model,Map(存储范围request)
springmvc接收客户端发送的JSON格式数据,使用注解 @RequestBody 在参数前用于处理JSON
12. springmvc+spring结合的基本实现
案例:登录,验证用户名密码是否符合要求,符合则跳转到欢迎页面,否则跳转回登录页面
添加依赖库
修改WEB-INF/web.xml
需要添加spring配置,<context-param>
web环境启动时配置上下文的初始化参数信息
<context-param >
<param -name>contextConfigLocation</param -name>
<param -value >classpath:cfg/app-*.xml</param -value >
</context-param >
需要srpingweb组件与spring上下文结合,通过配置监听器<listener>
<listener >
<listener-class > org.springframework.web.context.ContextLoaderListener</listener-class >
</listener >
添加实体bean,用于提供用户名密码的get/set
添加业务Bean,用于验证用户传递信息是否能够登陆 需要添加到spring的上下文环境中,创建一个类添加注解@Service声明为业务Bean
添加开发视图创建登陆.jsp和欢迎.jsp
添加控制器 通过注解@Controller创建控制器类
13. springmvc控制器方法的返回类型
返回void,转发到与@RequestMapping的url上
返回普通String类型,转发到返回字符串上
返回redirect类型,重定向到关键字redirect:目标上 return "redirect:path"
返回forward类型,转发到关键字forwadrd:目标上 return "forward:path"
返回ModelAndView类型,转发到new ModelAndView(目标)上 必须经过new创建对象,可以通过对象的addObject方法存入key-value对(String,Object),存储范围为request ModelAndView m=new ModelAndView(“suc”); m.addObject(“String”,Object);
返回JSON类型,即ajax
14. spring+持久层框架(mybatis)
spring(核心)+spring-dao(提供事务管理)+第三方框架(hibernate,mybatis)
springmvc(web前端和控制器)+spring(结合控制器调用业务Bean,管理生命周期)+第三方持久层框架(hibernate,mybatis)
简称ssm或ssh
15. spring(core+dao)+mybatis结合
添加依赖库(spring基础库(core,context,beans,expression)+spring-aop(消除重复代码)+string-aop依赖包+spring-JDBC连接的jar(为持久层提供事务操作)+mybatis依赖库+JDBC连接的jar+mybatis-spring库)
提供spring和mybatis结合的配置文件(针对持久层操作)
提供数据源(连接池)连接池的分类:
托管环境: 使用应用服务器环境建立,管理,对外提供JNDI(java命名目录接口),在容器环境下运行的组件(jsp,servlet等),tomcat,jboss,weblogic,websphere
非托管环境: druid连接池(常用),dbcp,c3p0
配置映射文件xml
加载DruidDataSource(加载该类全路径),配置destroy-method属性,当连接关闭时,连接池会负责回收资源 <bean id="ds" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"/>
加载本地属性文件(db.properties) <context:property-placeholder location="db.properties" />
通过mybatis-spring组件创建SqlSessionFactoryBean(添加新的bean)
配置属性:dataSource,typeAliasesPackage,mapperLocations
<property name ="dataSource" ref ="ds" />
<property name ="typeAliasesPackage" value="com.sm.po" />
<property name ="mapperLocations" value="classpath:com/sm/mapper/*.xml" />
配置mybatis用于执行sql语句的映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
在该映射文件中添加<mapper>
在其中添加sql操作
依次关联SqlSessionTemplate向上关联SqlSessionFactoryBean向上关联DruidDataSource
测试 测试类需要添加spring注解junit和context两个 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({“/app-dao.xml”})
业务(事务 的处理)
应用项目中在业务层添加事务
为了支持spring的事务操作,在xml映射文件中添加tx模块
扫描业务Bean包(service)
添加spring-jdbc提供的事务管理器,用于产生事务对象
spring-jdbc提供tx标签下的advice定义事务通知对象,属性包括id(唯一标识),transaction-manager(引用已定义的事务对象Bean的标识)
事务的属性(tx:attributes):
tx:method对应指定方法名称,在对应方法上指定事务的特性
属性name=”方法名”(save*,update*,delete*),propagation=”required”事务对象有就用没就新建,rollback-for=”exception”报错时回滚
为查询方法单独设置,name=”select*”,propagation=”supports”,read-only=”true”只读
aop的编织,将事务属性和指定表达式的类中的方法进行关联
aop:config下的aop:advisor用于事务属性和切面点表达式的结合
属性pointcut=”execution(* com.ssm... (..)”)表示任意子包下任意类的任意方法,advice-ref=”事务tx:advice的id”
16. ssm+数据库
在mysql中创建数据库
在maven中加载mybatis插件MyBatis Generator,用于将数据库表在eclipse中生成实体类po
在MyBatis Generator网站下载的generatorConfig.xml文件,放入项目src/main/resources目录中并修改相关字段
classPathEntry: jdbc包的路径
jdbcConnection: 连接的数据库信息
javaModelGenerator: 对应生成表的实体类model包名和路径(src\main\java)
sqlMapGenerator: 对应生成xml文件的位置mapper包名和路径
javaClientGenerator: 生成操作接口和辅助类dao包名和路径
table: 映射物理表,输入数据库名,表名,实体类名
通过maven添加mybatis-generator-core依赖和mybatis-Generator-maven-plugin插件
将直连jdbc的库文件(.m2中mysql文件下的jar文件),mysql-connector-java-5.1.38.jar拷贝到项目根目录下
配置maven运行命令,在项目中maven build命令中添加Goals:mybatis-generator:generate -e
运行后显示Build Success表示成功,会生成dao,mapper,po的包及相应类
在app-dao.xml中添加新的bean用于扫描生成sql操作所依赖的包MapperScannerConfigurer,在该包源代码中提供了注释掉的bean标签,复制即可,依次修改两个属性的值为dao包名和SqlSessionFactoryBean的bean id
将接口和spring上下文结合,在自动生成的接口上加入注解:@Repository,用于定义spring中mvc开发模式中的持久层bean,由mybatis-spring组件将该接口的实现类在spring上下文中进行注入,通过该接口即可进行引用
17. springmvc补充
支持RESTful风格的url
@RequestMapping
用于映射url请求,也可以完成模块的划分,写在类的声明上,调用类内方法的时候都会先加入类的声明,即分层url=/user/ok(user写在类上,ok写在类方法上),但方法返回字符串时会无视类的声明以字符串为准
@Controller
@RequestMapping ("/user" )
public class UserAction {
@RequestMapping ("/ok" )
public void ok () {
System.out.println("ok..." );
}
@RequestMapping ("/add" )
public String add () {
System.out.println("add..." );
return "suc" ;
}
}
RESTful风格包含两部分内容
ant风格形式
通过客户端发送请求的方式不同在控制器执行不同的代码
method取值有(PUT,DELETE,GET,POST)
get请求,对应查询在form中默认
post请求,对应插入在form中添加method=”post” put和delete请求要添加过滤器org.springframework.web.filter.HiddenHttpMethodFilter
put请求,对应更新在form中以post方式提交,并添加<input type="hidden" name="_method" value="put"
delete请求,对应删除同put请求方式,以下是控制器中的delete写法,可以通过地址栏/数值传入id进行按id删除的操作,将delete换成get,post,put则处理其他方式的请求
@RequestMapping(value ="/{xid}" ,method=RequestMethod.DELETE)
public String delete (@PathVariable (name="xid" ) int id) {
System.out .println("删除id商品" +id);
return "suc" ;
}
支持Ant风格的url
@PathVariable在参数前注解,其中name=”路径变量”
路径变量可以在注解中加入,这样可以把地址栏”/user/delete/110”传的值通过String参数path接过来,path=110
@RequestMapping("/delete/{papa}" )
public String pa (@PathVariable (name="papa" )String path) {
System.out .println("path:" +path);
return "suc" ;
}
springmvc中的上传
支持上传二进制文件,需要:
客户端必须以post方式提交form表单,在form的enctype属性中设置multipart/form-data (支持上传二进制)
在springmvc配置文件中设置id名称multipartResolver的bean,类是org.springframework.web.multipart.commons.CommonsMultipartResolver,在springmvc配置中可以设置上传的设置
上传的二进制文件对应MultipartFile接口所声明的属性,其实现类是CommonsMultipartFile
生成一个实体类,用于封装name和upload(上传组件,类型为MultipartFile),生成get/set方法
在jsp中form表单下添加两个input,一个为name,一个为upload(类型为file),表单提交到控制器
在控制器中生成方法接收创建的实体类对象,可以得到输入流
添加依赖
通过IOUtils.copy(输入流,输出流),完成文件上传
18. springmvc中的ajax阿贾克斯技术
通过客户端JS事件以异步的方式访问后台服务,并且以局部刷新的方式更新服务端所返回的信息
前端框架
以简化库的形式出现,jQuery(简化javasricpt的开发)
通过bootstrap加载css样式和js脚本到.jsp文件中
<link href ="css/bootstrap.min.css" rel ="stylesheet" type ="text/css" />
<script type ="text/javascript" src ="js/jquery.min.js" > </script >
<script type ="text/javascript" src ="js/bootstrap.min.js" > </script >
编写css样式 <style type="text/css">
接收客户端发送的get请求: $.get('向服务器请求的url?参数名=值&参数2=值',function(服务器返回数据的索引,返回的json格式/json数组格式的数据)
编写html5内容和js脚本,利用ajax技术完成异步访问后台服务和局部刷新功能 <script type="text/javascript">
$(function(){})
表示window.onload
事件,即资源加载完毕发生该事件,必须在该事件内写jquery
如果想用$(this)
调用当前函数的话,必须满足事件.函数,独立函数无法使用该jquery提供的方法
通过创建并遍历json数组,生成新的html元素(包含传递的内容)
通过$(html元素).html(遍历后的内容)
将新的内容写入回html5页面
添加jackson依赖库,用于springmvc自动封装java中的集合和实体类并自动转换成json格式 的对象或数组传递给客户端 jackson-databind,jackson-core,jackson-annotations
在springmvc中编写各层
在生成的dao包下的接口上添加注解@Repository 转化为抽象类
在service下创建业务类添加注解@Service 注入dao操作接口,调用其sql操作的相关方法并返回相应值
在controller下创建控制器类添加注解@Controller 注入service业务Bean,生成url映射,调用service的方法返回相应值,并通过在方法上添加注解@ResponseBody (方法结束后不跳转url)完成java集合向json格式的自动封装
19. mybatis
简介
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。
MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。
源码被托管到github上
持久层技术性能
数据库存储过程>jdbc>mybatis>hibernate
大数据: 处理的数据并非来自数据库(半结构化)
案例1(查询)
在maven中,添加mybatis依赖包,必备连接数据库的jar包(mysql-connector-java)和mybatis对应的jar包(mybatis),可以下载源代码
主配置文件,配置XML,必备(环境配置,映射器) 默认文件名:mybatis-config.xml 环境配置:包含连接数据库(dataSource),事务功能(environments) 事务操作类型:type=””
JDBC,表示代码中手工操作事务commit,rollback.这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域.
MANAGED,这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期.
数据源类型:type=””
UNPOOLED,表示不使用任何连接池连接数据库
POOLED,表示使用mybatis提供的连接池
JNDI,表示使用外部web容器提供的连接池
操作映射的文件路径:包含执行具体的sql语句,封装操作(mappers)
mapper属性:
resource,对应操作映射的xml配置文件全路径 resource="com/demo/mapper/tabuser.mapper.xml"
操作映射对象 InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
读取主配置文件返回读取流
依次获取到sqlsession用于执行sql语句
SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(is);
SqlSession ss = ssf.openSession();
执行映射方法返回结果 List<Tabuser> list = ss.selectList("com.tabuser.mm.findall");
for (Tabuser t : list){t.getUname}
配置mybatis日志
修改主配置文件mybatis-config.xml,配置properties属性文件 <properties resource="db.properties"></properties>
属性的用法value="${属性文件的键}"
修改主配置文件mybatis-config.xml,配置typeAliases别名 <package name="com.demo.po" />
可以省略类的包名,只写该包下的类 <typeAlias type="com.demo.po.Tabuser" alias="x"/>
将一个类的全路径改为任意名x
修改主配置文件mybatis-config.xml,配置settings生成日志 <setting name="logImpl" value="STDOUT_LOGGING"/>
标准日志,在控制台会生成完整的日志
mybatis工作流
读取mybatis配置文件返回读取流
创建SqlSessionFactoryBean
得到SqlSessionFactory
得到SqlSession
配置自定义sql映射文件执行CRUD
手工提交事务
关闭资源