Java面试知识点解析(七)-Web篇_第1页
Java面试知识点解析(七)-Web篇_第2页
Java面试知识点解析(七)-Web篇_第3页
Java面试知识点解析(七)-Web篇_第4页
Java面试知识点解析(七)-Web篇_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java面试知识点解析(七)Web篇

•前言:

在遨游了一番JavaWeb的世界之后,发现了自己的一些缺失,所以就着一篇深度

好文:知名互联网公司校招Java开发岗面试知识点解析,来好好的对Java知识点

进行复习和学习一番,大部分内容参照自这一篇文章,有一些自己补充的,也算是

重新学习一下Java吧。

前序文章链接:

Java面试知识点解析(一)一一基础知识篇

Java面试知识点解析(二)一一高并发编程篇

Java面试知识点解析(三)JVM篇

Java面试知识点解析(四)一一版本特性篇

Java面试知识点解析(五)一一网络协议篇

Java面试知识点解析(六)一一数据库篇

(一)J2EE相关知识点

不涉及任何框架,对J2EE相关知识点的解析

1)Servlet的生命周期?

在Web容器中,Servlet主要经历4个阶段,如下图:

1.加载Servlet:当Tomcat第一次访问Servlet的时候,Tomcat会负责创建

Servlet的实例。

2.初始化Servlet:当Servlet被实例化之后,Tomcat会调用initQ方法来初始化

这个对象。

3.处理服务:当浏览器访问Servlet的时候,Servlet会调用serviceQ方法处理请求。

4.销毁:当Tomcat关闭或者检测到Servlet要从Tomcat删除的时候,会自动调用

destroy。方法,让该实例所占用的资源释放掉。一个Servlet如果长时间不被使用

的话,山会被Tomcat自动销毁。

•简单总结:只要访问Servlet,就会调用其对应的service。方法,init()方法

只会在第一次访问Serlvet的时候才会被调用。

2)Servlet的请求流程?

1.浏览器发出请求:http://localhost:80/xxxl/xxx2(80端口可以默认不写,

因为这是http协议默认的端口,平时我们访问https://www.baidu.com/时其

实访问的是https://www.baidu.com:80/)

2.服务器解析请求信息:

-http:协议名称

-localhost:访问的是互联网中的哪一台计算机

-80:从主机当中找到对应80端口的程序(这里即为Tomcat服务器)

-/xxxl:当前项目的上下文路径(即在server.xml中配置主机时配置

的path属性)

-/xxx2:当前请求的资源名

3.解析Tomcat服务器根目录下的/config/server.xml文件:

<ContextdocBase="D:\javaPros\test\webapp"path="xxxl"/>

判断哪一个(Context/>元素的path属性属性为xxxl

-若找不到,则返回404错误

-若找到了,则解析该(Context/>元素,得到docBase属性,获取当前

访问Web项目的跟的绝对路径:D:\javaPros\test\webapp

4.从D:\javaPros\test\webapp下的WEB-INF下找到web.xml文件

判断web.xml文件中是否有<url-pattern>的文本内容为/xxx2

-若找不到,则返回404错误

若找到了,则继续获取该资源对应Servlet类的全限名称:xxx.xxx

5.判断Servlet实例缓存池中是否有xxx.xxx的对象

Map<String,Servlet>cache=(Tomcat提供的);

key:存Servlet类的全限定名称

value:该Servlet类的对象.

Servletobj=cache.get("xxx.xxx");

if(obj==null){

//Servlet实例缓存中没有该类的对象,第一次.

GOTO6:

}else(

〃有对象,非第一次.

GOTO8:

}

)

1.使用反射调用构造器,创建对应的对象

obj=Class.forName("xxx.xxx").newlnstance();

把当前创建的Servlet对象,存放在缓存之中,供给下一次的使用.

cache,put(',xxx.xxx",obj);

2.创建ServletConfig对象,并调用init()方法

obj.init(config);

3.创建ServletRequest对象和ServletResponse对象,并调用service。方法

obj,service(reqresp);

4.在serviceQ方法中对浏览器作出响应操作。

3)Servlet是单例的吗?为什么?

Servlet是单例的,浏览器多次对Servlet的请求,一般情况下,服务器只创建一

个Servlet对象,也就是说,Servlet对象一旦创建了,就会驻留在内存中,为后

续的请求做服务,直到服务器关闭。

4)GET和POST的区别

