知识复盘(Session、Mysql、Servlet、Jsp、SSM)

一、会话跟踪技术(Session Tracking)

1.为什么会出现会话机制?

目前主流的通讯方式就是客户端和服务端之间进行通信,而这种通信是通过Http协议实现的,但Http协议本身是无状态的,所以客户端每发送一次请求到服务器都会被当做一个全新的请求进行处理,就是Web服务器不能识别哪些请求是同一个浏览器发出的,所以就出现了会话机制,会话机制的主要目的就是帮助服务器记住客户端的状态,简单来说就是标记用户,跟踪其状态,这样它就能区分哪些请求是同一个客户端发起的,区分不同客户端发起的请求,把同一个客户端的操作归类在一起。这样就不会出现请求混乱的问题。请求混乱:用生活案例解释就是:你用自己的手机在网上购物,结果应该是你的购物车里塞满东西,但是结果真的是这样吗?显然不是,结果却是张三同学的购物车被塞满了,这是我们想要的结果吗?肯定不是啊!那这样就出现了请求处理混乱的问题,所以会话机制就能够标记用户,跟踪其状态,这样点对点进行请求处理,就不会出现请求处理混乱的问题了。

2.会话的分类

它分为Cookie(客户端会话跟踪)和Session(服务端会话跟踪)。

什么是Cookie?

Cookie是客户端会话跟踪技术,把请求获取到的数据存储到浏览器端,当然这里指的数据是一些相对不是特别重要的数据,因为它是可见的,安全没有得到保障,等到下次客户端访问服务器的时候,会自动携带这个Cookie。对于处理一些安全要求不高的数据是非常方便的。

什么是Session?

Session是服务端会话跟踪技术,将客户端发送请求的数据存储到服务器端,一般用来处理用户信息,记录用户的状态,它对数据的存储相对于是Cookie来说是较安全的,不可见的。

Cookie和Session的区别:

● Cookie存储量是有大小限制的,最大限制3K
● Session存储量无大小限制
● Cookie将数据存储在浏览器端
● Session将数据存储到服务器端
● Cookie可以通过setCookie(int expire) 持久化存储
● Session默认存储30分钟,30分钟后自动销毁。

Cookie的优缺点

优点:
cookie携带数据量小、轻量,对于效率的影响相对较小,不占用服务器资源。
缺点:
数据的安全性不高,侵入性强,信息容易被窃取。

Session的优缺点

优点:
数据的安全性得到了保障。
缺点:
占用服务器资源,Session存储到服务器的数据,会被Tomcat存入磁盘空间中,每次启动Tomcat服务器的时候,都会将此文件重新加载到session中(Session的钝化与活化),但是这样性能就受到了很大的影响,安全的前提是用性能来换取的。

二、Mysql

1.主要索引的有哪些?

● 普通索引
● 主键索引
● 唯一索引
● 全文索引
● 复合索引
● 空间索引

2.索引的作用是什么?

索引最主要的作用就是用来提高查询效率的。我们要给哪些字段创建索引呢?是访问频繁的数据还是访问不频繁的数据,显然是查询频繁的数据了,给查询频繁的数据进行索引创建,在下次访问时直接会去查找它的索引,这样就大大提高了查询效率,那什么是索引呢?是不是很抽象?你可以把索引理解成是一个字典的音序表,这里我用英文字典来比喻,如果你要查单词的话,如何在那么厚的字典中找到你查的单词,如果一页页的查,那么就会大大增加了我们的时间成本,本末倒置了,
所以我们正常的思路是什么?如果我们要查goods这个单词的含义,那么我们是不是第一目标就是找g开头的单词,这样说的话,你就明白了吧,这个创建的索引就是g开头的字母,这样比我们一页页的去找是不是效率更高,时间成本更低。

3.创建索引的三种方式

主键索引不需要我们手动进行创建,我们在给字段id设置primary key的时候就自动创建了主键索引。
1.使用CREATE INDEX创建,语法如下:

CREATE INDEX indexName ON tableName (columnName(length))

 2.使用ALTER语句创建,语法如下:

ALTER TABLE tableName ADD INDEX indexName(columnName)

 ALTER语句创建索引,下面提供一个设置索引长度的例子:

ALTER TABLE stu ADD INDEX name_idx (name(16));

SHOW INDEX FROM stu;

3.建表时创建索引

CREATE TABLE tableName(
    id int NOT NULL,
    columnName columnType,
    INDEX [indexName] (columnName(length))
);

 示例:

