JavaWeb部分面试题

1、http

(1)什么是http?http协议的特点?http的数据包有哪几部分组成?
http超文本传输协议,是应用层的一个网络协议。设计HTTP最初的目的是为 了提供一种发布和接收HTML页面的方法
特点是:
短链接:是客户端主动发送请求,服务器作出响应,服务器响应之后,连接断开。
单向连接:服务器不能主动向客户端发送数据。


HTTP请求报文:

一个HTTP请求报文有请求行、请求头、空行和请求数据4个部分组成。
请求行中规定了请求的方式(get/post),请求资源(url),请求的http协议版本
请求头主要是客户端发送给服务器端的一些信息,使用键值对表示key:value。常见的有cookie头,存储cookie信息,user-agent,表明客户端信息。

请求数据区放置post请求的数据

HTTP响应报文:

http响应由三部分:响应行,响应头,响应体
响应行组成:服务器协议版本、状态码、状态描述。
状态码:
常用的状态码如下:
200 :请求成功。
302 :请求重定向。
304 :请求资源没有改变,访问本地缓存。
403:禁止访问
404 :请求资源不存在。通常是用户路径编写错误,也可能是服务器资源已删除。
500 :服务器内部错误。通常程序抛异常。【一般以2开头的代表成功,以3开头的代表重定向,4开头的代表客户端错误,5开头的错误代表服务器端的错误】
状态信息:状态信息是根据状态码变化而变化的
响应头:响应也都是键值对形式,服务器端将信息以键值对的形式返回给客户端

响应体
响应体是服务器回写给客户端的页面正文,浏览器将正文加载到内存,然后解析渲染 显示页面内容

HTTPS

HTTPS是安全超文本传输协议,是一个安全通信通道,基于http开发,用于在客户计算和服务器之间的交换信息。使用安全套接字层(SSI)进行信息交换,简单来说是http的安全版本。

2、请求方式

常用的请求方式是get、POST。但是还有options、head、put、delete、trace,一般很少用。
GET请求:参数在地址后拼接,请求数据区没有请求数据,不安全(因为所有的参数都拼接在地址后面),不适合传输大量数据(长度有限制)
POST请求:参数在请求数据区放着,相对get请求更安全,并且数据大小没有限制,一般上传文件使用。

3、什么是servlet?

{Servlet是什么?【一个普通的Java类,运行在服务器端的Java代码】
Servlet直意来说就是服务器端的一个小程序。其实是sun公司提供的一套规范,用来处理客户端请求,响应给浏览器的动态资源【作用】。其中包含三大组件:servlet技术、filter技术【过滤器】、listener技术【监听器】

}

【在springMVC中,“一个中心,三大组件”中的一个中心就是前端控制器(DispatcherServlet),需要在web.xml中进行配置】

4、阐述servlet和CGI的区别

Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行其service()方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet。

5、servlet生命周期?

Servlet的生命周期(面试题)
【servlet对象的生命周期介绍:生命周期就是何时创建何时销毁,
servlet对象默认第一次访问的时候创建,服务器关闭的时候销毁。
当这个servlet对象创建的时候会调用init方法,
当这个对象销毁的时候调用destroy方法,
每次访问servlet时都会调用service方法】

1)Servlet何时创建
默认第一次访问servlet时创建该对象【强调默认,因为可以通过配置使servlet不是第一次访问时创建,让服务器一启动就创建】【问,如何设置服务器一启动就创建servlet】
2)Servlet何时销毁
服务器关闭servlet就销毁了【servlet对象在tomcat服务器开辟的内存中,servlet销毁也就是把servlet对象在内存中干掉,服务器已关闭,开辟的内存也就没有了,所以servlet就销毁了】
3)每次访问必然执行的方法
service(ServletRequest req, ServletResponse res)方法

6、Servlet接口中有哪些方法?

7、HttpServlet类中有哪些方法?谁调用了doPost()、doGet()方法?doPost()、doGet()方法分别在什么时候使用?

6.1

