写点什么

全靠这套大厂 Java 面试题目指南,让我成功斩获 25*16 薪资的 offer

用户头像
飞飞JAva
关注
发布于: 2021 年 05 月 06 日
全靠这套大厂Java面试题目指南,让我成功斩获 25*16 薪资的offer

Hello,今天给各位童鞋们分享 JavaWeb,赶紧拿出小本子记下来吧!



Java web

web 编程基础

服务器

请问 JAVA 应用服务器都有哪些?

从功能上看分为两种:web 应用服务器和 java EE 服务器

web 服务器

Tomcat、Jetty、Orion、Resin、 Bejy Tiger、Geronimo、Jonas、Jrun

java EE 服务器

TongWeb 、BES Application Server 、 Apusic Application Server 、 IBM Websphere 、Sun Application Server 、Oracle 的 Oracle9i/AS 、Sun Java System Application Server 、Bea Weblogic 、JBoss、开源 GlassFish。

JAVA 调试

请问在什么情况下会使用 assert?

作用:用于检查一个 boolean 表达式是否正确

如果一个程序要保证其正确性,就必须使此表达式的返回值为 true,返回 false,则此程序有误

应用场景:通过在开发和测试中开启,在软件发布后是关闭的

tomcat

限流的几种方法:计数器,滑动窗口、漏桶法、令牌桶

请问如何在链接里不输入项目名称的情况下启动项目?

配置虚拟路径




此处的 WEB-INF 可以直接粘贴 tomcat 中的 webapps/root/WEB-INF


配置完以后重启 tomcat 即可访问到

JSP

请说明一下 JSP 中的静态包含和动态包含的有哪些区别?

请求方式不同

静态包含页面:<%@include file="static.jsp" %>

动态包含页面 <jsp:include page="dynamic.jsp"/>

编译过程不同

静态包含:包含页面以及被(静态)包含的页面只能拥有一个 head,body 等,且遵循先包含再编译,即只会生成一个 class 文件

动态包含:被(动态)包含的页面遵循先编译后包含,则会生成不同的.java 文件

对于 JSP 文件首先会通过 WEB 服务器生成 index_jsp.java(servlet 文件)再经过编译生成 index.class 文件

request

静态包含:包含页面不能向被包含的页面传参,因为两个页面会合成一个页面进行编译,就没有了我们所谓再传参的页面,使用的是同一个 request 对象

动态包含:包含页面能向被包含的页面传参,因为被包含的页面是是执行到这个语句时才会加载的,且会生成不同的 class 文件,既然包含页面可以向被包含的页面传参,那么两个页面的参数个数是不一样的的,所以它们有各自的 request 对象,因此使用的是不同的 request 对象

注意事项

静态包含:因为是先包含再编译,因此页面的 <%@page contentType=“text/html;charset=utf-8”%> 应该保持一致,否则包含整合以后的页面会报错,尽量不用出现一样的语句否则会进行覆盖

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

request:用户对服务器的请求,通过 post/get 请求并传递参数

response:封装服务器对客户端的响应

session:会话对象,从第一个请求开始,到页面的关闭结束,当刷新浏览器时,此对象不会发生变化,可以看作是一次全局的,不管哪个页面都可访问,多页面共享

page:当前 jsp 页面自身,相当于 this,即对应的 servlet 类的对象

pageContext:当前页面的上下文,可以获取此页面的内容

application:可以存放全局共享的变量,从服务器开启一直到服务器关闭结束,可以看作是多客户端共享的

exception:当前页面发生异常时,会有此对象,<%@page isErrorPage=“true” %>,JSP 中的 exception 对象才有效。

config:web 的配置对象,取得再 web.xml 中的初始化参数

out:向客户端输出信息的流对象

请说明一下 jsp 有哪些动作? 这些动作的作用又分别是什么?

jsp:include:动态包含页面

jsp:useBean:创建一个 Bean 对象

jsp:setproperty:给 Bean 对象中的属性赋值

jsp:getProperty:获取 Bean 对象属性中的值

jsp:forward:请求转发

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

请简要说明一下四种会话跟踪技术分别是什么?

为什么要使用会话跟踪技术?因为服务端和客户端是通过 http 传输的,http 是“无状态”的,一次响应完之后会断开,需要再次请求,因此需要判断是否为同一用户

重写 URL:其原理是将 session 的 id 信息重写到 url 中