要知道,GET和POST都是请求方式

1.GET:

浏览器器地址栏:http://localhost/test.html?name=wmyskxz&sex=male

这里提交了两个参数,一个是name属性值为wmyskxz,另一个是sex属性值为

male,这是一种直接的请求方式,在请求资源后面跟上?符号与参数连接,其他的

参数使用&符号连接。

・缺点:

1暴露■;吉索伯自不专仝

2:请求信息卡赢n过ikb,可传输的信息有限,不能上传图片

2.POST:

浏览器地址栏:http://localhost/test.html#

•优点:

1.隐藏了请求信息,较安全(但仍可以通过相关工具访问到数据)

2.POST方式没有限制请求的数据大小,可以做图片的上传

5)Tomcat中如何解决中文乱码问题?

在Tomcat服务器中,接受请求的时候,默认的编码方式为ISO-8859-1,而该编

码方式只占一个字节,不支持中文(两个字节),所以当我们做请求的时候,会出

现乱码的问题

解决方案:

1.对乱码使用ISO-8859-1解码,转换成byte数组,恢复为二进制

byte[]data=name.getBytes("ISO-8859-1");

2,对byte数组重新进行UTF-8编码:

name=newString(data"UTF-8");

但是这样会出现一个问题,那就是当表单数据太多的时候,这样反复解码-编码,

会很繁琐。

终极解决方案:

1.对于POST请求:

设置请求的编码方式:request.setCharacterEncoding("UTF-8");

注意:必须在获取第一个参数之前设置,并且该方式只对POST方式有效。

2.对于GET请求:

重新设置Tomcat的编码方式,修改Tomcat的配置文件:

Tomcat根目录/conf/server.xml(修改端口的那一行)

(Connectorport="80"protocol="HTTP/l.lr,

connectionTimeout="20000n

二redirectPort=,,8443n/>二

(Connectorport="80"protocol="HTTP/l.1"

connectionTimeout="20000"

URIEncoding=nISO-8859-1n/>|

修改成UTF-8

〈Connectorport="80nprotocol="HTTP/l.ln

connectionTimeout="20000n

redirectPort="8443"

|URIEncodinL'UTF-8n/>|

6)forward与redirect的区别

1.请求转发(forward)

又叫做直接转发方式,客户端和浏览器只发出一次请求,Servlet、HTML、JSP或

其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对

象对于每个信息资源是共享的。

比如:从AServlet请求转发到BServlet

・语法:

request.getRequestDispatcher(path).forward(requestresponse);

参数:path,要跳转到的资源路径:上下文路径/资源路径

特点:

1.地址栏中的地址【不会】改变,通常看作是服务端的跳转

2.只有一个请求

3.资源是共享的

也就是说在两个Servlet中可以共享请求的资源,可以通过

request.setAttribute(Stringvarl,Objectvar2)设置要共享的数据资源,并通

过request.getAttribute(Stringvarl);来获取传递的资源

4.【可以】访问WEB-INF中的资源

WEB-INF文件夹是JavaWeb应用的默认安全目录,即客户端无法直接访问,只有

服务端可以访问的目录。如果想在页面中直接访问其中的文件,必须通过

web.xml文件对要访问的文件进行相应映射才能访问。

注意:在实际的开发中,可以把不希望用户直接访问到(通过浏览器输入地址栏)

的网页放在文件夹中通过此方式访问。

5.请求转发【不能】跨域访问

所谓的同域,是指域名,协议,端口均相同

2.UR1重定向(redirect)

又叫做间接转发方式(Redirect)实际是两次HTTP请求,服务器端在响应第一

次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。

比如:从AServlet重定向到BServlet

AServlet

浏贤者____________,

a.request

a.re^ponse

/

X

Tomcat

_____2^BSeivlet

一b.request

'===:b.response

・语法:

response.sendRedirect(Stringlocation);

参数:location,转发到的资源路径

特点:

1.地址栏中的地址【会】发生改变,通常看作是客户端跳转

2.有两个请求

3.在两个Servlet中不可以共享请求中的数据

4.最终的响应由BServlet来决定,和AServlet没有关系

5.【不可以】访问WEB-INF中的资源

6.请求转发【能】跨域访问

就像是在网页中点开了新的链接一样

•总结:URL重定向相当于是将重定向的资源路径,重新复制到浏览器地址栏

中按下回车一样,重新发送一次新的请求。

7)JSP的执行原理?

