java基础学习笔记一

1.servlet生命周期

加载servlet的class-->实例化servlet-->调用servlet完成初始化-->响应请求(servlet的service方法)-->servlet容器关闭时(servlet的destory方法)

2.forward和redirect的区别

forward转向 ,浏览器地址栏不变化,服务器端的转向,不用客户端重新发送请求,一次请求中完成,更加高效。

redirest重定向,重新发送请求链接,地址栏地址发生变化。跳转到一个其他服务器上的资源。必须使用sendRedirct()方法。是客户端的跳转,两次请求

3.jsp和servlet有哪些相同点,不同点,联系是什么?

相同点:jsp是servlet的技术扩展。jsp都会被翻译成一个继承httpServlet的类,jsp最终也是一个servlet。这个servlet对外提供服务

不同点:servlet的应用逻辑是在java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是java和HTML可以组成一个扩展名为.jsp的文件。jsp侧重于视图,servlet侧重是逻辑

4.关系数据库三范式

范式就是规范,就是关系型数据库在设计表时要遵循的三个规范。

要满足第二范式必须满足第一范式,要满足第三范式必须先满足第二范式。

第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者有重复的属性。列数据的不可分割

第二范式(2NF)要求数据库表中的每行必须被唯一地区分,为实现区分通常需要为表加上一个列,已存储多个实例的唯一标识(主键)

第三范式(3NF)要求一个数据库表中不包含已在其他表中已包含的非主关键字信息(外键)

反三范式,有的时候为了效率,可以设置重复或者可以推导出的字段,订单(总价)和订单项(单价)

5.事务四个基本特性ACID

事务是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。一个转账,必须转账A账号扣钱,B账户加钱,才算转账成功。

事务必须满足四大特征:

原子性:表示事务内操作不可分割,要么都成功,要么都失败

一致性:要么都成功,要么都失败。后面的失败了要对前面的操作进行回滚

隔离性:一个事务开始了,不能受其他事务干扰

持久性:事务开始了就不能终止

 

6.mysql的分页?oracle的分页?

为什么要分页?很多数据不可能完全显示,所以要进行分段显示

Mysql使用关键字limit来进行分页,limit offset,size表示从多少索引去多少位

select * from table_name limit pagesize*(pageNum-1),pageSize

Oracle的分页,要使用三层嵌套查询

select * form (

select t.*,rownum rid from

(select * from students order by postime desc)

where rid <=pageSize*pageNum

) as t

where t>pageSize*(pageNum-1)

)

 

select * from t_user t where ROWNUM <10;

按照学生ID排名,抓取前三条记录

SELECT * FROM(SELECT id,realname FROM T_USER ORDER BY id asc ) WHERE ROWNUM <=3

分页SQL写法,从第10条记录开始,提取10条记录。

SELECT * FROM (SELECT ROWNUM rn,id,realname FROM (SELECT id,realname FROM T_USER)WHERE ROWNUM<=20) t2 WHERE T2.rn >=10;

按照学生ID排名,从第10条记录开始,提取10条记录。

SELECT * FROM (SELECT ROWNUM rn,id,realname FROM (SELECT id,realname FROM T_USER ORDER BY id asc)WHERE ROWNUM<=20) t2 WHERE T2.rn >=10;

按照学生ID排名,抓取前三条记录

SELECT * FROM(SELECT id,realname,row_number()over(ORDER BY id asc) rn FROM T_USER)WHERE rn <=3

按照学生ID排名,从第10条记录开始,提取10条记录。

SELECT * FROM(SELECT id,realname,row_number()over(ORDER BY id asc) rn FROM T_USER)WHERE rn BETWEEN 10 AND 20

运用minus方法

从第10条记录开始,提取10条记录。

SELECT * FROM T_USER WHERE ROWNUM<20 MINUS SELECT * FROM T_USER WHERE ROWNUM<10; 

 

按ID排序后,从第10条记录开始,提取10条记录。

(SELECT * FROM (SELECT * FROM T_USER ORDER BY id asc) WHERE ROWNUM<20)  MINUS( SELECT * FROM (SELECT * FROM T_USER ORDER BY id asc) WHERE ROWNUM<10);

 

7.数据库的触发器的使用场景

触发器,需要触发条件,当条件满足以后做什么操作

用处很多,校内网,开心网,Facebook,你发一个日志,自动通知好友,其实就是在增加日志的时做一个后触发,再通知表中写入条目,因为触发器效率高。而UCH没有用触犯器,效率和数据处理能力都很低。

每插入一个帖子,都希望将版面表中的最后发帖时间,帖子总数字段进行同步更新,用触发器做效率就很高。

8.mysql的最大连接数

为什么需要最大连接数?

特定服务器的数据库只能支撑一定数目同时连接,这时候需要我们设置最大连接数(最多同时服务多少连接)。在数据库安装时都会有一个默认最大连接数(100)。

9.存储过程的使用场景