CREATE INDEX content_index ON stu (content(100));

 创建普通索引:

CREATE INDEX idx_name ON book(name);

ALTER TABLE book ADD INDEX idx_name(book);

创建唯一索引:

CREATE UNIQUE INDEX card_idx ON person(id_card);

ALTER TABLE person ADD UNIQUE INDEX card_idx(id_card);

 创建空间索引:

CREATE SPATIAL INDEX idx_location ON trip(location);

ALTER TABLE trip ADD SPATIAL INDEX idx_location (location);

创建全文索引:

CREATE FULLTEXT INDEX idx_content ON stu(content);

ALTER TABLE stu ADD FULLTEXT INDEX idx_content(content);

创建组合索引:

CREATE INDEX multi_name ON stu(name,content,intro);

ALTER TABLE stu ADD INDEX multi_name(name,content,intro);

 4.如何查看索引?

show index from tableName;

 5.如何删除索引?

DROP INDEX indexName ON tableName;

ALTER TABLE tableName DROP INDEX indexName;

ALTER TABLE tableName DROP PRIMARY KEY

 6.DQL

select 字段,聚合函数 from tableName 
where condition group by 分组字段 having 过滤条件 
order by 排序 limit 记录数

子查询(多层查询)

比较运算符:!= = > < >= <=
select name,grade from stu where grade > (select grade from stu where name='张三');
in (not in):表示在某一范围
select name,class from stu where id in(select id from stu where class='2班' or class='4班');
any:任一个
select name stu where zy=any(select zy from stu where zy='计算机' or zy='网络');
all:全部
select name from stu where exists(select name from stu where name='李四');

 三、Servlet

1.什么是Servlet?

Servlet(Server Applet)是Java Servlet的简称,它是服务器小程序,即在服务器上运行的小程序,是由Java编写的服务端程序,Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

2.主要功能

Servlet的主要功能在于交互式地浏览和修改数据,生成动态Web内容。这个过程为:
1.客户端发送请求至服务端
2.服务端将请求信息发送至Servlet
3.Servlet生成响应内容并将其传给服务器,响应内容动态生成,通常取决于客户端的请求
4.服务器将响应返回给客户端

3.生命周期

1.客户端请求该Servlet
2.加载Servlet类到内存
3.实例化并调用init()方法初始化该Servlet
4.service()(根据请求方法不同调用doGet()或者doPost(),此外还有doHead(),doPut(),doDelete(),doTrace(),doOptions()、destroy())。
5.加载和实例化Servlet。这项操作一般是动态执行的。然而,Server通常会提供一个管理的选项,用于在Server启动时强制装载和初始化指定的Servlet。

四、JSP

1.JSP的九大内置对象是什么?

request、response、session、application、out、page、pageContext、config、exception

2.JSP的四大作用域

pageContext、request、session、application

3.JSP的九大内置对象分别对应的四大作用域

request域:request对象
session域:session对象
application域:application对象
pageContext域:response、out、page、pageContext、config、exception对象。

4.JSP九大内置对象的介绍

request对象:

request对象是javax.servlet.httpServletRequest类型的对象,该对象代表了客户端的请求信息,主要用来接收客户端发起的Http协议请求,处理传递到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求,是客户端对服务器发出的请求。客户端的请求信息被封装到request对象中,通过它发送给服务器。它是HttpServletRequest类的实例。

response对象:

response对象是javax.servlet.HttpServletResponse类型的对象,该对象代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。服务器收到客户端请求后做出的响应。它是HttpServletResponse类的实例。作用域为page

Session对象:

session对象是由服务器创建的与用户请求相关的对象,session内部是由Map类来存储数据,
所以存储的方式就是k/v对,它不仅仅局限于简单类型的数据,它还可以存储复杂类型的数据,这也是session的强大之处,服务器为每一个用户创建一个session对象,用来存储该用户的信息,跟踪该用户的状态,是客户端与服务器的一次会话,从客户端连接到服务器的一个Web应用开始,直到客户端与服务器连接断开,会话才会销毁,它是HttpSession类的实例,作用域session(会话期)。

application对象:

application对象可以将客户端向服务器发送请求的数据保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application的生命周期更长,它类似于系统的"全局变量",是不是听起来还是很抽象,那我就举一个例子来表示,先看一个图片:
知识复盘(Session、Mysql、Servlet、Jsp、SSM)_第1张图片

