Java开发校招面试考点汇总第五篇:JAVA Web/JSP/Servlet

1、● 1分钟之内只能处理1000个请求,你怎么实现
2、● 请问如何在链接里不输入项目名称的情况下启动项目?
3、服务器执行jsp页面时,会将jsp页面转换成servlet类。
4、● 请说明一下JSP中的静态包含和动态包含的有哪些区别?
5、● 请谈一谈JSP有哪些内置对象?以及这些对象的作用分别是什么?
6、javabean
7、servlet
8、● 请说明一下jsp有哪些动作? 这些动作的作用又分别是什么?
9、● 请详细说明一下Request对象的主要方法是什么?
10、● 请简要说明一下JSP和Servlet有哪些相同点和不同点?另外他们之间的联系又是什么呢?
11、● 请简要说明一下会话跟踪技术?
12、● 请说明一下web.xml文件中可以配置哪些内容?
13、● 请谈谈你对Javaweb开发中的监听器的理解?
14、● 请问过滤器有哪些作用?以及过滤器的用法又是什么呢?
15、● 请问使用Servlet如何获取用户配置的初始化参数以及服务器上下文参数?
16、● 请问使用Servlet如何获取用户提交的查询参数以及表单数据?
17、● 请问如何在基于Java的Web项目中实现文件上传?
18、● 请说明一下Servlet 3中的异步处理指的是什么?
19、● 说说Servlet接口中有哪些方法?
20、EL表达式
21、● 请说一下表达式语言(EL)的隐式对象以及该对象的作用
22、● 请说出Servlet的生命周期是什么样的?并且请分析一下Servlet和CGI的区别。
23、Servlet是单例多线程
24、● 请简要说明一下forward与redirect区别
25、说一下你知道的状态码都有哪些?
26、● 说说你对get和post请求,并且说说它们之间的区别?
27、● 请你说明一下,如何设置请求的编码以及响应内容的类型?
28、● 请你说说,cookie 和 session 的区别?

1、● 1分钟之内只能处理1000个请求,你怎么实现
限流的几种方法:计数器、漏桶法、令牌桶
1)、计数器算法
采用计数器实现限流有点简单粗暴,一般我们会限制一秒钟的能够通过的请求数,比如限流qps为100,算法的实现思路就是从第一个请求进来开始计时,在接下去的1s内,每来一个请求,就把计数加1,如果累加的数字达到了100,那么后续的请求就会被全部拒绝。等到1s结束后,把计数恢复成0,重新开始计数。
这种实现方式,相信大家都知道有一个弊端:如果我在单位时间1s内的前10ms,已经通过了100个请求,那后面的990ms,只能眼巴巴的把请求拒绝,我们把这种现象称为“突刺现象”

2)、漏桶算法

为了消除"突刺现象",可以采用漏桶算法实现限流,漏桶算法这个名字就很形象,算法内部有一个容器,类似生活用到的漏斗,当请求进来时,相当于水倒入漏斗,然后从下端小口慢慢匀速的流出。不管上面流量多大,下面流出的速度始终保持不变。

不管服务调用方多么不稳定,**通过漏桶算法进行限流,每10毫秒处理一次请求。**因为处理的速度是固定的,请求进来的速度是未知的,可能突然进来很多请求,没来得及处理的请求就先放在桶里,既然是个桶,肯定是有容量上限,如果桶满了,那么新进来的请求就丢弃。

3)、令牌桶算法
在令牌桶算法中,存在一个桶,用来存放固定数量的令牌。算法中存在一种机制,以一定的速率往桶中放令牌。每次请求调用需要先获取令牌,只有拿到令牌,才有机会继续执行,否则选择选择等待可用的令牌、或者直接拒绝。

放令牌这个动作是持续不断的进行,如果桶中令牌数达到上限,就丢弃令牌,所以就存在这种情况,桶中一直有大量的可用令牌,这时进来的请求就可以直接拿到令牌执行,比如设置qps为100,那么限流器初始化完成一秒后,桶中就已经有100个令牌了,这时服务还没完全启动好,等启动完成对外提供服务时,该限流器可以抵挡瞬时的100个请求。所以,只有桶中没有令牌时,请求才会进行等待,最后相当于以一定的速率执行。

2、● 请问如何在链接里不输入项目名称的情况下启动项目?
修改tomcat文件:server.xml
找到自己的项目设置:


修改成:


这样项目启动的时候就用不用输入项目名称了。

3、服务器执行jsp页面时,会将jsp页面转换成servlet类。

4、● 请说明一下JSP中的静态包含和动态包含的有哪些区别?
一、静态包含:<%@ include file=”包含页面”%>
静态包含发生在编译阶段,静态include是先把被包含文件的内容全部复制内嵌到包含文件中,再进行编译运行的。

