spring-springMVC-mybatis 基础复习

1 篇文章 0 订阅
1 篇文章 0 订阅

吐槽自己:记性不好,技术点忘记好快,ssm框架有2年多没有用过了。现东家需要搭建一个开源框架做一个报表显示demo,在期间把知识点梳理一下。n年前的学习笔记。

spring是什么?

是一个开源的用来简化开发的应用程序开发框架。

简化开发

spring对一些常用的api做了封装,简化了程序代码(比如使用spring jdbc访问数据库,就不用考虑连接的获取和关闭了)。

解耦

spring帮我们管理对象之间的关系,便于程序的维护。

集成

spring可以集成其它的一些框架(比如,可以集成Quartz, mybatis等)。

spring容器

spring容器是什么?

spring框架的一个核心模块,用来管理对象。

如何启动spring容器?

step1. 导包。
step2. 添加spring配置文件。
step3. 编写代码,启动容器。

如何让容器帮我们创建对象?

方式一 使用无参构造器(重点)。

step1. 类应该提供有无参构造器(或者缺省构造器)。
step2. 在配置文件当中,使用bean元素来配置。
step3. 调用容器的getBean方法。

方式二 使用静态工厂方法。(了解)

方式三 使用实例工厂方法。(了解)

作用域

默认情况下,对于一个bean的配置,容器只会创建一个实例。

如果设置scope属性="prototype",调用getBean时,会创建一个新的实例。

延迟加载 (了解)

默认情况下,容器启动之后,会将所有作用域为"singleton"的bean创建好。

如果设置lazy-init属性值为true,表示延迟加载。

(即容器启动之后,对于作用域为singleton的bean, 不再创建相应的实例)

生命周期的管理

初始化

使用init-method属性来指定初始化方法。

销毁

使用destroy-method属性指定销毁方法。
注意:如果scope属性设置为prototype,则销毁方法不起作用。

IOC (Inversion Of Controll 控制反转)

IOC是什么?

对象之间的依赖关系交给容器来建立。

DI是什么? (Dependcy injection 依赖注入)

容器通过调用对象提供的set方法或者构造器来建立对象之间的依赖关系。
注:IOC是目标,DI是手段。

依赖注入的两种方式

方式一: set方法

 

方式二:构造器

使用注解

什么是组件扫描?

容器会扫描指定包及其子包下面的所有的类,如果该类包含有特定的注解(比如@Component),则容器会将该类纳入容器进行管理(相当于配置文件当中有一个bean的配置)。

如何使用组件扫描?

step1. 在类名前添加相应的注解。
@Component 通用组件
@Service 业务层组件
@Respository 持久层组件
@Controller 控制层组件
step2. 在配置文件当中,配置组件扫描。
<context:component-scan base-package="annotation"/>

作用域

@Scope("prototype")

延迟加载

@Lazy(true)

生命周期

@PostConstruct 初始化
@PreDestroy 销毁
注意:
这两个注解来自于javaee,需要导入annotation.jar 文件。

使用spring表达式

@Value("#{spring表达式}")
注意:
a. 该注解可以加到属性前,也可以加到属性对应的 set方法前面。
b. 也可以使用该注解注入基本类型的值。

 

依赖注入相关的注解

第一组:@Autowired和@Qualifier

支持set方法的注入和构造器注入。

set方法的注入:

. @Autowired加到set方法前面,@Qualifier用来指定要注入的bean的id。注,如果不使用@Qualifier,会使用 byType的方式来注入

. @Autowired也可以加到属性前。

构造器注入:

. @Autowired加到构造器前面即可。

第二组:@Resource

只支持set方法注入。

. @Resource添加到set方法前面,使用name属性来指定要注入的bean的id。
. @Resource也可以添加到属性前。

springmvc

springmvc是什么?

一个用来简化web开发的mvc框架。
注:springmvc属于spring框架的一部分。

五大组件