那么我想表达的是什么呢?就是这个图片上部分是用户变量,下部分是系统变量,那么如果你在用户变量中配合一些东西,类似于jdk等,那么只在你当前登录的Windows用户下有效,那么你切换到另一个用户,你就会发现jdk失效了,但如果你在下部分系统变量中配置jdk的话,那么无论你切换任一个Windows用户,它的jdk都是有效的。这个application对象就相当于我们图片中的系统变量,作用域是最大的,在整个Web应用中都是有效的,用刚才的例子来说,它在整个Windows系统下都是有效的,这样你对application对象的理解是不是更深了一些。接着说它的作用,它实现了用户间数据的共享,可存放全局变量。它始于服务器的启动,止服务器的关闭,这个对象还是挺专一的,这个过程有始有终,在此期间,此对象一直存在,这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作,在任何地方对此用户对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命周期,它是ServletContext类的实例。作用域application。为什么说application对象的作用域是最大的,给大家看一张图片,就一目了然了(自己画的,凑活看吧)
知识复盘(Session、Mysql、Servlet、Jsp、SSM)_第2张图片
 

out对象:

 out对象用于在浏览器中动态输出web内容,并且管理应用服务器上的输出缓冲区。在使用out对象输出数据时,可以对数据缓冲区进行操作,使用完之后要及时清除缓冲区中残留的数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。避免资源的浪费,以及数据的污染。
out对象是JspWriter类的实例,是向客户端输出内容常用的对象。作用域为page(页面执行期)。

page对象:

page对象就是JSP本身,只有在JSP页面内才是合法的。page隐含对象本质上包含当前Servlet接口引用的变量,类似于Java中的this关键字,指向当前对象。它是java.lang.Object类的实例。"page"对象代表了正在运行的由JSP文件产生的类对象,实质上JSP会被Tomcat服务器编译为servlet字节码文件,本质上还是servlet,但只是以jsp的形式展示给我们了。作用域 page.

pageContext对象:

pageContext对象的作用是获取任何范围的参数,通过它可以获取JSP页面中所有的内置对象,如:out、request、response、session、application等对象。pageContext对象的创建和初始化都是由容器帮我们完成的,在JSP页面中可以直接使用pageContext对象。它提供了对JSP页面内所有的对象以及名称空间的访问,也就是说它可以访问到本页所在的Session,也可以取出本页面所在的application的某一属性值,你可以称它为JSP页面功能的集大成者,它是PageContext的实例。作用域 PageConfig对象。

config对象:

config对象的主要作用是获取服务器的配置信息。通过pageContext对象的getServletConfig()方法可以获取一个config对象。当一个Servlet对象初始化时,容器把某些信息通过config对象传递给这个Servlet。我们可以在web.xml配置文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)。作用域 Page。

exception对象:

exception对象的作用是显示异常信息,可以让我们在JSP页面开发中快速的定位的错误,并进行处理,大大降低了时间成本,它的存在也是非常重要的,需要我们注意的是:只有在包含“isErrorPage=true"的JSP页面中才可以使用,在一般的JSP页面中使用该对象将无法通过JVM编译,exception对象与Java中的所有对象一样,都具有系统提供的继承结构,exception对象几乎涵盖了所有异常情况。在Java程序中,我们可以通过try/catch关键字来处理异常情况,但是在JSP页面中,我们只能通过exception对象来处理异常情况,并且前提是该JSP页面必须包含isErrorPage=true,当出现异常情况,可以将exception对象传递给page指令设定的错误页面中,然后在错误页面中处理相应的 exception对象。它实际上是java.lang.Throwable的对象,作用域 page。

五、SSM(Spring、Spring MVC、Mybatis)框架整合

1.什么是Spring?

Spring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象。也可以称为项目中的粘合剂(adhesive)即Spring是一个控制反转(IoC)和面向切面(AOP)的容器框架。

Spring的核心思想就是IoC(控制反转 Inversion of Control),即不需要我们去显示地new一个对象,而是由Spring框架来帮我们完成这一切。为什么叫控制反转呢?那么第一次听是不是很抽象,但是它却是语义化的,就是见名知意,下面我就给大家举例一下,让大家能够更深层次的理解IoC,
知识复盘(Session、Mysql、Servlet、Jsp、SSM)_第3张图片