表单隐藏域:会话会将 id 添加到表单中,用户不会看到,存在于源码中

cookie:客户请求时可以将信息发送给服务器

cookie 存在于客户端,不是很安全,会被解析

每个 cookie 限制 4kb,且数量为 200 之内

session:每个用户都有各自的 session

session 存在于服务端,当创建一个 session 时,其 id 会随着 cookie 传送到用户端,当每次用户请求的时候会将 sessionId 传送到服务端识别不同的用户

当访问量多的时候,使用 session 服务器的性能会下降

请简要说明一下 JSP 和 Servlet 有哪些相同点和不同点?另外他们之间的联系又是什么呢?

JSP

本质还是 Servlet

可以实现 html 和 Java 相结合

JSP 会被编译成 Servlet,Servlet 再负责用户的请求

Servlet

由 web 容器加载和管理

是 Java 应用程序

用于生成动态 web 内容

负责处理客户端请求

其实 Jsp 本质上还是 Servlet(index_jsp.java),只是相比较 Servlet 更加视图化,而 Servlet 更偏向逻辑控制,其实显示用户请求以及响应的业务本质还是有 Servlet 实现的

EL

请说一下表达式语言(EL)的隐式对象以及该对象的作用

用于读取 jsp 内置对象的(pageScope、requestScope、sessionScope、applicationScope)分别对应 page、request、session、application 对象

${requestScope.username}获取 request 中的 username

与输入有关的(param、paramValues),可以获得用户请求的参数

${param.name}

与 cookie 有关的

${cookie.username.value}获取 cookie 中 username 的值

读取请求头的数据 header 和 headerValues

${header[“User-Agent”]}

读取 web.xml 中的参数值 initParam

用于获取与其他用户有关的页面或者要求 pageContext

${pageContext.request.contextPath} 获取 web application 名称

Request

请详细说明一下 Request 对象的主要方法是什么?

getParameter():获取前端传来的参数

getAttribute(String name):返回 name 指定的属性值

serAttribute(String name,Object o):设置 name 指定的属性值

getCookies():获取 cookie

getSession():获取 session

getInputStream():获取输入流

JAVA 对象

请说明一下 JSP 的内置对象以及该对象的使用方法。

page

request

getParameter():获取前端传来的参数

getAttribute(String name):返回 name 指定的属性值

serAttribute(String name,Object o):设置 name 指定的属性值

getCookies():获取 cookie

getSession():获取 session

getInputStream():获取输入流

foward:请求转发

3.response

sendRedirect():重定向

addCookies():添加 cookie

4.session

5.application

6.pageContext

7.config

8.exception

9.out

xml 文件

请说明一下 web.xml 文件中可以配置哪些内容?

配置 DispatcherServlet

<servlet>

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

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


   <init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
复制代码


</servlet>

<servlet-mapping>


   <servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
复制代码


</servlet-mapping><!--不过滤静态资源 相当于 mvc:default-servlet-handler/ -->

<servlet-mapping>


   <servlet-name>default</servlet-name>    
<url-pattern>*.png</url-pattern>
复制代码


</servlet-mapping>


2.过滤器


<filter>


<filter-name>encodingFilter</filter-name>


<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>


<init-param>


<param-name>encoding</param-name>


<param-value>utf-8</param-value>


</init-param>


</filter>


<filter-mapping>


<filter-name>encodingFilter</filter-name>


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


</filter-mapping>


3.session 超时时间

<session-config>


    <session-timeout>30</session-timeout>
复制代码


</session-config>

监听器

请谈谈你对 Javaweb 开发中的监听器的理解?

Javaweb 中的监听器主要针对于 application、session、request 三个对象

application

ServletContextListener:对 Servlet 上下文的创建和销毁进行监听

ServletContextAttributeListener:对 Servlet 上下文中的属性的添加,删除和修改进行监听

session

HttpSessionListener:对 Session 的创建和销毁进行监听

HttpSessionAttributeListener:对 Session 中的属性的添加,删除和修改进行监听

request

ServletRequestListener:对 Request 的创建和销毁进行监听

ServletRequestAttributeListener:对 Request 中的属性的添加,删除和修改进行监听

过滤器

请问过滤器有哪些作用?以及过滤器的用法又是什么呢?

对请求和响应进行拦截,并且按照要求进行过滤,在发送给下一个过滤器或者 servlet