. DispatcherServlet (前端控制器)
. HandlerMapping
. Controller (处理器)
. ModelAndView
. ViewResolver 视图解析器
step1,DispatcherServlet收到请求之后,依据 HandlerMapping的配置,调用相应的Controller 来处理。
step2,Controller将处理结果封装到ModelAndView对象。然后将该对象返回给DispatcherServlet来处理。
注:ModelAndView对象包含有两部分数据,一是处理结果,另外,还包含有视图名(就是一个字符串,比如"hello")。
step3,DispatcherServlet依据ViewResolver的解析,调用相应的视图对象(比如jsp)来生成相应的页面。

编程步骤

step1,导包
spring-webmvc
step2,添加spring的配置文件。
step3,配置DispatcherServlet。(web.xml)
step4,写Controller类。
step5,写jsp。
step6,配置HandlerMapping和ViewResolver。

基于注解的springmvc应用

1.编程步骤

step1. 导包。
step2. 添加spring配置文件。
step3. 配置DispatcherServlet。
step4. 写Controller。
a. 不用实现Controller接口。
b. 可以添加多个方法。
c. 方法名称不作要求,返回值的类型可以是 ModelAndView,也可以是String。
d. 在类名前添加@Controller。
e. 在类名前或者方法前添加@RequestMapping。
注:@RequestMapping的作用相当于HandlerMapping。
step5. 写jsp。
step6. 配置视图解析器,配置组件扫描, 配置springmvc注解扫描(让spring容器能够识别 @RequestMapping)。

 

2.读取请求参数值

方式一:request对象

只要将request对象作为方法的入参即可。

@RequestMapping("/login.do")

//获取请求参数值的第一种方式:使用request。

