【面试】一篇文章帮你彻底清楚"java"必考面试题

简介: 【面试】一篇文章帮你彻底清楚"java"必考面试题

Tomcat 的优化经验


     答:去掉对 web.xml 的监视,把 jsp 提前编辑成 Servlet。有富余物理内存的情况,加大 tomcat 使用的 jvm 的内存 。


HTTP 的请求过程?

 

    当点击一个链接时,浏览器首先找到站点的IP地址,这是通过DNS来实现的,在找到IP地址后 就可以建立 TCP 连接了,连接建立后我们就可以发送请求了.但这个请求是什么样子的呢 ? 我们现在假设点击了一个从 www.webmonkey.com/HTML/96/47/Index2A ,       HTML 点击了 WWW.GRIPY.ORG/MATTARG/ 这时浏览器会发出下面的请求:


Get/MATTARG/HTML/1.0 
User-Agent:Mozilla/2.0(macitosh;1;PPC) 
Accept:text/html: */* 
Cookie: name=value 
Refetet:  http://www.webmonkey.com/html/96/47/index2a.html  
Host:www.gtippy.org

    第一行称为请求,它告诉服务器从 MATTMARG 取得文件,这是的目录一般是要加 / 的,下面 几行通知服务器你所使用的浏览器是什么类型,你所接收的数据是什么类型,如果你以前访问 过这个站点,站点可能向你发送了 Cookie ,如果你已经有了一个这样的 Cookie ,浏览器会将 这个 Cookie 返回给服务器,referer 行通知服务器用户从哪一页到达此页的. 下面服务器就要返回文件了,每次服务器返回文件时,都要返回一个 Http/1.0 响应,同进带有 状态码,在此之后是述内部的头信息,下面就是一个响应:


HTTP/1.0200Pound 
Data:Mon10Feb 199723:48:22GMT 
Server:Apache/1.11Hot&ired/1.0 
Content-type:text/html 
Last-Moditied:Tues,11Feb199722:45:55GMT

   不同的数据可能返回不同的 Content-type ,因此不同的内容需要不同的 Content-type ,因 此有时候这个过程是很慢的。


HTTP 请求的 GET 与 POST 方式的区别


    答:Form 中的 get 和 post 方法,在数据传输过程中分别对应了 HTTP 协议中的 GET 和 POST 方法。二者主要区别如下:

   1)Get 是用来从服务器上获得数据,而 Post 是用来向服务器上传递数据;

   2)Get 将表单中数据按照 variable=value 的形式,添加到 action 所指向的 URL 后面, 并且两者使用“?”连接,而各个变量之间使用“&”连接;Post 是将表单中的数据放在 form 的数据体中,按照变量和值相对应的方式,传递到 action 所指向 URL;

   3)Get 是不安全的,因为在传输过程,数据被放在请求的 URL 中;Post 的所有操作对 用户来说都是不可见的;

   4)Get 传输的数据量小,这主要是因为受 URL 长度限制;而 Post 可以传输大量的数据, 所以在上传文件只能使用 Post;

   5) Get 限制 Form 表单的数据集必须为 ASCII 字符,而 Post 支持整个 ISO10646 字符集;

   6)Get 是 Form 的默认方法。  


解释一下什么是 servlet?


     Servlet 是一种独立于平台和协议的服务器端的 Java 技术,可以用来生成动态的 Web 页面。与传统的 CGI(计算机图形接口)和许多其他类似 CGI 技术相比,Servlet 具有更好的可移 植性、更强大的功能,更少的投资,更高的效率,更好的安全性等特点。

     Servlet 是使用 Java Servlet 应用程序接口(API)及相关类和方法的 Java 程序。Java 语言 能够实现的功能,Servlet 基本上都能实现(除了图形界面之外)。Servlet 主要用于处理客 户端传来的 Http 请求,并返回一个响应。通常所说的 Servlet 就是指 HttpServlet,用于处理 Http 请求,其能够处理的请求有 doGet()、doPost()、service()等方法。在开发 Servlet 时,可 以直接继承 javax.servlet.http.HttpServlet。

     Servlet 需要在 web.xml 中进行描述,例如:映射执行 Servlet 的名字,配置 Servlet 类、初 始化参数,进行安全配置、URL 映射和设置启动的优先权等。Servlet 不仅可以生成 HTML 脚本输出,也可以生成二进制表单输出。

     Servlet 应用范围很广泛,我们现在用的很多流行的框架技术,其最基本的代码离不开 Servelt 的支持。比如我所熟悉的 SSH 框架,Spring 容器启动时,要在 web.xml 中装载 Spring 容器的 ActionContext 类来初始化 Spring 的一些参数,如进行依赖注入、数据库表的映射、 初始化系统的安全配置设置 read 等属性等一些相关操作。

     说一说 Servlet 的生命周期?

     答:servlet 有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由 javax.servlet.Servlet 接口的 init,service 和 destroy 方法表达。

     Servlet 被服务器实例化后,容器运行其 init 方法,请求到达时运行其 service 方法,service 方法自动派遣运行与请求对应的 doXXX 方法(doGet,doPost)等,当服务器决定将实例销 毁的时候调用其 destroy 方法。web 容器加载 servlet,生命周期开始。通过调用 servlet 的 init()方法进行 servlet 的初始化。通过调用 service()方法实现,根据请求的不同调用不同的 do***()方法。结束服务,web 容 器调用 servlet 的 destroy()方法。


 Servlet 的基本架构 


package cn.com.zhangshangbiancheng.servlet;
import java.io.IOException;
public class Servlet extends javax.servlet.http.HttpServlet {
    @Override
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
    }
    @Override
    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
    }
}


SERVLETAPI 中 forward()与 redirect()的区别?


    答:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后 者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的 地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量 使用 forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳 转到一个其它服务器上的资源,则必须使用 sendRedirect()方法。

      什么情况下调用 doGet()和 doPost()?

     Jsp 页面中的 FORM 标签里的 method 属性为 get 时调用 doGet(),为 post 时调用 doPost()。

     Request 对象的主要方法:

     setAttribute(Stringname,Object):设置名字为 name 的 request 的参数值

     getAttribute(Stringname):返回由 name 指定的属性值 。

     getAttributeNames():返回 request 对象所有属性的名字集合,结果是一个枚举的实例 。

     getCookies():返回客户端的所有 Cookie 对象,结果是一个 Cookie 数组 。  

     getCharacterEncoding():返回请求中的字符编码方式 getContentLength():返回请求的 Body 的长度 。

     getHeader(Stringname):获得 HTTP 协议定义的文件头信息。  

     getHeaders(Stringname):返回指定名字的 requestHeader 的所有值,结果是一个枚举的实例 。

     getHeaderNames():返回所以 requestHeader 的名字,结果是一个枚举的实例 

     getInputStream():返回请求的输入流,用于获得请求中的数据 。

     getMethod():获得客户端向服务器端传送数据的方法 。

     getParameter(Stringname):获得客户端传送给服务器端的有 name 指定的参数值 。

     getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例。

     getParametervalues(Stringname):获得有 name 指定的参数的所有值 。  

     getProtocol():获取客户端向服务器端传送数据所依据的协议名称 。

     getQueryString():获得查询字符串

     getRequestURI():获取发出请求字符串的客户端地址 。

     getRemoteAddr():获取客户端的 IP 地址 。

     getRemoteHost():获取客户端的名字 。

     getSession([Booleancreate]):返回和请求相关 Session getServerName():获取服务器的名字 。

     getServletPath():获取客户端所请求的脚本文件的路径 。

     getServerPort():获取服务器的端口号 。

     removeAttribute(Stringname):删除请求中的一个属性。


简述 HttpSession 的作用、使用方法,可用代码说明。

 

HttpSession 中 可 以 跟 踪 并 储 存 用 户 信 息 , 把 值 设 置 到 属 性 中 , 有 2 个 方 法 setAttribute(),getAttrribute();

例如:在一个方法中用 session.setAttribute(“student”,student);

在 session 中设置一个属性名为 student,值为一个名为 student 的对象。

而后可在同一session 范围内用 getAttribute(“student”) 取出该属性,得到 student 对象。


请画出 Servlet2.2 以上 WebApplication 的基本目录结构

                               webapps

                                      |

                           Applocation

                                   |

                    __________________

                   |                         |

           JSP 页面             WEB-INF

                                              |

                                   ___________________

                                  |           |                |

                            classes     lib          web.xml


cookie 和 session 的区别?

 

注意 cookie 有时候禁不掉

Cookie                                                     session

存储在客户端                                        存储在服务器端

两种类型                                               两种实现方式

有声明周期                                             依赖于 cookie

无声明周期                                             url 重写

父路径不能访问子路径的 cookie            同一个 session 的窗口共享一个 session

典型应用:                                        典型应用: 用户登陆 购物车也可以用 session 实现。

3 个月不用再登陆 购物车(http://www.china-pub.com/) ·

不可靠                                                         可靠


forward 和 redirect 的区别


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

    redirect 就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏 览器会用刚才请求的所有参数重新请求,所以 session,request 参数都可以获取。


request.getAttribute() 和 request.getParameter() 有何区别?


当你要传递普通的数据类型给下一个页面时,你在下一个页面中就可以用 getParameter()方 法来获得上一个页面传递过来的数据了!(普通的数据类型是指 int,float,double,string 等在 Java 中常用的基本类型,但是在下一个页面中你用 getParameter()方法获得的值永远只能是String 类型的,你可以把 String 类型转换为你所需要的类型!)

当你要传递一个对象给下一个页面时,你就要使用 getAttribut()方法了!如:你要把一个 List或 Map 传递到下一个页面,这时你就必须要用 setAttribut()和 getAttribut()方法传递数据了!从更深层次的考虑,getParameter()方法传递数据,只会从 WEB 客户端传递到 WEB 服务器, 代表 HTTP 请求数据, getParameter()方法返回 String 类型的数据!setAttribut()和 getAttribut() 方法传递的数据只会在 WEB 服务器内部,在具有转发关系的 WEB 组件之间传递,这两个 方法能设置 Object 类型的共享数据!


jsp 有哪些内置对象?作用分别是什么? 分别有什么方法? 


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

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

response 网页传回用户端的回应 ;

pageContext 网页的属性是在这里管理 ;

session 与请求有关的会话期 ;

applicationservlet 正在执行的内容 ;

out 用来传送回应的输出 ;

configservlet 的构架部件 ;

pageJSP 网页本身 ;

exception 针对错误网页,未捕捉的例外。

request:表示 HttpServletRequest 对象。它包含了有关浏览器请求的信息,并且提供了几个 用于获取 cookie,header, 和 session 数据的有用的方法。

response:表示 HttpServletResponse 对象,并提供了几个用于设置送回 浏览器的响应的方法 (如 cookies,头信息等)

out:对象是 javax.jsp.JspWriter 的一个实例,并提供了几个方法使你能用于向浏览器回送输 出结果。

pageContext:表示一个 javax.servlet.jsp.PageContext 对象。它是用于方便存取各种范围的名 字空间、servlet 相关的对象的 API,并且包装了通用的 servlet 相关功能的方法。

session:表示一个请求的 javax.servlet.http.HttpSession 对象。Session 可以存贮用户的状态信 息。

applicaton :表示一个 javax.servle.ServletContext 对象。这有助于查找有关 servlet 引擎和 servlet 环境的信息 。

config:表示一个 javax.servlet.ServletConfig 对象。该对象用于存取 servlet 实例的初始化参 数。

page:表示从该页面产生的一个 servlet 实例。


介绍在 JSP 中如何使用 JavaBeans?


答:在 JSP 中使用 JavaBean 常用的动作有: 

1):用来创建和查找 bean 对象; 

2):用来设置 bean 的属性,即调用其 setXxx()方法; 

3):用来获得 bean 的属性,即调用其 getXxx()方法。


jsp 有哪些动作?作用分别是什么?


(这个问题似乎不重要,不明白为何有此题)

答:JSP 共有以下 6 种基本动作

jsp:include:在页面被请求的时候引入一个文件。

jsp:useBean:寻找或者实例化一个 JavaBean。  

jsp:setProperty:设置 JavaBean 的属性。

jsp:getProperty:输出某个 JavaBean 的属性。

jsp:forward:把请求转到一个新的页面。

jsp:plugin:根据浏览器类型为 Java 插件生成 OBJECT 或 EMBED 标记 。


JSP 的常用指令


isErrorPage(是否能使用 Exception 对象),isELIgnored(是否忽略表达式)


jsp 的四种范围? 


答:a.page 是代表与一个页面相关的对象和属性。一个页面由一个编译好的 Javaservlet 类 (可以带有任何的 include 指令,但是没有 include 动作)表示。这既包括 servlet 又包括 被编译成 servlet 的 JSP 页面 b.request 是代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越 多个页面,涉及多个 Web 组件(由于 forward 指令和 include 动作的关系) c.session 是代表与用于某个 Web 客户机的一个用户体验相关对象和属性。一个 Web 会话可以也经常会跨越多个客户机请求 d.application 是代表与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。

目录
相关文章
|
22小时前
|
存储 Java
面试官:素有Java锁王称号的‘StampedLock’你知道吗?我:这什么鬼?
面试官:素有Java锁王称号的‘StampedLock’你知道吗?我:这什么鬼?
43 23
|
22小时前
|
消息中间件 安全 前端开发
字节面试:说说Java中的锁机制?
Java 中的锁(Locking)机制主要是为了解决多线程环境下,对共享资源并发访问时的同步和互斥控制,以确保共享资源的安全访问。 锁的作用主要体现在以下几个方面: 1. **互斥访问**:确保在任何时刻,只有一个线程能够访问特定的资源或执行特定的代码段。这防止了多个线程同时修改同一资源导致的数据不一致问题。 2. **内存可见性**:通过锁的获取和释放,可以确保在锁保护的代码块中对共享变量的修改对其他线程可见。这是因为 Java 内存模型(JMM)规定,对锁的释放会把修改过的共享变量从线程的工作内存刷新到主内存中,而获取锁时会从主内存中读取最新的共享变量值。 3. **保证原子性**:锁
16 1
|
22小时前
|
Java
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
19 0
|
22小时前
|
安全 Java 程序员
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
12 0
|
22小时前
|
Java
三个可能的Java面试题
【5月更文挑战第7天】Java垃圾回收机制自动管理内存,回收无引用对象的内存,确保内存有效利用。多态性允许父类引用操作不同子类对象,如Animal引用可调用Dog的方法。异常处理机制通过try-catch块捕获和处理程序异常,例如尝试执行可能导致ArithmeticException的代码,catch块则负责处理异常。
35 9
|
22小时前
|
Java
【JAVA面试题】static的作用是什么?详细介绍
【JAVA面试题】static的作用是什么?详细介绍
|
22小时前
|
Java
【JAVA面试题】final关键字的作用有哪些
【JAVA面试题】final关键字的作用有哪些
|
22小时前
|
JavaScript 前端开发 Java
【JAVA面试题】什么是引用传递?什么是值传递?
【JAVA面试题】什么是引用传递?什么是值传递?
|
22小时前
|
安全 Java
【JAVA面试题】什么是对象锁?什么是类锁?
【JAVA面试题】什么是对象锁?什么是类锁?
|
22小时前
|
存储 自然语言处理 Java
【JAVA面试题】什么是代码单元?什么是码点?
【JAVA面试题】什么是代码单元?什么是码点?