过滤乱码

对位登录的请求进行过滤(控制访问权限)

敏感字符过滤


补充

过滤器和拦截器的区别

过滤器依赖于 servlet,拦截器不依赖于 servlet

过滤器是回调函数,拦截器是通过 Java 的反射机制

过滤器只在容器初始化的时候 init 一次【几乎对所有请求起作用】,而拦截器可以在 action 请求的生命周期中多次初始化【只对 action 请求起作用】

拦截器可以通过 IOC 容器获取各个 Bean,而过滤器不行,还可以将 service 注入,调用业务逻辑

触发时机

过滤器是请求进入容器之后在请求进入 servlet 之前进行预处理,请求结束也是在 servlet 处理完之后在容器处理完之前

所以过滤器过滤的请求参数是 doFilter(ServletRequest request, ServletResponse response, FilterChain chain),而不是 HttpServletRequest,因为是在 HttpServlet 之前请求的

chain.doFilter(request, response);此方法是分水岭在 Servlet 的 doService()中

(prehandler()和 afterCompletion()是拦截器中的方法)

prehandler()—>do.chain()—>afterCompletion() prehandler()–[可以操控 Controller 的 ModelAndView 内容]–>return ModelAndView

SpringMVC 的机制是由同一个 Servlet 来分发请求给不同的 Controller,其实这一步是在 Servlet 的 service()方法中执行的

拦截器是 spring 容器的,是 spring 支持的

总结:拦截器功在对请求权限鉴定方面确实很有用处,在我所参与的这个项目之中,第三方的远程调用每个请求都需要参与鉴定,所以这样做非常方便,而且他是很独立的逻辑,这样做让业务逻辑代码很干净。和框架的其他功能一样,原理很简单,使用起来也很简单,大致看了下 SpringMVC 这一部分的源码,其实还是比较容易理解的。


我们项目中仅仅用到了 preHandle 这个方法,而未用其他的,框架提供了一个已经实现了拦截器接口的适配器类 HandlerInterceptorAdapter,继承这个类然后重写一下需要用到的方法就行了,可以少几行代码,这种方式 Java 中很多地方都有体现。

web 编程进阶(一)初始化

请问使用 Servlet 如何获取用户配置的初始化参数以及服务器上下文参数?

重写 Servlet 中的 init(),getInitParameter()获取初始化参数

getServletContext()获取上下文对象,getInitParameter()获取上下文参数

servlet

请问使用 Servlet 如何获取用户提交的查询参数以及表单数据?

getParameter()

getParameterValues()

getParameterMap()

服务器收到用户提交的表单数据,请问调用了以下方法中的哪一个方法?第一个是 Servlet 中的 doGet()方法,第二个 Servlet 中的是 doPost()方法

根据我们提交表单的 method,如果是 post,则会调用 doPost(),如果是 get,则会调用 doGet()

请说明一下 Servlet 3 中的异步处理指的是什么?

因为在没有异步处理的时候,当用户端发送请求时,由 servlet 接受请求,经过对一些信息的预处理,开始调用接口执行业务逻辑,但此时的 servlet 是处于阻塞状态的,导致在高并发的情况下,性能低下,如果此时有了异步请求,在 servlet 阻塞的时候,会有一个子线程去执行其他任务,会将结果信息返回或者发送给其他 servlet,此时不会降低性能

说说 Servlet 接口中有哪些方法?

void init(ServletConfig var1) throws ServletException;

Servlet 初始化

ServletConfig getServletConfig();

获取 Servlet 的配置

void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

service(),会调用 doGet()和 doPost()

String getServletInfo();

void destroy();

销毁


补充

什么时候实例化 Servlet:

Servlet 只初始化一次,即所谓的单例模式

如果设置 loan-on-startup 为 1,则是在 web 容器加载的时候实例化

如果没有设置,则是在第一次请求 servlet 的时候实例化

阐述一下阐述 Servlet 和 CGI 的区别?

Servlet 创建之后就不会销毁,每次使用会调用 Servlet 的一个线程,且不会销毁;但是 CGI(公共网关接口)每次调用的是一个进程,而且调用完毕后会销毁,导致开销很大

在 Servlet 执行的过程中,一般实现哪几个方法?