1.存储过程只在创建时进行编译,以后每次执行存储过程不需要再重新编译,而一般SQL语句执行一次就编译一次,因为使用存储过程可以大大提高数据库执行速度

2.通常,复杂的业务逻辑需要多条SQL语句。这些语句要分别地从客户机发送到服务器,当客户机和服务器之间的操作很多时。将产生大量的网络依赖,如果将这些操作放在一个存储过程中,那么客户机和服务器之间的网络传输就会大大减少,降低了网络负载。

3.存储过程创建一次便可以重复使用,从而可以减少数据库开发人员的工作量。

4.安全性高,存储过程可以屏蔽对底层数据库对象的直接访问,使用EXECUTE权限调用存储过程,无需拥有访问底层数据库对象的显式权限

正是由于存储过程的上述优点,目前常用的数据库都支持存储过程,MYSQL也在5.0的时候开始支持

10.struts2的访问流程

1.客户端浏览器发送请求

2.这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助)

3.接着FilterDispatcher被调用,FilterDispacter询问ActionMapper来决定这个请求是否需要调用某个Action

4.如果ActionMapper决定需要用某个Action,FilterDispatcher把请求的处理交给ActionProxy

5.ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类

6.ActionProxy创建一个ActionInvocation的实例

7.ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器的调用

8.一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是一个需要被表示的jsp或者freeMarker的模板。在表示的过程中可以使用struts2框架中继承的标签。在这个过程涉及到ActionMapper

11.springmvc的流程

 

 

 

 

·Spring工作流程描述

      1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;

      2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;(查找handler)

      3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)

       4.  提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:

      HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息

      数据转换:对请求消息进行数据转换。如String转换成Integer、Double等

      数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等

      数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中

      5.  Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;

      6.  根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;

      7. ViewResolver 结合Model和View,来渲染视图

      8. 将渲染结果返回给客户端。

 

快速记忆:

核心控制器捕获请求,查找handler,执行Handler,选择viewResolver渲染视图并返回

 

12.struts2和springMVC有什么不同

1. 核心控制器(前端控制器、预处理控制器):对于使用过mvc框架的人来说这个词应该不会陌生,核心控制器的主要用途是处理所有的请求,然后对那些特殊的请求 (控制器)统一的进行处理(字符编码、文件上传、参数接受、异常处理等等),spring mvc核心控制器是Servlet,而Struts2是Filter。

2.控制器实例:Spring Mvc会比Struts快一些(理论上)。Spring Mvc是基于方法设计,而Sturts是基于对象,每次发一次请求都会实例一个action,每个action都会被注入 属性,而Spring更像Servlet一样,只有一个实例,每次请求执行对应的方法即可(注意:由于是单例实例,所以应当避免全局变量的修改,这样会产生线程安全问题)。(springMVC单例,struts多例)

3. 管理方式:大部分的公司的核心架构中,就会使用到spring,而spring mvc又是spring中的一个模块,所以spring对于spring mvc的控制器管理更加简单方便,而且提供了全 注解方式进行管理,各种功能的注解都比较全面,使用简单,而struts2需要采用XML很多的配置参数来管理(虽然也可以采用注解,但是几乎没有公司那 样使用)。

4.参数传递:Struts2中自身提供多种参数接受,其实都是通过值栈(ValueStack)进行传递和赋值,而SpringMvc是通过方法的参数进行接收。

5.学习难度:Struts更加很多新的技术点,比如拦截器、值栈及OGNL表达式,学习成本较高,springmvc 比较简单,很较少的时间都能上手。

6.intercepter 的实现机制:struts有以自己的interceptor机制,spring mvc用的spring的AOP方式。这样导致struts的配置文件量还是比spring mvc大,虽然struts的配置能继承,所以我觉得论使用上来讲,spring mvc使用更加简洁,开发效率Spring MVC确实比struts2高。spring mvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上spring3 mvc就容易实现restful url。struts2是类级别的拦截,一个类对应一个request上下文;实现restful url要费劲,因为struts2 action的一个方法可以对应一个url;而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。spring3 mvc的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架方法之间不共享变量,而struts2搞的就比较乱,虽然方法之间 也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码,读程序时带来麻烦。

7.spring mvc处理ajax请求,直接通过返回数据,方法中使用注解@ResponseBody,spring mvc自动帮我们对象转换为JSON数据。而struts2是通过插件的方式进行处理

在SpringMVC流行起来之前,Struts2在MVC框架中占核心地位,随着SpringMVC的出现,SpringMVC慢慢的取代struts2,但是很多企业都是原来搭建的框架,使用Struts2较多。

13.说下Spring中的两大核心

 

Spring是什么?

Spring是J2EE应用程序框架,是轻量级的IOC和AOP的容器框架(相对于重量级的EJB),主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,ibatis框架等组合使用