当访问一个JSP页面时,该页面请求将会讲给服务器中的JSP引擎去处理,它负责

解释和执行JSP页面,每个JSP页面在第一次被访问时,JSP引擎就会将它翻译成

一个继承自org.apache,jasper.runtime.HttpJspBase类的Servlet源程序,接着

再编译成class类文件,再由Web容器像调用普通Servlet程序一样的方式来装载

和解释执行这个由JSP页面翻译成的Servlet程序。

8)request.getAttribute()和request.getParameter。有何区另!j?

1.request.getParameterQ通常用来接收接收表单的get或者post提交过来的参

数;而request.getAttribute。一般和setAttribute。搭配使用,只有先set之后

才能通过get方法获取到Object类型的数据

2.getAttribute返回的是对象,而getParameter返回的是字符串

3.getAttribute和setAttribute只是在web容器内流转,仅仅是请求处理阶段;

而getParameter取到的数据是通过容器来获取的。

9)JSP与Servlet的区别?

1.JSP实质上就是一个Servlet。可以理解为,JSP是编译后的"Servlet类";

2.JSP由HTML代码和JSP标签组成,更擅长页面显示;而Servlet更擅长流程控

制;

3.JSP感觉像是HTML中嵌入Java代码,而Servlet有些像Java中嵌入HTML代

码的意思。

10)JSP静态包含和动态包含的区别?

(1)静态包含:编译指令包含

<%@includefile="被包含的页面的路径“%>

包含的时机:在JSP文件被翻译的时候合并在一起,最终翻译得到一个class文件

(2)动态包含:动作指令包含

<jsp:includepage="被包含页面的路径"></jsp:include》

包含的时机:在运行阶段合并代码,最终得到两个class文件

(3)动态包含和静态包含的选择:

•如果被包含的页面如果是静态页面,那么使用静态包含;

•如果被包含的如果是动态页面,那么使用动态包含。

11)JSP有哪些内置对象?作用分别是什么?

JSP共有以下9个内置的对象:

1.request:用户端请求,此请求会包含来自GET/POST请求的参数;

2.response:表示一次响应对象;

3.pageContext:表示当前的JSP对象;

4.session:表示一次会话对象;

5.application:表示当前应用对象;

6.out:表示一个输出流对象;

7.config:表示当前JSP的配置对象;

8.page:表示当前页面;

9.exception:表示异常对象。

12)JSTL是什么?优点有哪些?

JSTL(JSPStandardTagLibrary,JSP标准标签库)是一个不断完善的开放源代码的

JSP标签库,由四个定制标记库(core、format、xml和sqD和一对通用标记库验

证器(ScriptFreeTLV和PermittedTaglibsTLV)组成。优点有:

1.在应用程序服务器之间提供了一致的接口,最大程序地提高了WEB应用在各

应用服务器之间的移植。

2.简化了JSP和WEB应用程序的开发。

3.以一种统一的方式减少了JSP中的scriptlet代码数量,可以达到没有任何

scriptlet代码的程序。在我们公司的项目中是不允许有任何的scriptlet代码出

现在JSP中。

4.允许JSP设计工具与WEB应用程序开发的进一步集成。相信不久就会有支持

JSTL的IDE开发工具出现。

13)什么是Cookie?Session和Cookie有什么区别?