首先在容器加载时可能会创建 Servlet 对象或者第一次请求时,调用 init();每次的请求【doPost、doGet】都会调用 service(),当容器关闭时会销毁 servlet,调用 destroy()。对于 getServletConfig()会获取 Servlet 的上下文或者返回 ServletConfig 对象;对于 getServletInfo()会获取一些信息,比如作者、版权…

请说出 Servlet 的生命周期是什么样的?并且请分析一下 Servlet 和 CGI 的区别。

在第一次请求的时候调用 init(),会将初始化的 Servlet 对象保存在内存中,在以后的每次请求中(doPost()、doGet())都会调用 service(),当容器关闭时,会调用 destroy(),当 Servlet 对象实例化时,其有关配置的初始化参数会保存在容器中,可以通过 getServletConfig()获取,对于 getServletInfo()可以获取有关作者,出版社等信息

对于 Servlet 而言,其只有创建一次,以后都会直接调用,但是对于 CGI 而言,每次请求都会创建一个,会不停的创建销毁,开销比较大


补充

为什么需要 Servlet,因为传统的方式 web 容器和客户端之间只能以静态页面进行交互,因为两者是通过 Http 协议进行信息的传输,想要使用动态页面进行交互就要通过 Servlet 的支持,什么是 Servlet,可以简单的理解为是一种运行于服务端的程序,狭义的理解为是 Servlet 接口,广义的理解为是实现 Servlet 接口的任何实现类,下面以图的形式展现 Servlet 的作用



请回答一下 servlet 的生命周期是什么。servlet 是否为单例以及原因是什么?

在第一次请求的时候调用 init(),会将初始化的 Servlet 对象保存在内存中,在以后的每次请求中(doPost()、doGet())都会调用 service(),当容器关闭时,会调用 destroy(),当 Servlet 对象实例化时,其有关配置的初始化参数会保存在容器中,可以通过 getServletConfig()获取,对于 getServletInfo()可以获取有关作者,出版社等信息

是单例模式

因为 servlet 是在容器加载或者第一次请求的时候初始化,直到容器关闭时才会销毁

请简要说明一下 forward 与 redirect 区别,并且说一下你知道的状态码都有哪些?以及 redirect 的状态码又是多少?

forward:请求转发,此时的地址栏不会改变,可以共享 request 里面的数据,效率高

redirect:重定向,此时的地址栏会发生改变,不能共享 request 里面的数据,效率低

200:正确

302:重定向

404:找不到资源

500:代码错误



文件传输

请问如何在基于 Java 的 Web 项目中实现文件上传和下载?

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html>

<head>

<title></title>

</head>

<body>

<form method="post" action="uploadServlet" enctype="multipart/form-data">

选择文件: <input type="file" name="fileUp">

<input type="submit" value="上传">

</form> ${hint}

</body>

</html>

@MultipartConfig@WebServlet("/uploadServlet")public class uploadServlet extends HttpServlet {

@Override

protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {

Part picture = request.getPart("picture");

if (picture != null && picture.getSubmittedFileName().length() > 0) {

String realPath = request.getServletContext().getRealPath("/upload");

picture.write(realPath + "/" + picture.getSubmittedFileName());

request.setAttribute("hint", "success");

}else {

request.setAttribute("hint", "failure"); }

request.getRequestDispatcher("index.jsp").forward(request, response);

}

}

web 编程进阶(二)对象

谈一下,什么是 DAO 模式?

dao 模式可以理解为底层模式,是持久层,是与数据库进行交互的,可以通过 sql 语句对数据库中的数据进行增删查改

MVC

说一说,MVC 的各个部分都有那些技术来实现?如何实现?

Model

是模型层,可以用来创建与数据库有关的实体

View

视图层,用来作为给客户端显示的页面,同时也可以将从前端获取的数据传送到后端,进行处理

Controller

控制层,是用来作为与视图层交互的,可以获取前端传来的数据交给 service 处理逻辑业务,同时也可以将要显示在前端的数据传输给页面

JSP 标签

谈一谈,使用标签库有什么好处?如何自定义 JSP 标签?

可以在 jsp 页面中使用 Java 语言

可以自定义 jsp 标签

具有较好的可移植性,可重用性和可维护性

自定义 JSP 标签

继承 TagSupport 类,重写 doStartTag(),然后再编写.tld 对自定义标签进行部署

JSTL

请说说你做过的项目中,使用过哪些 JSTL 标签?

jsp <c:foreach> <c:if> <c:choose> <c:when> <c:otherwise>