IOC:IOC,另外一种说法叫DI(Dependency Injection),即依赖注入。它并不是一种技术实现,而是一种设计思想。在任何一个有实际开发意义的程序项目中,我们会使用很多类来描述它们特有的功能,并且通过类与类之间的相互协作来完成特定的业务逻辑。这个时候,每个类都需要负责管理与自己有交互的类的引用和依赖,代码将会变的异常难以维护和极度的高耦合。而IOC的出现正是用来解决这个问题,我们通过IOC将这些相互依赖对象的创建、协调工作交给Spring容器去处理,每个对象只需要关注其自身的业务逻辑关系就可以了。在这样的角度上来看,获得依赖的对象的方式,进行了反转,变成了由spring容器控制对象如何获取外部资源(包括其他对象和文件资料等等)。

举例:某一天,你生病了,但是你不清楚自己到底得了什么病,你只知道自己头疼,咳嗽,全身无力。这个时候你决定去药店买药,药店有很多种药,仅仅是治疗头疼就有好几十种,还有西药中药等区别。然后你自己看了看说明书,选择了一盒你自己觉得最能治疗自己病症的药,付钱吃药,期待可以早点好起来。

但是这个过程,对于一个病人来说,太辛苦了。头疼,咳嗽,全身无力,还要一个个的看药品说明书,一个个的比较哪个药比较好,简直是太累了。这个时候,你决定直接去医院看医生。

医生给你做了检查,知道你的病症是什么,有什么原因引起的;同时医生非常了解有哪些药能治疗你的病痛,并且能根据你的自身情况进行筛选。只需要短短的十几分钟,你就能拿到对症下药的药品,即省时又省力。

 

在上面这个例子中,IOC起到的就是医生的作用,它收集你的需求要求,并且对症下药,直接把药开给你。你就是对象,药品就是你所需要的外部资源。通过医生,你不用再去找药品,而是通过医生把药品开给你。这就是整个IOC的精髓所在。

AOP:面向切面编程,往往被定义为促使软件系统实现关注点的分离的技术。系统是由许多不同的组件所组成的,每一个组件各负责一块特定功能。除了实现自身核心功能之外,这些组件还经常承担着额外的职责。例如日志、事务管理和安全这样的核心服务经常融入到自身具有核心业务逻辑的组件中去。这些系统服务经常被称为横切关注点,因为它们会跨越系统的多个组件。

AOP的概念不好像IOC一样实例化举例,现在我们以一个系统中的具体实现来讲讲AOP具体是个什么技术。

我们以系统中常用到的事务管控举例子。在系统操作数据库的过程中,不可避免地要考虑到事务相关的内容。如果在每一个方法中都新建一个事务管理器,那么无疑是对代码严重的耦合和侵入。为了简化我们的开发过程(实际上spring所做的一切实现都是为了简化开发过程),需要把事务相关的代码抽成出来做为一个独立的模块。通过AOP,确认每一个操作数据库方法为一个连接点,这些连接点组成了一个切面。当程序运行到其中某个一个切点时,我们将事务管理模块顺势织入对象中,通过通知功能,完成整个事务管控的实现。这样一来,所有的操作数据库的方法中不需要再单独关心事务管理的内容,只需要关注自身的业务代码的实现即可。所有的事务管控相关的内容都通过AOP的方式进行了实现。简化了代码的内容,将目标对象复杂的内容进行解耦,分离业务逻辑与横切关注点。

下面介绍一下AOP相关的术语:

  • 通知: 通知定义了切面是什么以及何时使用的概念。Spring 切面可以应用5种类型的通知:
    • 前置通知(Before):在目标方法被调用之前调用通知功能。
    • 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么。
    • 返回通知(After-returning):在目标方法成功执行之后调用通知。
    • 异常通知(After-throwing):在目标方法抛出异常后调用通知。
    • 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
  • 连接点:是在应用执行过程中能够插入切面的一个点。
  • 切点: 切点定义了切面在何处要织入的一个或者多个连接点。
  • 切面:是通知和切点的结合。通知和切点共同定义了切面的全部内容。
  • 引入:引入允许我们向现有类添加新方法或属性。
  • 织入:是把切面应用到目标对象,并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期中有多个点可以进行织入:
    • 编译期: 在目标类编译时,切面被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。
    • 类加载期:切面在目标加载到JVM时被织入。这种方式需要特殊的类加载器(class loader)它可以在目标类被引入应用之前增强该目标类的字节码。
    • 运行期: 切面在应用运行到某个时刻时被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态地创建一个代理对象。SpringAOP就是以这种方式织入切面的。

 

IOC控制反转

原来:我的Service需要调用DAO,Service就需要创建DAO

Spring:spring发现你Service依赖DAO,就给你注入

核心原理:就是容器+反射+配置文件

spring中有三种注入方式:一种是set注入,一种是接口注入,另一种是构造方法注入

AOP面向切面编程

核心原理:使用动态代理的方式在执行前后或者出现异常做相关逻辑

我们使用AOP做:

1.事务处理

2.权限处理

3.日志

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值