Cookie技术

Cookie是一种会话技术,用于将用户的信息保存在客户端上。Cookie英文直接翻

译过来就是小甜品,Cookie的作用呢,通俗的说就是当一个用户通过HTTP访问

一个服务器时,这个服务器会将一些Key/Value键值对返回给客户端浏览器,并给

这些数据加上一些限制条件,在条件符合时这个用户下次访问这个服务器时.,数据

又被完整地带回给服务器。

这个作用就像是你去超市购物时,第一次给你办了一张购物卡,在这个购物卡里存

放了一些你的个人信息,下次你再来这个超市的时候,你就只需要带上你的购物卡,

直接购物就好了。

第一次超市

办卡收银台

办卡:积分,用户个人信息

Session技术

Session:会话,从浏览器打开开始,直到浏览器关闭结束,无论在这个网站中访

问了多少页面,点击了多少链接,都属于同一个会话。Session也可以称为会话

Cookie

•特点:服务端技术,将数据保存在服务器

持用户的值息存储在超市的三机上

第一次超市

获取数据的方式:

办卡收银台

1.刷卡

办卡:积分,用户个人信息

2.根据手机号

-______________________/

Cookie与Session的区别

・Cookie的数据是存放在客户的浏览器上,Session数据放在服务器上;

•Cookie不是很安全,别人可以分析存放在本地的Cookie并进行Cookie欺骗,

如果考虑安全问题则应当使用Session;

•Session会在一定时间内保存在服务器上,当访问增多,会比较占用服务器的

资源,所以如果考虑性能问题,则应当使用Cookie;

・单个Cookie在客户端的限制是3k,就是说一个站点在客户端存放的Cookie

不能超过3ko

总结:将登录信息等重要信息存放为Session;其他信息如果需要保留,可以存放

在Cookie中o

14)什么是过滤器?

过滤器就是Servlet的高级特性之一,就是一个具有拦截/过滤功能的一个东西,

在生活中过滤器可以是香烟滤嘴,滤纸,净水器,空气净化器等,在Web中仅仅

是一个实现了Filter接口的Java类而已。

特点:双向,拦截请求,拦截响应

・作用:

过滤器可以对所有的请求或者响应做拦截操作

15)为什么在Web开发中需要用到过滤器?

•问题:为什么非得使用过滤器,我直接在Servlet中作判断不行吗?

・开发遵循的原则:

1.DRY原则(Don'tReeatYourself,不要重复你自己):重复,意味着维护

的成本很高。

2.责任分离原则:谁擅长什么功能就做什么功能,Servlet擅长的是逻辑而不

是处理请求

举一个实际的例子:(处理POST请求中文编码的问题)

没有使用过湖发使用过滤器

〃&aPOST得手丽

reque$t.ietClwa«ef€ncodingf,UTF-6,1

“1000..

Servlet

■POST湾于*

request.”tCharacterfncodingCUTF・8'X

//T000...

・Web中过滤器的作用:

1.可以在请求资源之前设置请求的编码

2.可以进行登录校验

3.可以进行请求参数的内容的过滤

4.数据压缩/数据加密/数据格式的转换

5.可以设置浏览器相关的数据

16)MVC模式?

MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件

系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller):

•Controller负责转发请求,对请求进行处理

,View负责界面显示

•Model一一业务功能编写(例如算法实现)、数据库设计以及数据存取操作实

在JSP/Servlet开发的软件系统中,这三个部分的描述如下所示:

l.Web浏览器发送HTTP请求到服务端,被Controller(Servlet)获取并进行处理

(例如参数解析、请求转发)

2.ControUer(Servlet)调用核心业务逻辑--Model部分,获得结果

3.ControUer(Servlet)将逻辑处理结果交给View(JSP),动态输出HTML内容

4.动态生成的HTML内容返回到浏览器显示