web 编程原理 HTTP 请求

说说你对 get 和 post 请求,并且说说它们之间的区别?

post 和 get 都可以向服务器提交数据,get 是获取数数据,post 是提交数据

约定俗成:

get 是将提交的数据通过追加在 url 中提交数据;post 是通过 body 提交数据【只是约定说 get 通过 url 提交,post 放在 body 中提交,并没有硬性要求】

get 的数据是暴露的,不安全;post 的数据是安全的

get 的提交数据大小有限制;post 没有限制

get 提交数据只能是 ASCII 编码;post 可以是任何编码类型

get 可以缓存;post 不会缓存

get 速度快;post 速度慢


补充

因为 get 是将自己提交的数据,追加在 url 中因此不需要使用 content-type,但是对于 post 请求是将提交的数据放在了 body 中,因此需要通过请求头 content-type 来通知服务器以什么语言来解析 post 中的 body

常用的提交方式(content-type 的值):

application/x-www-form-urlencoded

multipart/form-data

application/json

text/xml

请谈一谈,get 和 post 的区别?

约定俗成:

get 是将提交的数据通过追加在 url 中提交数据;post 是通过 body 提交数据【只是约定说 get 通过 url 提交,post 放在 body 中提交,并没有硬性要求】

get 的数据是暴露的,不安全;post 的数据是安全的

get 的提交数据大小有限制;post 没有限制

get 提交数据只能是 ASCII 编码;post 可以是任何编码类型

get 可以缓存;post 不会缓存

get 速度快;post 速度慢

重定向

请谈谈,转发和重定向之间的区别?

次数

转发:请求一次

重定向:请求两次,通过发送状态码

url

转发:不会发生变化

重定向:会发生变化

request 有效

转发:有效

重定向:无效

效率

转发:高效

重定向:低效

web service

请你解释一下,什么是 Web Service?

就是一个可以提供一个接口给多个程序之间相互调用,实现其之间的通信,而且 web Service 并不关注你是使用何种语言的

请求类型

请你说明一下,如何设置请求的编码以及响应内容的类型?

request.setCharacterEncoding(“utf-8”);

response.setContentType(“application/json”);

response.setHeader(String,String);

客户端/服务器模式

请说明 BS 与 CS 的联系,还有区别。

区别

1.硬件环境不同

C/S 一般建立在专用的网络上

B/S 建立在广域网之上的,一般只要有操作系统和浏览器就行

2.对安全要求不同

C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用 C/S 结构适宜.

可以通过 B/S 发布部分可公开信息。B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。

3.对程序架构不同

C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑.

B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比 C/S 有更高的要求 B/S 结构的程序架构是发展的趋势, 从 MS 的.Net 系列的 BizTalk 2000 Exchange 2000 等, 全面支持网络的构件搭建的系统. SUN 和 IBM 推的 JavaBean 构件技术等,使 B/S 更加成熟.

4.软件重用不同

C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在 B/S 要求下的构件的重用性好.

B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子

5.系统维护不同

C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统

B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就可以实现升级.

6.处理问题不同

C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 与操作系统相关. 应该都是相同的系统

B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是 C/S 无法作到的. 与操作系统平台关系最小.

7.用户接口不同

C/S 多是建立的 Window 平台上,表现方法有限,对程序员普遍要求较高

B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低,减低开发成本.

8.信息流不同

C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低

B/S 信息流向可变化, B-B B-C B-G 等信息、流向的变化, 更像交易中心。

资源请求方式

请你说明,forward 和 redirect 的区别?

url

forward :不发生变化

redirect:发生变化

次数

forward :请求一次

redirect:请求两次

效率

forward :较高

redirect:较低

request

forward :有效

redirect:失效

web 访问

请你说说,cookie 和 session 的区别?

cookie 是从服务端发出,保存在客户端的;session 是保存在服务端的

cookie 是不安全的可以被解析

cookie 不能超过 4M,并且不能多于 200 个

session 放在服务端,当数量过多会影响服务器的性能

好啦,今天的文章就到这里,希望能帮助到屏幕前迷茫的你们!


用户头像

飞飞JAva

关注

还未添加个人签名 2021.04.28 加入

分享、普及java相关知识

评论

发布
暂无评论
全靠这套大厂Java面试题目指南,让我成功斩获 25*16 薪资的offer