public String checkLogin(HttpServletRequest request){

System.out.println("checkLogin()");

String adminCode =request.getParameter("adminCode");

String pwd =request.getParameter("pwd");

System.out.println(adminCode + " " + pwd);

return "index";

 

方式二:@RequestParam

将@RequestParam添加到参数前。

@RequestMapping("/login2.do")

//读取请求参数值的第二种方式:

//使用@RequestParam

//最好每个形参前都添加@RequestParam。

public String checkLogin2(String adminCode,@RequestParam("pwd")String password){
    
    System.out.println("checkLogin2()");

    System.out.println(adminCode + " " + password);

    return "index";
 }

方式三:封装成一个javabean

step1.写一个java类,要求:
a. 属性名与请求参数名一致。
b. 属性有对应的get/set方法。
step2.将该java类作为方法的入参即可。

/**
 * 用于封装请求参数值的javabean,要求:
 * 1. 属性名与请求参数名一致。
 * 2. 属性有对应的get/set方法。
 *
 */
public class Admin {
	private String adminCode;
	private String pwd;
	public String getAdminCode() {
		return adminCode;
	}
	public void setAdminCode(String adminCode) {
		this.adminCode = adminCode;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	
}


@RequestMapping("/login3.do")

//读取请求参数值的第三种方式:

//封装成javabean
public String checkLogin3(Admin admin){

System.out.println("checkLogin3()");

System.out.println(admin.getAdminCode() + " " + admin.getPwd());

return "index";

 

3.向页面传值

方式一: 将数据绑订到request对象。

	@RequestMapping("/login4.do")
	//向页面传值的第一种方式:
	//绑订数据到request对象。
	public String checkLogin4(
			Admin admin,
			HttpServletRequest request){
		System.out.println("checkLogin4()");
		System.out.println(admin.getAdminCode());
		//将数据绑订到request
		request.setAttribute("adminCode",
				admin.getAdminCode());
		//springmvc默认使用转发机制来跳转。
		return "index";
	}

注:springmvc默认使用转发机制来跳转。

方式二: 返回ModelAndView对象。

@RequestMapping("/login5.do")

//向页面传值的第二种方式:

//返回ModelAndView对象。

public ModelAndView checkLogin5(Admin admin){

System.out.println("checkLogin5()");

System.out.println(admin.getAdminCode());

Map<String,Object> data = new HashMap<String,Object>();

//相当于request.setAttribute

data.put("adminCode",admin.getAdminCode());

ModelAndView mav = new ModelAndView("index",data);

return mav;

方式三: 将ModelMap作为方法的入参。

@RequestMapping("/login6.do")

//向页面传值的第三种方式:

//使用ModelMap作为方法的入参。

public String checkLogin6(Admin admin,ModelMap mm){

System.out.println("checkLogin6()");

System.out.println(admin.getAdminCode());

//相当于request.setAttribute

mm.addAttribute("adminCode",admin.getAdminCode());

return "index";

方式四: 将数据绑订到session对象。

	@RequestMapping("/login7.do")
	//向页面传值的第四种方式:
	//将数据绑订到session对象。
	public String checkLogin7(Admin admin,
			HttpSession session){
		System.out.println("checkLogin7()");
		System.out.println(admin.getAdminCode());
		session.setAttribute("adminCode",
				admin.getAdminCode());
		return "index";
	}

4.重定向

方式一:如果方法的返回值是String,在重定向

地址前添加"redirect:"即可。
比如 return "redirect:toIndex.do";

@RequestMapping("/login8.do")

//重定向的第一种方式

public String checkLogin8(){

System.out.println("checkLogin8()");

return "redirect:toIndex.do";

}

方式二:如果方法的返回值是ModelAndView:

RedirectView rv = new RedirectView("toIndex.do");

return new ModelAndView(rv);

系统分层(了解)

1.如何分层?

表示层

表示逻辑(数据展现/操作界面)和控制逻辑(请求分发)

业务层

封装业务处理逻辑

持久层

封装数据访问逻辑

2.优点

上一层通过接口调用下一层提供的服务,这样,当下一层实现发生了改变,不影响上一层。这样有利于系统的维护。

登录案例

step1.导包。

step2.添加spring配置文件。
step3.配置DispatcherServlet。
step4.Admin实体类。
step5.AdminDAO接口和实现类。
public Admin findByAdminCode(String adminCode);
step6.LoginService接口和实现类。
public Admin checkLogin(String adminCode,String pwd);
step7.login.jsp,index.jsp,error.jsp和 LoginController。
step8.配置spring配置文件。
应该包含以下配置信息:
组件扫描,mvc注解扫描,视图解析器,连接池配置

1.表单中文参数值的乱码问题

在web.xml文件当中,配置springmvc提供的一个过滤器 (CharacterEncodingFilter)。
需要注意:
a.表单提交方式必须设置为"post"。
b.过滤器的编码设置与表单的编码要一致。

2.拦截器

什么是拦截器?

前端控制器在调用处理器之前,如果发现有拦截器存在,则会先调用拦截器,然后再调用处理器。
注:过滤器属于servlet规范当中定义的组件,而拦截器属于spring框架定义的组件。

如何写一个拦截器?

step1. 写一个java类,实现HandlerInterceptor接口。
step2. 将拦截处理逻辑写在相应的接口方法里面:
preHandle方法:前端控制器先调用拦截器的preHandle方法,如果该方法返回值为true,则拦截器继续向后调用;如果该方法返回值为false,则拦截器不再向后调用,请求处理完成。
postHandle方法:处理器方法已经执行完成,正准备将 ModelAndView对象返回给前端控制器之前执行。可以在该方法里面,修改ModelAndView对象。
afterCompletion方法:最后执行的方法,要注意,如果 preHandle方法返回值为false,该方法不会执行。
step3. 配置拦截器。

3.让spring框架来处理异常

将异常抛给spring,由spring框架依据相应的配置,来处理异常。

方式一: 使用简单异常处理器。

step1. 配置简单异常处理器。


step2. 编写异常处理页面。

方式二: 使用@ExceptionHandler。

step1. 在处理器类当中,添加一个用来处理异常的方法,该方法必须添加@ExceptionHandler。


step2. 在异常处理方法里面,依据异常类型,分别进行不同的处理。

练习:使用@ExceptionHandler来处理登录中产生的异常。

spring jdbc

spring jdbc是什么?

spring框架对jdbc的封装。

如何使用spring jdbc?

spring框架提供了一个JdbcTemplate类,提供了大量的实现的方法,我们只需要配置好该对象,然后调用其方法即可。
step1.导包
spring-webmvc,ojdbc,dbcp,junit,spring-jdbc

step2.添加spring配置文件,配置JdbcTemplate。

step3.调用JdbcTemplate的方法来访问数据库。

练习(可选): 使用springjdbc实现AdminDAO。
step1. 导包 spring-jdbc
step2. 添加JdbcTemplate的配置
step3. 在dao包下添加一个类 AdminDAOSpringJdbcImpl。
注意: 可以将原来的DAO实现类AdminDAOjdbcImp中的注解@Repository注释掉。
step4. 测试AdminDAOSpringJdbcImpl。
step5. 测试整个应用程序。

mybatis

mybatis是什么?

是一个开源的持久层框架。
注:(了解)
jdbc: 速度快 代码量大 需要写sql。
hibernate: 不用写sql 代码量少 速度慢 学习难度大。会生成复杂的sql,不好优化。
mybatis:速度适中,需要写sql,代码量少,学习难度小。

编程步骤

step1. 导包。
mybatis,odjbc
step2. 添加配置文件。
注:连接池的配置,映射文件的位置。
step3. 写一个实体类。
step4. 写一个映射文件。
注:里面主要是sql语句。
step5. 调用SqlSession提供的方法来访问数据库。

基本原理

1. 返回Map类型的结果

. mybatis会将查询到的结果存放到Map对象里面( 一条记录对应一个Map对象,其中,字段名作为key, 字段值作为value)。
. 接下来,再将Map对象中的数据放到实体对象里面。

注意:如果有多个map需要存放在 List<Map<String, Object>>

2. Mapper映射器

2.1 什么是Mapper映射器

就是符合Mybatis特定要求(符合映射文件的要求)的接口, Mybatis会依据这些接口生成相应的实现对象。

2.2 这些接口有哪些要求

a. 方法名必须与sql语句的id一样。
b. 方法的返回类型与sql语句的返回类型一致。
c. 方法的参数类型与sql语句的参数类型一致。

此外,映射文件×××Mapper .xml的namespace必须等于Mapper映射器( 即要写这些接口的完整的名称)。

 

3. 使用ResultMap

用来解决实体类的属性名与表的字段名不一致的情况。

step1. 配置resultMap元素,告诉mybatis,表的字段名与实体类的属性名的对应关系。

step2. 查询语句当中,结果类型要改为resultMap。

spring集成mybatis

方式一

step1. 导包
spring-webmvc,spring-jdbc,mybatis, spring-mybatis,ojdbc,dbcp,junit。

step2. 添加spring配置文件。
连接池配置,SqlSessionFactoryBean的配置。

step3. 实体类。
step4. 映射文件。
step5. Mapper映射器。
step6. 配置MapperScannerConfigurer。
该bean负责扫描某个包下面的所有的Mapper映射器,然后生成相应的实现对象(其实是调用了SqlSession. getMapper方法),并且将这些实现对象放到容器里面, 默认的id是 映射器名(首字母小写)。

注:如果只对特定的映射器进行扫描,可以在这些映射器前面添加相应的注解,并且在Mapper ScannerConfigurer中添加相应的配置。

ajax (asynchronous javascript and xml)

ajax是什么?

ajax是一种用来改善用户体验的技术,其实质是利用浏览器提供的一个特殊的对象(XMLHttpRequest,也可以称之为ajax对象)异步地向服务器发送请求。服务器返回部分数据,浏览器利用这些数据对当前页面做部分更新。整个过程,页面无刷新,不打断用户的操作。

注:异步地,是指当这个对象在向服务器发送请求时,浏览器不会销毁当前页面,用户仍然可以对当前页面做其它操作。

 

如何获得ajax对象?

function getXhr(){
    var xhr = null;
    if(window.XMLHttpRequest){
        //非ie浏览器
        xhr = new XMLHttpRequest();
    }else{
        //ie浏览器
        xhr = new ActiveXObject(
'Microsoft.XMLHttp');
    }
    return xhr;
}

1. ajax对象的重要属性

  • onreadystatechange:绑订一个事件处理函数,用来处理readystatechange事件。
    注:当readystate的值发生了任何的改变(比如,从0 变成了1),就会产生readystatechange事件。
  • readyState:有五个值(0,1,2,3,4),表示ajax对象与服务器通信的进展。其中,4表示ajax对象已经获得了服务器返回的所有的数据。
  • responseText:获得服务器返回的文本数据。
  • responseXML:获得服务器返回的xml数据。
  • status:获得服务器返回的状态码。

2. 编程步骤

step1. 获得ajax对象。比如
var xhr = getXhr(); step2. 通过ajax对象,向服务器发请求。
方式一 发送get请求:
(1) xhr.open('get', 'checkuname.do?username=tom',true);
(2) xhr.onreadystatechange=f1;
(3) xhr.send(null);
方式二 发送post请求:
(1) xhr.open('post','check
uname.do',true);
(2) xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
(3) xhr.onreadystatechange = f1;
(4) xhr.send('username=tom');
注1: true: 异步请求 false:同步请求(当ajax对象发送请求时,浏览器会锁定当前页面,用户不能够对当前页面做任何操作)。
注2: 按照http要求,如果发送的是post请求,请求数据包里面应该包含"content-type"消息头,但是,缺省情况下,ajax对象不会添加该消息头,所以,需要调用 setRequestHeader方法。
step3. 编写服务器端的代码,通常只需要返回部分的数据。
step4. 写事件处理函数
if(xhr.readyState == 4 && xhr.status == 200){ var txt = xhr.resposeText; //更新页面... }

3. 缓存问题

什么是缓存问题?

当使用ie浏览器发送get请求时,会比较请求地址是否访问过,如果访问过,则不再发送新的请求,而是显示之前缓存的结果。

如何解决?

在请求地址后面添加一个随机数。

4. 编码问题

发送get请求

(1)乱码问题产生的原因:
ie浏览器会使用gbk来中文参数值进行编码,其它浏览器会使用utf-8对中文参数值进行编码。服务器端默认会使用 iso-8859-1来解码,所以会有乱码。
(2)如何解决?
step1. 可以设置服务器默认的解码方式。
URIEncoding="utf-8"
step2. 在浏览器端,使用js内置的一个函数 encodeURI来对中文进行编码(该函数默认会使用utf-8 编码)。

发送post请求

(1)乱码问题产生的原因:
浏览器会使用utf-8对中文参数值进行编码,而服务器端会使用iso-8859-1来解码。
(2)如何解决?
request.setCharacterEncoding("utf-8");

 

1. JSON (javascript object notation)

(1) JSON是什么?

是一种轻量级的数据交换格式。
注:数据交换,指的是将要交换的数据转换成一种与平台无关的数据,然后发送给接收方来处理。
轻量级,指的是相对于xml,JSON文档更小,解析速度更快。

(2) JSON的基本语法

表示一个对象

{属性名:属性值,属性名:属性值,....}
注意:
a. 属性名必须使用双引号括起来。
b. 属性值可以string,number,null,true/false,object。
c. 属性值如果是string,必须使用双引号括起来。

表示由多个对象组成的数组

[{},{},{}...]

(3) 使用JSON做数据交换

将java对象转换成JSON字符串。

使用json官方提供的JSONObject,JSONArray。

将JSON字符串转换成javascript对象。

使用prototype.js提供的evalJSON函数。

 

2. jQuery对ajax的支持

$.ajax()

用法:
$.ajax({});其中,{}表示一个对象,用来封装选项参数。常用的选项参数如下。
url : 请求地址
type: 请求类型 (get/post)
data: 请求参数,有两种格式:
第一种: 请求字符串,比如 "username=tom&age=20"
第二种: 对象,比如 {"username":"tom","age":20}
dataType: 服务器返回的数据类型,常用的有:
text: 文本。
html: 文档。
json: json字符串。
xml: xml文档。
script: javascript脚本。
success: 当服务器处理正确,用来处理服务器返回的数据的函数。

error:当服务器发生异常,用来处理服务器返回的数据的函数。
async: 同步还是异步(缺省是异步)。true表示异步, false表示同步。

load()

作用:
向服务器发送异步请求,将服务器返回的数据直接添加到符合要求的节点之上。
用法:
$obj.load(url,[data]);
url:请求地址。
data:请求参数。同上。

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

任错错

如果对您有帮助我很开心

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值