美文网首页
JavaWeb部分面试题

JavaWeb部分面试题

作者: 行者和他的钢笔 | 来源:发表于2021-12-06 09:14 被阅读0次

    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,读取<listener>和<context-param>两个结点。
    2、紧接着,容创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文。
    3、容器将<context-param>转换为键值对,并交给servletContext。
    4、容器创建<listener>中的类实例,创建监听器。

    5.2 web.xml配置

    1、配置监听器

    2、配置过滤器

    3、配置servlet【springMVC的前端控制器就是在这配置的】
    servlet基本配置:
    【客户端发送http请求(内部有请求头请求体)到服务器,服务器接收之后会分析我的请求,服务器会根据请求地址查找配置文件web.xml,根据servlet虚拟路径配置找到servlet的类的全包名,<servlet-class>
    com.itheima.servlet.QuickStratServlet</servlet-class>
    根据全包名找到对应的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的核心标签库,包括<c:if>、<c:choose>、<c: when>、<c: otherwise>、<c:forEach>等,主要用于构造循环和分支结构以控制显示逻辑。

    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部分面试题

          本文链接:https://www.haomeiwen.com/subject/vhktmftx.html