二、动态包含:
动态包含用于加载经常变化的、要求显示最新版本内容的东西,包含文件与被包含文件都是先编译执行,再包含。换言之,包含文件先编译,执行。执行到了include语句的时候才触发被包含文件的编译、执行,并实时把结果包含进来。
即,运行后把结果加入页面

5、● 请谈一谈JSP有哪些内置对象?以及这些对象的作用分别是什么?

  • 重要:
  • request:封装客户端的请求,其中包含来自GET或POST请求的参数;
  • response:封装服务器对客户端的响应;
  • session:封装用户会话的对象;
  • application:封装服务器运行环境的对象;
  • out:输出服务器响应的输出流对象;
  • 不重要:
  • config:Web应用的配置对象;
  • page:JSP页面本身(相当于Java程序中的this);
  • exception:封装页面抛出异常的对象。
  • pageContext:通过该对象可以获取其他对象;

6、javabean
如果使html代码与java代码分离,将java代码单独封装成为一个处理某种业务逻辑的类,然后再jsp页面中调用此类,就可以降低html代码和java代码之间的耦合度,简化jsp页面。提高java程序代码的重用性及灵活性。这种与html代码相分离,而使用java代码封装的类,就是一个javabean组件。

7、servlet
servlet是运行在web服务器端的java应用程序,它使用java语言编写,具有java语言的优点。与java程序的区别是,servlet对象主要封装了对http请求的处理,并且它的运行需要servlet容器的支持。servlet本质上就是按照servlet规范编写的java类。
通常我们所说的servlet对象是指HttpServlet对象。

8、● 请说明一下jsp有哪些动作? 这些动作的作用又分别是什么?
JSP 共有以下6种基本动作
jsp:include:在页面被请求的时候引入一个文件。
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:forward:把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记。

9、● 请详细说明一下Request对象的主要方法是什么?
setAttribute(String name,Object):设置名字为name的request的参数值
getAttribute(String name):返回由name指定的属性值
getAttributeNames():返回request对象所有属性的名字集合,结果是一个枚举的实例
getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组
getCharacterEncoding():返回请求中的字符编码方式
getContentLength():返回请求的Body的长度
getHeader(String name):获得HTTP协议定义的文件头信息
getHeaders(String name):返回指定名字的request Header的所有值,结果是一个枚举的实例
getHeaderNames():返回所以request Header的名字,结果是一个枚举的实例
getInputStream():返回请求的输入流,用于获得请求中的数据
getMethod():获得客户端向服务器端传送数据的方法
getParameter(String name):获得客户端传送给服务器端的有name指定的参数值
getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例
getParameterValues(String name):获得有name指定的参数的所有值
getProtocol():获取客户端向服务器端传送数据所依据的协议名称
getQueryString():获得查询字符串
getRequestURI():获取发出请求字符串的客户端地址
getRemoteAddr():获取客户端的IP地址
getRemoteHost():获取客户端的名字
getSession([Boolean create]):返回和请求相关Session
getServerName():获取服务器的名字
getServletPath():获取客户端所请求的脚本文件的路径
getServerPort():获取服务器的端口号
removeAttribute(String name):删除请求中的一个属性

10、● 请简要说明一下JSP和Servlet有哪些相同点和不同点?另外他们之间的联系又是什么呢?
JSP 是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是”类servlet”。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑

11、● 请简要说明一下会话跟踪技术?
实现会话跟踪最常见的技术就是使用Session或者Cookie.
Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态。

session和cookie的区别
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

12、● 请说明一下web.xml文件中可以配置哪些内容?
web.xml用于配置Web应用的相关信息,如:监听器(listener)、过滤器(filter)、 Servlet、相关参数、会话超时时间、安全验证方式、错误页面等,下面是一些开发中常见的配置:

①配置Spring上下文加载监听器加载Spring配置文件并创建IoC容器:

contextConfigLocation
classpath:applicationContext.xml




org.springframework.web.context.ContextLoaderListener



②配置Spring的OpenSessionInView过滤器来解决延迟加载和Hibernate会话关闭的矛盾:


openSessionInView

org.springframework.orm.hibernate3.support.OpenSessionInViewFilter