MVC模式在Web开发中的好处是非常明显,它规避了JSP与Servlet各自的短板,

Servlet只负责业务逻辑而不会通过out.append。动态生成HTML代码;JSP中也

不会充斥着大量的业务代码。这大大提高了代码的可读性和可维护性。

•参考:知乎@David

(二)框架相关知识

由于我没有接触和学习过Hibernate和Struts这两个框架,所以细节方面的东西请读者自行收集…

1)什么是框架?

框架是指完成一定功能的半成品。

框架能够帮助我们完成的是:项目的整体框架、一些基础功能、规定了类和对象如

何创建,如何协作等,当我们开发一个项目时.,框架帮助我们完成了一部分功能,

我们自己再完成一部分,那这个项目就完成了。

2)什么是Spring?

1.Spring是一个轻量级的DI/IoC和AOP容器的开源框架,来源于Rod

Johnson在其著作《ExpertoneononeJ2EEdesignanddevelopment》中阐述

的部分理念和原型衍生而来。

2.Spring提倡以"最少侵入”的方式来管理应用中的代码,这意味着我们可以随

前安装或者卸载Spring

•适用范围:任何Java应用

•Spring的根本使命:简化Java开发

3)什么是非侵入式设计?

从框架的角度可以理解为:无需继承框架提供的任何类

这样我们在更换框架时,之前写过的代码儿乎可以继续使用。

4)Spring有什么优势?

•低侵入/低耦合(降低组件之间的耦合度,实现软件各层之间的解耦)

・声明式事务管理(基于切面和惯例)

•方便集成其他框架(如MyBatis、Hibernate)

•降低Java开发难度

•Spring框架中包括了J2EE三层的每一层的解决方案(一站式)

Spring的框架结构

OverviewoftheSpringFramework

•DataAccess/Integration层包含有JDBC、ORM>OXM^JMSTransaction

模块。

•Web层包含了Web、Web-Servlet、WebSocket、Web-Porlet模块。

・AOP模块提供了一个符合AOP联盟标准的面向切面编程的实现。

•CoreContainer(核心容器):包含有Beans、Core、Context和SpEL模块。

•Test模块支持使用JUnit和TestNG对Spring组件进行测试。

5)SpringloC和DI分别是什么?

SpringloC

loC:InverseofControl(控制反转),读作"反转控制",更好理解,不是什么技

术,而是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由

Spring框架来管理。

正控:若要使用某个对象,需要自己去负责对象的创建

•反控:若要使用某个对象,只需要从Spring容器中获取需要使用的对象,不

关心对象的创建过程,也就是把创建对象的控制权反转给了Spring框架

•好莱坞法则:Don'tcallme,111callyou

为了便于理解我们这里举一个鲜明的例子:

在现实生活中,人们要用到一样东西的时候,第一反应就是去找到这件东西,比如

想喝新鲜橙汁,在没有饮品店的日子里,最直观的做法就是:买果汁机、买橙子,

然后准备开水。值得注意的是:这些都是你自己"主动”创造的过程,也就是说一杯

橙汁需要你自己创造。

然而到了今时今日,由于饮品店的盛行,当我们想喝橙汁时,第一想法就转换成了

找到饮品店的联系方式,通过电话等渠道描述你的需要、地址、联系方式等,下订

单等待,过一会儿就会有人送来橙汁了。

请注意你并没有“主动”去创造橙汁,橙汁是由饮品店创造的,而不是你,然而也完

全达到了你的要求,甚至比你创造的要好上那么一些。

•总结:这就是一种控制反转的理念,上述的例子已经很好的说明了问题,我

们再来描述一下控制反转的概念:控制反转是一种通过描述(在Java中可以

是XML或者注解)并通过第三方(Spring)去产生或获取特定对象的方式。

•好处:①降低对象之间的耦合;②我们不需要理解一个类的具体实现,只

需要知道它有什么用就好了(直接向IoC容器拿)

DI:DependencyInjection(依赖注入)

指Spring创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置

设值给该对象