但在实际开发中,我们不会直接去实现Servlet接口,因为那样需要覆盖的方法太多, 我们一般创建类继承HttpServlet
实现步骤:
1)创建类继承HttpServlet类
2)覆盖doGet和doPost
3)在web.xml中进行servlet的配置

创建类继承HttpServlet,HttpServlet继承GenericServlet,而GenericServlet实现Servlet接口,所以我们可以用继承HttpServlet来创建一个Servlet。

实际开发中创建的servlet.png

HttpServlet重写service()方法
HttpServlet重写service()方法:
1.在该方法中先将ServletRequest和ServletResponse
强转为了HttpServletRequest和HttpServletResponse。
2.然后调用重载的service()方法,并将刚刚强转得到对象传递到重载的方法中。

HttpServlet重写service()方法.png

重载service(HttpServletRequest request , HttpServletResponse response)
1.在方法中获取请求的方式(get或post)
2.在根据不同的请求方式去调用不同的方法:
如果是GET请求,则调用doGet(HttpServletRequest request , HttpServletResponse response)
如果是post请求,则调用doPost(HttpServletRequest request , HttpServletResponse response)

重载service.png

结论:
当通过继承HttpServlet来创建一个Servlet时,我们只需要根据要处理的请求的类型,来重写不同的方法。
处理get请求,则重写doGet()
处理post请求,则重写doPost()

综上我们来总结最后答案:

1、HttpServlet类中有哪些方法?

a)重写的service(ServletRequest req,ServletResponse res)方法
【1、在该方法中先将ServletRequest和ServletResponse强转为了HttpServletRequest和HttpServletResponse;2、然后调用重载的service()方法,并将刚刚强转得到对象传递到重载的方法中】
b) 重载的service(HttpServletRequest request , HttpServletResponse response)方法
【 1.在方法中获取请求的方式(get或post)
2.在根据不同的请求方式去调用不同的方法:
如果是GET请求,则调用doGet(HttpServletRequest request , HttpServletResponse response)
如果是post请求,则调用doPost(HttpServletRequest request , HttpServletResponse response)】
c) init()方法

d) doGet(HttpServletRequest request,HttpServletResponse response)方法

e)doPost(HttpServletRequest request,HttpServletResponse response)方法

f) destroy()方法

2、谁调用了doPost()、doGet()方法?

HttpServlet类中的重载的service(HttpServletRequest request,HttpServletResponse response)中会调用这两个方法

3、doPost()、doGet()方法分别在什么时候使用

处理get请求,则重写doGet()
处理post请求,则重写doPost()

8、web.xml中的配置

5.1 web.xml配置详解

1、启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取两个结点。
2、紧接着,容创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文。
3、容器将转换为键值对,并交给servletContext。
4、容器创建中的类实例,创建监听器。

5.2 web.xml配置

1、配置监听器

2、配置过滤器

3、配置servlet【springMVC的前端控制器就是在这配置的】
servlet基本配置:
【客户端发送http请求(内部有请求头请求体)到服务器,服务器接收之后会分析我的请求,服务器会根据请求地址查找配置文件web.xml,根据servlet虚拟路径配置找到servlet的类的全包名,
com.itheima.servlet.QuickStratServlet

根据全包名找到对应的servlet类,调用类中的service方法】

servlet虚拟路径的配置.png

其中url-pattern的配置方式:
1)完全匹配 访问的资源与配置的资源完全相同才能访问到
图片.png