openSessionInView
/*


③配置会话超时时间为10分钟:


10


④配置404和Exception的错误页面:

404
/error.jsp



java.lang.Exception
/error.jsp

⑤配置安全认证方式:



ProtectedArea
/admin/*
GET
POST


admin




BASIC



admin

13、● 请谈谈你对Javaweb开发中的监听器的理解?
监听器主要的功能是负责监听web的各种操作,当相关事件触发之后将产生事件,并对此事件进行处理,在web中可以对application、session、request三种操作进行监听。
一、对application的监听
application是servletContext接口的对象,表示的是整个上下文环境,如果要想实现对application监听则可以使用如下两个接口:
servletContextListener:是对整个上下文环境的监听
servletContextAttrubiteListener:是对属性的监听。

二、对session的监听
Java开发校招面试考点汇总第五篇:JAVA Web/JSP/Servlet_第1张图片
三、对request的监听
Java开发校招面试考点汇总第五篇:JAVA Web/JSP/Servlet_第2张图片

14、● 请问过滤器有哪些作用?以及过滤器的用法又是什么呢?
可以截取客户端和服务器之间的请求与响应信息,并对这些信息进行过滤。(从客户端到服务器端要过滤,从服务器端到客户端也要过滤)
当Web容器接受到一个对资源的请求时,它将判断是否有过滤器与这个资源相关联。如果有,那么容器将把请求交给过滤器进行处理。在过滤器中,你可以改变请求的内容,或者重新设置请求的报头信息,然后再将请求发送给目标资源。当目标资源对请求作出响应时候,容器同样会将响应先转发给过滤器,在过滤器中你可以对响应的内容进行转换,然后再将响应发送到客户端。
常见的过滤器用途主要包括:对用户请求进行统一认证、对用户的访问请求进行记录和审核、对用户发送的数据进行过滤或替换、转换图象格式、对响应内容进行压缩以减少传输量、对请求或响应进行加解密处理、触发资源访问事件、对XML的输出应用XSLT等。
和过滤器相关的接口主要有:Filter、FilterConfig和FilterChain

15、● 请问使用Servlet如何获取用户配置的初始化参数以及服务器上下文参数?
可以通过重写Servlet接口的init(ServletConfig)方法并通过ServletConfig对象的getInitParameter()方法来获取Servlet的初始化参数。可以通过ServletConfig对象的getServletContext()方法获取ServletContext对象,并通过该对象的getInitParameter()方法来获取服务器上下文参数。

16、● 请问使用Servlet如何获取用户提交的查询参数以及表单数据?
可以通过请求对象(HttpServletRequest)的getParameter()方法通过参数名获得参数值。如果有包含多个值的参数(例如复选框),可以通过请求对象的getParameterValues()方法获得。

17、● 请问如何在基于Java的Web项目中实现文件上传?
servlet3.0以后提供了对上传文件的支持
实现文件上传需要以下两项内容:
1/需要添加@MultipartConfig
2/从request对象中获取Part文件对象

18、● 请说明一下Servlet 3中的异步处理指的是什么?
在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理。如果一个请求需要进行IO操作,比如访问数据库、调用第三方服务接口等,那么其所对应的线程将同步地等待IO操作完成, 而IO操作是非常慢的,所以此时的线程并不能及时地释放回线程池以供后续使用,在并发量越来越大的情况下,这将带来严重的性能问题。
Servlet 3.0引入了异步处理,过程如下:
首先,Servlet 接收到请求之后,可能首先需要对请求携带的数据进行一些预处理;
接着,Servlet 线程将请求转交给一个异步线程来执行业务处理,线程本身返回至容器,此时 Servlet 还没有生成响应数据,异步线程处理完业务以后,可以直接生成响应数据(异步线程拥有 ServletRequest 和 ServletResponse 对象的引用),或者将请求继续转发给其它 Servlet。
如此一来, Servlet 线程不再是一直处于阻塞状态以等待业务逻辑的处理,而是启动异步线程之后可以立即返回。

19、● 说说Servlet接口中有哪些方法?
Servlet接口定义了5个方法,其中前三个方法与Servlet生命周期相关:

  • void init(ServletConfig config) throws ServletException
  • void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException
  • void destory()
  • java.lang.String getServletInfo()
  • ServletConfig getServletConfig()
    Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其init()方法进行Servlet的初始化;请求到达时调用Servlet的service()方法,service()方法会根据需要调用与请求对应的doGet或doPost等方法;当服务器关闭或项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet的destroy()方法。getServletConfig()方法返回一个servletConfig对象,该对象用来返回初始化参servletContext。servletContext接口提供有关servlet的环境信息。getServletInfo()方法提供有关servlet的信息,如作者,版本,版权。

20、EL表达式
EL(Expression Language) 是为了使JSP写起来更加简单。,在EL没有出现之前,开发javaweb应用程序时,经常需要将大量的java代码片段嵌入到jsp页面中,这会使页面看起来很乱,而使用EL则比较简洁。
例如,对应于以下 Java 代码片段:

<%
if(session.getAttribute(nunamen)!==null)
{
    Out.println(session.getAtribute("uname").toString());
}
%>

如果使用 EL 表达式,则只需要下面一行代码:

$ {uname}

21、● 请说一下表达式语言(EL)的隐式对象以及该对象的作用
EL的隐式对象包括:
1、pageContext:页面上下文对象,用于访问JSP内置对象,注意访问的是jsp内置对象,不是el的隐式对象。
2、pageScope(访问page作用域内的对象)。
3、requestScope(访问request作用域的对象)、
4、applicationScope(访问application作用域的对象)
5、sessionScope(访问session作用域的对象)
6、param(访问请求参数)、
7、paramValues(如果一个请求参数名对应多个值时,使用此获取请求参数的值)
8、header(访问请求头)、
9、headerValues如果一个header拥有多个值时,使用此获取请求参数的值)
10、initParam(访问上下文参数)、
11、cookie(访问cookie)

22、● 请说出Servlet的生命周期是什么样的?并且请分析一下Servlet和CGI的区别。
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。

23、Servlet是单例多线程

24、● 请简要说明一下forward与redirect区别
1.从地址栏显示来说

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.

redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.

2.从数据共享来说

forward:转发页面和转发到的页面可以共享request里面的数据.

redirect:不能共享数据.

3.从运用地方来说

forward:一般用于用户登陆的时候,根据角色转发到相应的模块.

redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

4.从效率来说

forward:高.

redirect:低.

redirect的状态码是302

25、说一下你知道的状态码都有哪些?
Java开发校招面试考点汇总第五篇:JAVA Web/JSP/Servlet_第3张图片
1、200 OK请求已正常处理

2、204 No Content请求处理成功,但没有任何资源可以返回给客户端,一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。

3、206 Partial Content:是对资源某一部分的请求,该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。

4、301 Moved Permanently:资源的uri已更新,你也更新下你的书签引用吧。永久性重定向,请求的资源已经被分配了新的URI,以后应使用资源现在所指的URI。

5、302 Found:资源的URI已临时定位到其他位置了,姑且算你已经知道了这个情况了。临时性重定向。和301相似,但302代表的资源不是永久性移动,只是临时性性质的。换句话说,已移动的资源对应的URI将来还有可能发生改变。

6、303 See Other:资源的URI已更新,你是否能临时按新的URI访问。该状态码表示由于请求对应的资源存在着另一个URL,应使用GET方法定向获取请求的资源。303状态码和302状态码有着相同的功能,但303状态码明确表示客户端应当采用GET方法获取资源,这点与302状态码有区别。

7、400 Bad Request:服务器端无法理解客户端发送的请求,请求报文中可能存在语法错误。

8、401 Unauthorized:该状态码表示发送的请求需要有通过HTTP认证(BASIC认证,DIGEST认证)的认证信息。

9、403 Forbidden:不允许访问那个资源。该状态码表明对请求资源的访问被服务器拒绝了。(权限,未授权IP等)

10、404 Not Found:服务器上没有请求的资源。路径错误等。

11、500 Internal Server Error:貌似内部资源出故障了。该状态码表明服务器端在执行请求时发生了错误。也有可能是web应用存在bug或某些临时故障。

12、503 Service Unavailable:抱歉,我现在正在忙着。该状态码表明服务器暂时处于超负载或正在停机维护,现在无法处理请求。

26、● 说说你对get和post请求,并且说说它们之间的区别?
①get请求用来从服务器上获得资源,而post是用来向服务器提交数据;
②get将表单中数据按照name=value的形式,添加到action 所指向的URL 后面,并且两者使用"?“连接,而各个变量之间使用”&“连接;post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指向URL;
③get传输的数据要受到URL长度限制(1024字节);而post可以传输大量的数据,上传文件通常要使用post方式;
④使用get时参数会显示在地址栏上,如果这些数据不是敏感数据,那么可以使用get;对于敏感数据还是应用使用post;
⑤get使用MIME类型application/x-www-form-urlencoded的URL编码(也叫百分号编码)文本的格式传递参数,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是”%20"。

27、● 请你说明一下,如何设置请求的编码以及响应内容的类型?
通过请求对象(ServletRequest)的setCharacterEncoding(String)方法可以设置请求的编码,其实要彻底解决乱码问题就应该让页面、服务器、请求和响应、Java程序都使用统一的编码,最好的选择当然是UTF-8;通过响应对象(ServletResponse)的setContentType(String)方法可以设置响应内容的类型,当然也可以通过HttpServletResponsed对象的setHeader(String, String)方法来设置。

28、● 请你说说,cookie 和 session 的区别?
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗

考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

你可能感兴趣的:(java基础)