两者的区别

IoC和DI其实是同一个概念的不同角度描述,DI相对IoC而言,明确描述了“被注

入对象依赖IoC容器配置依赖对象”。

你也可以简单的理解为:IoC是目的,是一种思想,而DI是手段,是一种设计模

式。

6)BeanFactory和Applicationcontext的区别

l.BeanFactory:

是Spring中最底层的接口,只提供了最简单的IoC功能,负责配置,创建和管理

bean»在应用中,一般不使用BeanFactory,而推荐使Applicationcontext(应用

上下文),原因如下。

2.Applicationcontext:

⑴,继承了BeanFactory,拥有了基本的IoC功能;

⑵.除此之外,Applicationcontext还提供了以下功能:

①支持国际化;②支持消息机制;(3)支持统一的资源加载;④支持AOP功能;

•注意:Applicationcontext和BeanFactory相比,最主要的区别在于

BeanFactory是延迟加载,举个例子:如果Bean没有完全注入,BeanFactory

加载后,会在你第一次调用getBean方法才会抛出异常;而

Applicationcontext会在初始化的时候就加载并且检查,这样的好处是可以及

时麓查依赖是否完全注入;所以通常我们会选择ApplicationContexto

7)IoC是如何实现的

最后我们简单说说IoC是如何实现的。想象一下如果我们自己来实现这个依赖注入

的功能,我们怎么来做?无外乎:

1.读取标注或者配置文件,看看JuiceMaker依赖的是哪个Source,拿到类名

2.使用反射的API,基于类名实例化对应的对象实例

3.将对象实例,通过构造函数或者setter,传递给JuiceMaker

我们发现其实自己来实现也不是很难,Spring实际也就是这么做的。这么看的话

其实IoC就是一个工厂模式的升级版!当然要做一个成熟的IoC框架,还是非常多

细致的工作要做,Spring不仅提供了一个已经成为业界标准的JavaIoC框架,还

提供了更多强大的功能,所以大家就别去造轮子啦!希望了解IoC更多实现细节不

妨通过学习Spring的源码来加深理解!

引用地址:这里

8)Spring配置Bean有几种方式?

在Spring中提供了3种方法进行配置:

・在XML文件中显式配置

・在Java的接口和类中实现配置

•隐式Bean的发现机制和自动装配原则

方式选择的原则

在现实的工作中,这3种方式都会被用到,并且在学习和工作之中常常混合使用,

所以这里给出一些关于这3种优先级的建议:

1.最优先:通过隐式Bean的发现机制和自动装配的原则。

基于约定由于配置的原则,这种方式应该是最优先的

•好处:减少程序开发者的决定权,简单又不失灵活。

2.其次:Java接口和类中配置实现配置

在没有办法使用自动装配原则的情况下应该优先考虑此类方法

•好处:避免XML配置的泛滥,也更为容易。

・典型场景:一个父类有多个子类,比如学生类有两个子类,一个男学生类和女

学生类,通过IoC容器初始化一个学生类,容器将无法知道使用哪个子类去初

始化,这个时候可以使用Java的注解配置去指定。

3.最后:XML方式配置

在上述方法都无法使用的情况下,那么也只能选择XML配置的方式。

・好处:简单易懂(当然,特别是对于初学者)

・典型场景:当使用第三方类的时候,有些类并不是我们开发的,我们无法修改

里面的代码,这个时候就通过XML的方式配置使用了。

9)介绍一下SpringAOP

AOP即AspectOrientedProgram面向切面编程

首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。

所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务

所谓的周边功能,比如性能统计,日志,事务管理等等

周边功能在Spring的面向切面编程AOP思想里,即被定义为切面

在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发,

然后把切面功能和核心业务功能"编织"在一起,这就叫AOP

还是来举一个鲜明的例子:

关注点和主要业务分离开@我没有三颗心脏

在上面的例子中,包租婆的核心业务就是签合同,收房租,那么这就够了,灰色框

起来的部分都是重复且边缘的事,交给中介商就好了,这就是AOP的一个思想:

让关注点代码与业务代码分离!

10)Spring中Bean的作用域

在默认的情况下,SpringIoC容器只会对一个Bean创建一个实例,但有时候,我

们希望能够通过SpringIoC容器获取多个实例,我们可以通过@Scope注解或

者<bean>元素中Mscope属性来设置,例如:

//XML中设置作用域

<beanid=""class=""scope="prototype"/>

//使用注解设置作用域

@Scope(ConfigurableBeanFactory.SC0PE_PR0T0TYPE)

Spring提供了5种作用域,它会根据情况来决定是否生成新的对象:

作用域类别描述

singleton(单例)在SpringIoC容器中仅存在一个Bean实例(默认的scope)

prototype(多例)每次从容器中调用Bean时・,都返回一个新的实例,即每次调

用getBean。时,相当于执行newXxxBean。:不会在容器启

动时创建对象

request(请求)用于web开发,将Bean放入request范围,

request.setAttributef'xxx"),在同一个request获得同一个

Bean

session(会话)用于web开发,将Bean放入Session范围,在同一^

Session获得同一个Bean

globalSession(全局一般用于Porlet应用环境,分布式系统存在全局session概念

会话)(单点登录),如果不是porlet环境,globalSession等同于

Session

在开发中主要使用scope="singleton"、scope="prototype",对于MVC中的

Action使用prototype类型,其他使用singleton,Spring容器会管理Action对

象的创建此时把Action的作用域设置为prototype.

扩展阅读:@Profile注解、条件化装配Bean

11)Spring面试问答Top25

更多戳这里:Spring面试问答Top25

12)SpringMVC的请求流程

每当用户在Web浏览器中点击链接或者提交表单的时候,请求就开始工作了,像

是邮递员一样,从离开浏览器开始到获取响应返回,它会经历很多站点,在每一个

站点都会留下一些信息同时也会带上其他信息,下图为SpringMVC的请求流程:

第一站:DispatcherServlet

从请求离开浏览器以后,第一站到达的就是DispatcherServlet,看名字这是一个

Servlet,通过J2EE的学习,我们知道Servlet可以拦截并处理HTTP请求,

DispatcherServlet会拦截所有的请求,并且将这些请求发送给SpringMVC控制器。

<servlet>

<servlet-name>dispatcher</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</s

ervlet-class>

<load-on-startup>l</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>dispatcher</servlet-name>

<!--拦截所有的请求

<url-pattern>/</url-pattern>

</servlet-mapping>

•DispatcherServlet的任务就是拦截请求发送给SpringMVC控制器。

第二站:处理器映射(HandlerMapping)

•问题:典型的应用程序中可能会有多个控制器,这些请求到底应该发给哪一

个控制器呢?

所以DispatcherServlet会查询一个或多个处理器映射来确定请求的下一站在哪里,

处理器映射会根据请求所携带的URL信息来进行决策,例如上面的例子中,我们

通过配置simpleUrlHandlerMapping来将/hello地址交给helloController处理:

<beanid=HsimpleUrlHandlerMapping"

class="org.springframework.web.servlet.handler.SimpleUrlHandlerMa

pping">

<propertyname="mappings,'>

<props>

<!--/hello路径的请求交给id为helloController的控制器处理

<propkey="/hello">helloController</prop>

</props>

</property>

</bean>

<beanid="helloController"class="controller.HelloController"x/bean>

第三站:控制器

一旦选择了合适的控制器,DispatcherServlet会将请求发送给选中的控制器,到

了控制器,请求会卸下其负载(用户提交的请求)等待控制器处理完这些信息:

publicModelAndViewhandleRequest(javax.servlet.http.HttpServletRequest

httpServletRequest,javax.servlet.http.HttpServletResponsehttpServlet

Response)throwsException{

//处理逻辑

)

第四站:返回DispatcherServlet

当控制器在完成逻辑处理后,通常会产生一些信息,这些信息就是需要返回给用户