看到这个图是不是就会清晰多了,Ioc容器让A、B、C、D对象没有了耦合关系, 通过IoC容器齿轮将它们撮合在一起,起到了一种类似于粘合剂(adhesive)的作用,齿轮转动全部依赖于Ioc这个第三方容器齿轮来维持运转。把这个Ioc第三方容器齿轮拿掉,我们再来看一下这套系统

知识复盘(Session、Mysql、Servlet、Jsp、SSM)_第4张图片

 我们现在可以看到,我们要实现整个系统所需要完成的全部内容。这时候,A、B、C、D这4个对象之间已经没有了耦合关系,彼此之间毫无联系,那么这时候你再去实现A的时候,根本无需再去考虑B、C、D了,可以说IoC容器将对象之间的依赖关系降到了最低程度。而Spring框架也恰恰是因为IoC容器实现了松耦合。那么你又会说这跟控制反转又什么关系呢?别着急,通过下面的解释,接下来你就会非常的清楚IoC容器了,我再用代码给大家实现一下,通过IoC容器管理和非IoC容器管理的两种情况:
非IoC容器管理情况:
1.持久层

public interface UserDao {
    public void init();
}

public class UserDaoImpl implements UserDao{
    @Override
    public void init() {
        System.out.println("UserDao的实现");
    }
}

2.业务层

public interface UserService {
    public void init();
}

public class UserServiceImpl implements UserService{
    @Override
    public void init() {
        System.out.println("UserServiceImpl的实现");
    }
}

3.测试用例

public class TestDemo {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        userService.init();
    }
}

 IoC容器管理情况:
1.持久层

public interface UserDao {
    void add();
}

public class UserDaoImpl implements UserDao {

    private String username;
    private String password;

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public UserDaoImpl() {
        System.out.println("userDao被创建了");
    }

    @Override
    public void add() {
        System.out.println("userDao ... " + username + " == " + password);
    }
}

2.业务层

public interface UserService {

    public void add();

}

public class UserServiceImpl implements UserService {

    //声明一个UserDao类型的变量
    private UserDao userDao;

    public UserServiceImpl() {
        System.out.println("userService被创建了");
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void add() {
        System.out.println("userService ...");
        userDao.add();
    }

}

3.控制层

public class UserController {
    public static void main(String[] args) throws Exception {
        //1.创建Spring的容器对象
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.从容器对象中获取userService对象
        UserService userService = context.getBean("userService", UserService.class);
        //3.调用userService方法进行业务逻辑处理
        userService.add();
    }
}