2)目录匹配 格式:/虚拟的目录../* 代表任意
【表示的是只要是访问的aaa/bbb/ccc下边的任何资源都能够访问到我们这个东西】
图片.png

3)扩展名匹配 格式:
.扩展名
图片.png

9、转发和重定向的区别?

什么是重定向?

【重定向叙述:客户端发送请求,服务器端对应的servlet做出业务逻辑处理,但是所访问的这个servlet中没有请求想要的资源,这个时候所访问的这个servlet会调用response.sendReadirect()方法,把要访问的目标资源作为response响应头信息发送给客户端浏览器。客户端浏览器根据响应的结果重新访问服务器资源,服务器再次对客户端作出响应】【这个servlet怎么知道目标资源在何处?】

重定向有哪些特点:
1、客户端从服务器拿到资源的过程一共访问两次服务器。
2、第一次访问时人为访问,第二次是自动访问,客户端地址栏地址已经发生变化】


这边是客户端,那边是服务器端。服务器端servlet资源很多,客户端通过http请求去访问服务器端的资源,访问到其中一个servlet资源要资源,但是这个servlet资源没有请求想要的资源,但是这个servlet资源告诉客户端虽然我没有这个资源但是另外一个servlet资源有想要的资源,这个时候客户端会去访问有它想要资源的那个servlet】
重定向有哪些特点:
1、客户端从服务器拿到资源的过程访问服务器一共访问两次。
2、第一次访问时人为访问,第二次是自动访问,客户端地址栏地址已经发生变化

request完成请求转发

【转发概述:客户端发送请求,服务器端servlet作出业务逻辑处理。此时servlet会调用forword()方法,服务器servlet把目标资源返回给客户端浏览器】


注意:转发与重定向的区别?
1)客户端从服务器端拿到资源的过程中,重定向两次请求两次访问服务器,转发一次请求访问服务器一次
2)客户端从服务器端拿到资源的过程中,重定向地址栏的地址变化,转发地址不变
3)重新定向可以访问外部网站 转发只能访问内部资源
4)转发的性能要优于重定向

request.getRequestDispatcher()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;服务器内部转发,整个过程处于同一个请求当中。response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。不在同一个请求。重定向,实际上客户端会向服务器端发送两个请求。

所以转发中数据的存取可以用request作用域:request.setAttribute(), request.getAttribute(),重定向是取不到request中的数据的。只能用session。

重定向可以跨域访问,而转发是在web服务器内部进行的,不能跨域访问。

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

9大内置对象:
pageContext【当前jsp页面中】 :JSP页面容器
Request【一次请求中】 得到用户请求信息
Session【一次会话】 :用来保存用户信息
application(ServletContext)【整个web应用中】:所有用户的共享信息
response:服务器向客户端回应信息
***************
out:用于页面输出
exception:表示JSP页面所发生的异常,在错误的页面中才起作用
page:指当前页面转换后的servlet类的实例
config:服务器配置。可以取得初始化参数

11、讲解JSP中的四种作用域。


【如何确认服务器端是否有该客户端的session区域】

(1)ServletContext对象

12、JSP和Servlet是什么关系?

Servlet

{Servlet是什么?【一个普通的Java类,运行在服务器端的Java代码】
Servlet直意来说就是服务器端的一个小程序。其实是sun公司提供的一套规范,用来处理客户端请求,响应给浏览器的动态资源【作用】。其中包含三大组件:servlet技术、filter技术【过滤器】、listener技术【监听器】
}

JSP:

JSP叫Java服务器页面,是一种动态页面设计,它的主要目的是将表示逻辑从servlet中分离出来。
其根本就是一个简化的servlet设计。

JSP技术其实就是在html中嵌入Java代码。擅长页面显示。用servlet技术也可以实现页面显示,但是比较麻烦。

servlet技术擅长编写Java代码。
实际开发过程中就是结合着jsp技术和servlet技术一起使用。

jsp运行原理-----jsp本质就是servlet(面试JSP的运行过程)

【当我们访问服务端某个jsp文件时,这个jsp如果是第一次访问的话它会去tomcat容器下的work文件下找,看有没有和它对应的servlet Java文件,如果有就直接用此Java文件进行响应,没有的话就将这个jsp文件翻译成相应的servlet Java文件】
jsp在第一次被访问时会被Web容器翻译成servlet,在执行
过程:(服务器做的)
第一次访问---->helloServlet.jsp---->helloServlet_jsp.java---->编译运行
PS:被翻译后的servlet在Tomcat的work目录中可以找到

13、静态包含与动态包含的区别


静态包含:将被包含的页面引入合成一个jsp文件,然后再编译运行。【通过jsp的include指令完成

动态包含:运行一个jsp文件,编译运行后需要另一个jsp文件,就会去找这个页面,然后被引入的页面进行编译运行后加入页面中【通过jsp标签完成

区别:动态包含只在运行的阶段,输出的内容合并在一起。静态包含是起初把内容合并在一起然后编译运行。表面看,动态包含有两个Java文件,静态包含有一个Java文件

14、说一下表达式语言(EL)的隐式对象及其作用。(简单了解,记住一两个即可)

15、表达式语言(EL)支持哪些运算符?

16、你的项目中使用过哪些JSTL标签?

项目中主要使用了JSTL的核心标签库,包括等,主要用于构造循环和分支结构以控制显示逻辑。

17、使用标签库有什么好处?如何自定义JSP标签?

使用标签库的好处包括以下几个方面:

  • 分离JSP页面的内容和逻辑,简化了Web开发;
  • 开发者可以创建自定义标签来封装业务逻辑和显示逻辑;
  • 标签具有很好的可移植性、可维护性和可重用性;
  • 避免了对Scriptlet(小脚本)的使用(很多公司的项目开发都不允许在JSP中书写小脚本)

18、Servlet中如何获取用户提交的查询参数或表单数据?

可以通过请求对象(HttpServletRequest)的getParameter()方法通过参数名获得参数值。如果有包含多个值的参数(例如复选框),可以通过请求对象的getParameterValues()方法获得。当然也可以通过请求对象的getParameterMap()获得一个参数名和参数值的映射(Map)。

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

可以通过重写Servlet接口的init(ServletConfig)方法并通过ServletConfig对象的getInitParameter()方法来获取Servlet的初始化参数。
可以通过ServletConfig对象的getServletContext()方法获取ServletContext对象,并通过该对象的getInitParameter()方法来获取服务器上下文参数。当然,ServletContext对象也可以在处理用户请求的方法(如doGet()方法)中通过请求对象的getServletContext()方法来获得。

20、如何设置请求的编码以及响应内容的类型?

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

21、常用的Web服务器有哪些?

经过系统的学习web服务器,现在知道常用的web服务器的优缺点,这对搭建网站架构时选择使用web服务器很有帮助,现在我简单总结一下:
  1. Apache:属于重量级web服务器(重量级主要是在软件包的大小上比较大,软件的耦合度大),但是速度、性能不及其他轻量级web服务器,并且消费内存较高。使用传统的select模型,比较稳定的Prefork模式为多进程模式,需要经常派生子进程。所以消耗的cpu等服务器资源比较大。
  2. Lighttpd:轻量级web服务器,cpu占用低,效能好,模块丰富。
  3. Tomcat:运行:Servlet和Jsp web的应用软件的容器,静态和高并发处理弱。
  4. Nginx:轻量级,高性能http和反向代理服务器。高并发连接达到2-4万个,内存、cpu等系统资源消耗低。Rewrite重写规则(根据域名,URL的不同将HTTP请求分到不同的后端服务器群组),内置的健康检查功能(Nginx Proxy 后端的某台web服务器宕机也不会影响前端访问),节省带宽(支持GZIP压缩,可以添加浏览器本地缓存的Header头)。

22、getAttribute与getParameter的区别

这部分是对JSP的扩展,经常在JSP或者Servlet中获取数据,那么getAttribute与getParameter有什么区别呢?

1 从获取到数据的来源来说:

getAttribtue获取到的是web容器中的值,比如:
  我们在Servlet中通过setAttribute设定某个值,这个值存在于容器中,就可以通过getAttribute方法获取;

getParameter获取到的是通过http传来的值,比如这样一个http请求:
http:localhost:8080/test/test.html?username=xingoo
  还有其他的GET和POST方式,都可以通过getParameter来获取。

2 从获取到的数据类型来说:
  getAttribute返回的是一个对象,Object。
  getParameter返回的是,前面页面中某个表单或者http后面参数传递的值,是个字符串。

你可能感兴趣的:(JavaWeb部分面试题)