并在浏览器上显示的信息“它们被称为模型(Model)。仅仅返回原始的信息时不

够的一一这些信息需要以用户友好的方式进行格式化,一般会是HTML,所以,信

息需要发送给一个视图(view),通常会是JSP。

控制器所做的最后一件事就是将模型数据打包,并且表示出用于渲染输出的视图名

(逻辑视图名)。它接下来会将请求连同模型和视图名发送回DispatcherServleto

publicModelAndViewhandleRequest(javax.servlet.http.HttpServletRequest

httpServletRequest,javax.servlet.http.HttpServletResponsehttpServlet

Response)throwsException{

//处理逻辑

//返回给DispatcherServlet

returnmav;

第五站:视图解析器

这样以来,控制器就不会和特定的视图相耦合,传递给DispatcherServlet的视图

名并不直接表示某个特定的JSP。(实际上,它甚至不能确定视图就是JSP)相反,

它传递的仅仅是一个逻辑名称,这个名称将会用来查找产生结果的真正视图。

DispatcherServlet将会使用视图解析器(viewresolver)来将逻辑视图名匹配为一

个特定的视图实现,它可能是也可能不是JSP

上面的例子是直接绑定到了indexjsp视图

第六站:视图

既然DispatcherServlet已经知道由哪个视图渲染结果了,那请求的任务基本上也

就完成了。

它的最后一站是视图的实现,在这里它交付模型数据,请求的任务也就完成了。视

图使用模型数据渲染出结果,这个输出结果会通过响应对象传递给客户端。

<%@pagelanguage="java"contentType="text/html;charset=UTF-8"

pageEncoding="UTF-8"isELIgnored="false"%>

<hl>${message}</hl>

更多Spring-MVC内容:SpringMVC【入门】就这一篇

13)什么是ORM?

对象关系映射(Object-RelationalMapping,简称ORM)是一种为了解决程序的面

向对象模型与数据库的关系模型互不匹配问题的技术;

简单的说,ORM是通过使用描述对象和数据库之间映射的元数据(在Java中可以

用XML或者是注解),将程序中的对象自动持久化到关系数据库中或者将关系数

据库表中的行转换成Java对象,其本质上就是将数据从一种形式转换到另外一种

形式。

14)为什么要使用MyBatis?

在我们传统的JDBC中,我们除了需要自己提供SQL外,还必须操作Connection、

Statment、ResultSet,不仅如此,为了访问不同的表,不同字段的数据,我们需要

些很多雷同模板化的代码,闲的繁琐又枯燥。

而我们在使用了MyBatis之后,只需要提供SQL语句就好了,其余的诸如:建立

连接、操作Statment、ResultSet,处理JDBC相关异常等等都可以交给MyBatis去

处理,我们的关注点于是可以就此集中在SQL语句上,关注在增删改查这些操作

层面上。

并且MyBatis支持使用简单的XML或注解来配置和映射原生信息,将接口和Java

的POJOsfPlainOldJavaObjects,普通的Java对象)映射成数据库中的记录。

15)MyBatis中占位符#和$的区别

区别如下:

1.#符号将传入的数据都当做一个字符串,会对自动传入的数据加一个双引号

2.$符号将传入的数据直接显示生成SQL中。

3.#符号存在预编译的过程,,对问号赋值,防止SQL注入。

4.$符号是直译的方式,一般用在orderby{列名}语句中。

5.能用#号就不要用$符号

16)MyBatis缓存结构

sqlSessionl^sqISession2〉sqlSession3..>

一级缓存.一级缓存,一级缓存,

二级缓存.

Jai'/a3y

在Web系统中,最重要的操作就是查询数据库中的数据。但是有些时候查询数据

的频率非常高,这是很耗费数据库资源的,往往会导致数据库查询效率极低,影响

客户的操作体验。于是我们可以将一些变动不大且访问频率高的数据,放置在一个

缓存容器中,用户下一次查询时就从缓存容器中获取结果。

・MyBatis拥有自己的缓

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论