 这样通过上面两种情况的对比,你就明白了什么是IoC控制反转了,由原来我们主动创建对象的方式转变为了由IoC容器注入,IoC的别名又叫做DI(Dependency Injection),就是这个获取依赖对象的过程被反转了,即在使用UserService对象的时候由IoC容器自动帮我们把UserDao进行注入,使用完之后由垃圾回收器进行回收,这就是IoC实现松耦合的原理。

2.Spring框架有哪些主要模块?

Spring有七大功能模块:
1.Core(核心)
Core模块是Spring的核心类库,Core实现了IoC功能。


2.AOP
Spring AOP模块是Spring的AOP库,提供了AOP(拦截器)机制,并提供常见的拦截器,供用户自定义和配置。


3.orm(单应用架构)
提供对常用ORM框架的管理和支持,hibernate、mybatis等。

4.Dao
Spring提供对JDBC的支持,减少了我们连接数据库的一些冗余操作,降低了时间成本,对JDBC进行了封装。

5.Web
对Struts2的支持。

6.Context
Context模块提供框架式的Bean的访问方式,其它程序可以通过Context访问Spring的Bean资源,相当于资源注入。

7.MVC
MVC模块为spring提供了一套轻量级的MVC实现,即Spring MVC。

3.使用Spring框架带来了哪些好处?

1.轻量级框架、容器
Spring是一个容器,管理对象的生命周期和配置,基于一个可配置原型prototype,使得你的bean可以是单例的,也可以每次需要时都生成一个新的实例。

2.IoC控制反转
Spring通过IoC控制反转实现了松耦合。

3.支持AOP
Spring提供对AOP的支持,它允许将一些通用任务,如安全、事务、日志等进行集中式(centralization)处理,从而提高程序的复用性。

4.方便测试
Spring提供Junit4的支持,可以通过注解的方式方便测试spring程序。

5.对Java中很多API进行了封装
方便我们进行使用,不需要再去引入一些其它的jar包,降低了我们的时间成本,开箱即用。

6.方便集成(integration)各种优秀框架
如Struts、hibernate、mybatis等。

7.支持声明式事务处理
我们只需要通过配置就可以实现对事务的管理,无需手动进行编程式声明,降低时间成本。

4.Spring Bean的作用域之间有什么区别?

Spring容器中的bean可以分为5个范围:

1.singleton:这种bean范围是默认的,这种范围确保不管接收多少请求,每个容器只有一个bean的实例,即单例模式。

2.prototype:为每一个bean提供一个实例。

3.request:在请求bean范围内为每一个来自客户端的网络请求创建一个实例,在请求完毕后,bean会失效并被垃圾回收器进行回收。

4.session:为每个session创建一个实例,session过期后,bean会随之消失。

5.global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet公用全局存储变量的话,那么全局存储变量需要存储在global-session中。

2.什么是Spring MVC?

Spring MVC使用 MVC 架构模式的思想,将Web应用进行职责解耦,它符合单一职责的设计原则,把一个复杂的Web应用划分成模型(Model)、视图(View)、控制器(Controller) 三层,有效的简化了Web应用的开发,降低了时间成本和试错成本,方便了开发人员之间的分工协作。

Spring MVC各层的职责如下:
● Model:负责对请求进行处理,并将结果返回给Controller
● View:负责将请求的处理结果进行渲染,展示在客户端浏览器上
● Controller:是Model和View交互的纽带(bound),主要负责接收用户的请求,并调用Model对请求进行处理,然后将请求的处理结果传递给View进行渲染。

Spring MVC本质上是对Servlet的进一步封装,其最核心的组件是DispatcherServlet,它是 Spring MVC的前端控制器,主要负责对请求和响应进行统一的处理和分发。Controller接收到的请求其实就是DispatcherServlet根据一定的规则分发给它的。

Spring MVC框架内部采用松耦合、可插拔的组件结构,具有高度的可配置性,即扩展性和灵活性更强,Spring MVC的注解驱动annotation-driver和对REST风格的支持,也是它最具有特色的功能。

3.Spring MVC的特点

● Spring MVC是Spring家族的原生产品,可以与IoC容器等Spring基础设施无缝对接
● Spring MVC支持各种视图技术,例如JSP、Thymeleaf、FreeMarker等
● Spring MVC基于原生的Servlet实现,通过功能强大的前端控制器DispatcherServlet,对请求和响应进行统一处理
● 代码更加简洁、规范,大幅度提升了开发效率
● 内部组件化程度高,可插拔式组件即插即用,想要使用什么功能,配置相应的组件即可
● 性能卓著,适合现代大型、超大型互联网项目的开发

3.什么是MyBatis?

MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJOS(Plain-Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

Mybatis最强大的特性

Myabtis最强大的特性之一就是支持动态SQL,可以根据业务的不同,编写动态SQL进行处理。
 

Mybatis特点:

● 简单易学:本身就很小且简单。没有任何第三方依赖。
● 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
● 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑进行分离,使系统的设计更清晰、更易维护,方便单元测试。sql和程序代码的分离,提高了代码的可维护性。
● 提供映射标签,支持对象与数据库的ORM字段关系映射。
● 提供对象关系映射标签,支持对象关系组建维护。
● 提供xml标签,支持编写动态sql。
 

Mybatis总体流程:

1.加载配置并初始化
2.接收调用请求
3.处理操作请求

Mybatis功能架构:

1.API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操作数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。

2.数据处理层:负责具体的SQL查询、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。

3.基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将它们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。

4.SSM框架的分工协作

Spring

Spring负责事务管理,Spring可以管理持久层(Persistent Object 简称:PO)的Mapper对象以及业务的Service对象,由于Mapper对象和Service对象都在Spring容器中,所以可以在业务逻辑层通过Service对象调用持久层的Mapper对象。

Spring MVC

Spring MVC负责管理表现层的Handler。Sring MVC容器是Spring容器的子容器,因此Spring MVC容器可以调用Spring容器中的Service对象。

Mybatis

Mybatis负责与数据库进行交互。

六、结尾

温故而知新,记得每隔一段时间对学过的知识进行归纳总结,把这些东西放入你的长期记忆区,结合生活案例去理解,你将会更快、更深刻的理解一个知识点,如果你只会用,不会说,那也不行,我们不能成为一个哑式编程开发者,最后送大家一句话,海阔凭鱼跃、天高任鸟飞。希望以上总结的知识点能给你带来帮助。

你可能感兴趣的:(Java,java,servlet,mysql,spring)