JSP与Servlet面试题

Servlet面试题

  1. Servlet接口中有哪些方法?
    Servlet接口定义了5个方法,其中前三个方法与Servlet生命周期相关:
    1. void init(ServletConfig config) throws ServletException
    2. void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException
    3. void destory()
    4. java.lang.String getServletInfo()
    5. ServletConfig getServletConfig()

      Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其init()方法进行Servlet的初始化;请求到达时调用Servlet的service()方法,service()方法会根据需要调用与请求对应的doGet或doPost等方法;当服务器关闭或项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet的destroy()方法。
  2. 转发(forward)和重定向(redirect)的区别?
    1. forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL 的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。(服务端跳转,地址栏不变
    2. redirect就是服务器端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,因此从浏览器的地址栏中可以看到跳转后的链接地址,很明显redirect无法访问到服务器保护起来资源,但是可以从一个网站redirect到其他网站。  (客户端跳转,地址栏发生变化
    3. 利弊:
      forward更加高效,所以在满足需要时尽量使用forward(通过调用RequestDispatcher对象的forward()方法,该对象可以通过ServletRequest对象的getRequestDispatcher()方法获得),并且这样也有助于隐藏实际的链接;
      在有些情况下,比如需要访问一个其它服务器上的资源,则必须使用重定向(通过HttpServletResponse对象调用其sendRedirect()方法实现)。
  3. get和post请求的区别?
    1. get请求用来从服务器上获得资源,而post是用来向服务器提交数据;
    2. 传送方式:get将表单中数据按照name=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;
      post是将表单中的数据放在HTTP协议的请求头或者消息体中,传递到action所指向URL;
    3. 传送长度:get传输的数据要受到URL长度限制(1024字节,也就是1KB);而post可以传输大量的数据,上传文件通常使用post的方式;
    4. 传送安全性:使用get时参数会显示在地址栏上,如果这些数据不是敏感数据,那么可以使用get;对于敏感数据还是应该使用post;
  4. 实现会话跟踪的技术有哪些?
    由于HTTP协议本身是无状态的,服务器为了区分不同的用户,就需要对用户会话进行跟踪,简单的说就是为用户进行登记,为用户分配唯一的ID,下一次用户在请求中包含此ID,服务器据此判断到底是哪一个用户。
    1. URL 重写:在URL中添加用户会话的信息作为请求的参数,或者将唯一的会话ID添加到URL结尾以标识一个会话。
    2. 设置表单隐藏域:将和会话跟踪相关的字段添加到隐式表单域中,这些信息不会在浏览器中显示但是提交表单时会提交给服务器。
      这两种方式很难处理跨越多个页面的信息传递,因为如果每次都要修改URL或在页面中添加隐式表单域来存储用户会话相关信息,事情将变得非常麻烦。
    3. cookie:cookie有两种,一种是基于窗口的,浏览器窗口关闭后,cookie就没有了;另一种是将信息存储在一个临时文件中,并设置存在的时间。当用户通过浏览器和服务器建立一次会话后,会话ID就会随响应信息返回存储在基于窗口的cookie中,那就意味着只要浏览器没有关闭,会话没有超时,下一次请求时这个会话ID又会提交给服务器让服务器识别用户身份。会话中可以为用户保存信息。会话对象是在服务器内存中的,而基于窗口的cookie是在客户端内存中的。如果浏览器禁用了cookie,那么就需要通过下面两种方式进行会话跟踪。当然,在使用cookie时要注意几点:首先不要在cookie中存放敏感信息;其次cookie存储的数据量有限(4k),不能将过多的内容存储cookie中;再者浏览器通常只允许一个站点最多存放20个cookie。当然,和用户会话相关的其他信息(除了会话ID)也可以存在cookie方便进行会话跟踪。
    4. HttpSession:在所有会话跟踪技术中,HttpSession对象是最强大也是功能最多的。当一个用户第一次访问某个网站时会自动创建HttpSession,每个用户可以访问他自己的HttpSession。可以通过HttpServletRequest对象的getSession方法获得HttpSession,通过HttpSession的setAttribute方法可以将一个值放在HttpSession中,通过调用HttpSession对象的getAttribute方法,同时传入属性名就可以获取保存在HttpSession中的对象。与上面三种方式不同的是,HttpSession放在服务器的内存中,因此不要将过大的对象放在里面,即使目前的Servlet容器可以在内存将满时将HttpSession中的对象移到其他存储设备中,但是这样势必影响性能。添加到HttpSession中的值可以是任意Java对象,这个对象最好实现了Serializable接口,这样Servlet容器在必要的时候可以将其序列化到文件中,否则在序列化时就会出现异常。
  5. 过滤器有哪些作用和用法?
    常见的过滤器用途主要包括:解决用户是否登录、中文问题、对用户请求进行统一认证、对用户的访问请求进行记录和审核、对用户发送的数据进行过滤或替换、转换图象格式、对响应内容进行压缩以减少传输量、对请求或响应进行加解密处理、触发资源访问事件、对XML的输出应用XSLT等。

    和过滤器相关的接口主要有:Filter、FilterConfig和FilterChain。
  6. 监听器有哪些作用和用法?
    1. Listener 的作用是用于监听 web应用的创建和销毁,以及在其上attribute发生的变化。 
      web应用即ServletContext对象(jsp的隐式对象application
      除了对web应用的监听外,还能监听sessionrequest的生命周期,以及他们的attribute发生的变化。
      (Java Web开发中的监听器(listener)就是application、session、request三个对象创建、销毁或者他们的attribute发生的变化。)
    2. 应用:统计网站线人数
  7. web.xml文件中可以配置哪些内容?
    web.xml用于配置Web应用的相关信息,如: Servlet、监听器(listener)、过滤器(filter)、相关参数、会话超时时间、安全验证方式、错误页面等。
  8. Servlet中如何获取用户提交的查询参数或表单数据?
    答:可以通过请求对象(HttpServletRequest)的getParameter()方法通过参数名获得参数值。如果有包含多个值的参数(例如复选框),可以通过请求对象的getParameterValues()方法获得。当然也可以通过请求对象的getParameterMap()获得一个参数名和参数值的映射(Map)。
  9. Servlet中如何获取用户配置的初始化参数以及服务器上下文参数?
    答:可以通过重写Servlet接口的init(ServletConfig)方法并通过ServletConfig对象的getInitParameter()方法来获取Servlet的初始化参数。可以通过ServletConfig对象的getServletContext()方法获取ServletContext对象,并通过该对象的getInitParameter()方法来获取服务器上下文参数。当然,ServletContext对象也在处理用户请求的方法(如doGet()方法)中通过请求对象的getServletContext()方法来获得。
  10. 如何设置请求的编码以及响应内容的类型?
    答:通过请求对象(ServletRequest)的setCharacterEncoding(String)方法可以设置请求的编码,其实要彻底解决乱码问题就应该让页面、服务器、请求和响应、Java程序都使用统一的编码,最好的选择当然是UTF-8;通过响应对象(ServletResponse)的setContentType(String)方法可以设置响应内容的类型,当然也可以通过HttpServletResponsed对象的setHeader(String, String)方法来设置。

     说明:现在如果还有公司在面试的时候问JSP的声明标记、表达式标记、小脚本标记这些内容的话,这样的公司也不用去了,其实JSP内置对象、JSP指令这些东西基本上都可以忘却了,关于Java Web开发的相关知识,可以看一下我的《Servlet&JSP思维导图》,上面有完整的知识点的罗列。想了解如何实现自定义MVC框架的,可以看一下我的《Java Web自定义MVC框架详解》。
  11. 如何在基于Java的Web项目中实现文件上传和下载?
  12. 服务器收到用户提交的表单数据,到底是调用Servlet的doGet()还是doPost()方法?
    答:HTML的<form>元素有一个method属性,用来指定提交表单的方式,其值可以是get或post。我们自定义的Servlet一般情况下会重写doGet()或doPost()两个方法之一或全部,如果是GET请求就调用doGet()方法,如果是POST请求就调用doPost()方法,那为什么为什么这样呢?我们自定义的Servlet通常继承自HttpServlet,HttpServlet继承自GenericServlet并重写了其中的service()方法,这个方法是Servlet接口中定义的。HttpServlet重写的service()方法会先获取用户请求的方法,然后根据请求方法调用doGet()、doPost()、doPut()、doDelete()等方法,如果在自定义Servlet中重写了这些方法,那么显然会调用重写过的(自定义的)方法。
     

 

jsp面试题

  1. JSP和Servlet是什么关系?
    1. Servlet是一个特殊的Java程序,它运行于服务器的JVM中,能够依靠服务器的支持向浏览器提供显示内容。
    2. JSP本质上是Servlet的一种简易形式,JSP会被服务器处理成一个类似于Servlet的Java程序,可以简化页面内容的生成。
    3. Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。
      有人说,Servlet就是在Java中写HTML,而JSP就是在HTML中写Java代码,当然这个说法是很片面且不够准确的。JSP侧重于视图,Servlet更侧重于控制逻辑,在MVC架构模式中,JSP适合充当视图(view)而Servlet适合充当控制器(controller)。
  2. JSP有哪些内置对象?作用分别是什么?
    JSP有9个内置对象:
    - request:封装客户端的请求,其中包含来自GET或POST请求的参数;
    - response:封装服务器对客户端的响应;
    - pageContext:通过该对象可以获取其他对象;
    - session:封装用户会话的对象;
    - application:封装服务器运行环境的对象;
    - out:输出服务器响应的输出流对象;
    - config:Web应用的配置对象;
    - page:JSP页面本身(相当于Java程序中的this);
    - exception:封装页面抛出异常的对象。
  3. 讲解JSP中的四种作用域。
    JSP中的四种作用域包括page、request、session和application,具体来说:
    1. page代表与一个页面相关的对象和属性。
    2. request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。
    3. session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。
    4. application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。
  4. 你的项目中使用过哪些JSTL标签?
    项目中主要使用了JSTL的核心标签库,包括<c:if>、<c:choose>、<c: when>、<c: otherwise>、<c:forEach>等,主要用于构造循环和分支结构以控制显示逻辑。
    说明:虽然JSTL标签库提供了core、sql、fmt、xml等标签库,但是实际开发中建议只使用核心标签库(core),而且最好只使用分支和循环标签并辅以表达式语言(EL),这样才能真正做到数据显示和业务逻辑的分离,这才是最佳实践。
  5. 使用标签库有什么好处?如何自定义JSP标签?
    答:使用标签库的好处包括以下几个方面:
    - 分离JSP页面的内容和逻辑,简化了Web开发;
    - 开发者可以创建自定义标签来封装业务逻辑和显示逻辑;
    - 标签具有很好的可移植性、可维护性和可重用性;
    - 避免了对Scriptlet(小脚本)的使用(很多公司的项目开发都不允许在JSP中书写小脚本)

    自定义JSP标签包括以下几个步骤:
    1. 编写一个Java类实现实现Tag/BodyTag/IterationTag接口(开发中通常不直接实现这些接口而是继承TagSupport/BodyTagSupport/SimpleTagSupport类,这是对缺省适配模式的应用),重写doStartTag()、doEndTag()等方法,定义标签要完成的功能
    2. 编写扩展名为tld的标签描述文件对自定义标签进行部署,tld文件通常放在WEB-INF文件夹下或其子目录中
    3. 在JSP页面中使用taglib指令引用该标签库
  6. 说一下表达式语言(EL)的隐式对象及其作用。
    答:EL的隐式对象包括:pageContext、initParam(访问上下文参数)、param(访问请求参数)、paramValues、header(访问请求头)、headerValues、cookie(访问cookie)、applicationScope(访问application作用域)、sessionScope(访问session作用域)、requestScope(访问request作用域)、pageScope(访问page作用域)。

    用法如下所示:
    ${pageContext.request.method}
    ${pageContext["request"]["method"]}
    ${pageContext.request["method"]}
    ${pageContext["request"].method}
    ${initParam.defaultEncoding}
    ${header["accept-language"]}
    ${headerValues["accept-language"][0]}
    ${cookie.jsessionid.value}
    ${sessionScope.loginUser.username}
    补充:表达式语言的.和[]运算作用是一致的,唯一的差别在于如果访问的属性名不符合Java标识符命名规则,例如上面的accept-language就不是一个有效的Java标识符,那么这时候就只能用[]运算符而不能使用.运算符获取它的值
  7. 表达式语言(EL)支持哪些运算符?
    答:除了.和[]运算符,EL还提供了:
    - 算术运算符:+、-、*、/或div、%或mod
    - 关系运算符:==或eq、!=或ne、>或gt、>=或ge、<或lt、<=或le
    - 逻辑运算符:&&或and、||或or、!或not
    - 条件运算符:${statement? A : B}(跟Java的条件运算符类似)
    - empty运算符:检查一个值是否为null或者空(数组长度为0或集合中没有元素也返回true)
  8. JSP中的静态包含和动态包含有什么区别?
    答:静态包含是通过JSP的include指令包含页面,动态包含是通过JSP标准动作<jsp:forward>包含页面。静态包含是编译时包含,如果包含的页面不存在则会产生编译错误,而且两个页面的"contentType"属性应保持一致,因为两个页面会合二为一,只产生一个class文件,因此被包含页面发生的变动再包含它的页面更新前不会得到更新。动态包含是运行时包含,可以向被包含的页面传递参数,包含页面和被包含页面是独立的,会编译出两个class文件,如果被包含的页面不存在,不会产生编译错误,也不影响页面其他部分的执行。代码如下所示:

    <%-- 静态包含 --%>
    <%@ include file="..." %>

    <%-- 动态包含 --%>
    <jsp:include page="...">
        <jsp:param name="..." value="..." />
    </jsp:include>
  9. 如何实现JSP或Servlet的单线程模式?
    对于JSP页面,可以通过page指令进行设置。
    <%@page isThreadSafe=”false”%>
    对于Servlet,可以让自定义的Servlet实现SingleThreadModel标识接口。
    说明:如果将JSP或Servlet设置成单线程工作模式,会导致每个请求创建一个Servlet实例,这种实践将导致严重的性能问题(服务器的内存压力很大,还会导致频繁的垃圾回收),所以通常情况下并不会这么做。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值