zoukankan      html  css  js  c++  java
  • javaweb阶段几个必会面试题

    1.jsp的9大隐式对象

    response(page):response对象是javax.servlet.http.HttpServletResponse对象的一个实例。就像服务器创建request对象一样,它还创建一个对象来表示对客户端的响应。response对象还定义了处理创建新HTTP头的接口。通过此对象,JSP程序员可以添加新的Cookie或日期戳,HTTP状态代码等。

    request(request):request对象是javax.servlet.http.HttpServletRequest对象的一个实例。每当客户端请求页面时,JSP引擎将创建一个新对象来表示该请求。request对象提供了获取包括表单数据,Cookie,HTTP方法等HTTP头信息的方法。

    out(page):out隐式对象是javax.servlet.jsp.JspWriter对象的一个实例,用于在响应中发送内容。初始化JspWriter对象根据页面是否缓存而不同地实例化。缓冲可以通过使用page指令的buffered ='false'属性来关闭。JspWriter对象包含与java.io.PrintWriter类大部分相同的方法。但是,JspWriter还有一些额外的方法用来处理缓冲。与PrintWriter对象不同,JspWriter会抛出IOExceptions异常。

    session(session):session对象是javax.servlet.http.HttpSession的一个实例,其行为与Java Servlet下的会话对象行为完全相同。session对象用于跟踪客户端请求之间的客户端会话。

    aplication(aplication):application对象是生成的Servlet的ServletContext对象的直接包装,实际上是javax.servlet.ServletContext对象的一个实例,application对象是JSP页面在其整个生命周期中的表示。 当JSP页面被初始化时,将创建此对象,并且在JSP页面被jspDestroy()方法删除时application对象也将被删除,通过向application对象添加属性值,可以确保组成Web应用程序的所有JSP文件都可以访问它。

    config(page):config对象是javax.servlet.ServletConfig的实例化,是生成的servlet的ServletConfig对象周围的直接包装。

    pageContext(page):pageContext对象是javax.servlet.jsp.PageContext对象的一个实例。pageContext对象用于表示整个JSP页面

    page(page):page对象是对该页面实例的实际引用。可以认为它是表示整个JSP页面的对象,page对象是this对象的直接同义词。

    exception(page):exception对象是一个包含上一页抛出的异常的包装器。它通常用于生成对错误条件的适当响应

    括号内为所属作用域

    2.四大域对象及其作用域

    JavaWeb的四大作用域为:page,request,session,application

    page:作用范围是整个JSP页面,是四大作用域中最小的一个;生命周期是当对JSP的请求时开始,当响应结束时销毁。对page对象的引用通常存储在pageContext对象中。

    request:作用范围是在当前请求中有效;生命周期是在service方法调用前由服务器创建,传入service方法。整个请求结束,request生命结束。Servlet之间的信息共享是通过HttpServletRequest接口的两个方法来实现的。
    setAttribute(String name, Object value):将对象value以name为名称保存到request作用域中。
    ObjectgetAttribute(String name):从request作用域中取得指定名字的信息。

    session:作用范围是一次会话。生命周期是在第一次调用request.getSession()方法时,服务器会检查是否已经有对应的session,如果没有就在内存中创建一个session并返回。当一段时间内session没有被使用(默认为30分钟),则服务器会销毁该session。如果服务器非正常关闭(强行关闭),没有到期的session也会跟着销毁。如果调用session提供的invalidate(),可以立即销毁session。session是通过HttpSession接口实现的,它提供的主要方法如下:
    ObjectHttpSession.getAttribute(String name):从session中获取信息。
    voidHttpSession.setAttribute(String name, Object value):向session中保存信息。
    HttpSessionHttpServletRequest.getSession():获取当前请求所在的session的对象。

    application:作用范围是整个Web应用。当Web应用被加载进容器时创建代表整个web应用的ServletContext对象,当服务器关闭或Web应用被移除时,ServletContext对象跟着销毁。application作用域就是服务器启动到关闭的整段时间,在这个作用域内设置的信息可以被所有应用程序使用。application作用域上的信息传递是通过ServletContext实现的,它提供的主要方法如下:
    ObjectgetAttribute(String name):从application中获取信息。
    void setAttribute(String name, Object value):向application作用域中设置信息。

    作用域从小到大为:page(jsp页面),request(一次请求),session(一次会话),application(整个web应用)。

    3.servlet的生命周期

    (1)类装载过程和实例化

    当Servlet容器启动或客户端发送一个请求时,Servlet容器会查找内存中是否存在该Servlet实例,若存在,则直接读取该实例响应请求;如果不存在,就创建一个Servlet实例。

    (2)init()初始化过程

    实例化后,Servlet容器将调用Servlet的init()方法进行初始化(一些准备工作或资源预加载工作)。

    (3)service()服务过程,选择doget/dopost

    初始化后,Servlet处于能响应请求的就绪状态。当接收到客户端请求时,调用service()的方法处理客户端请求,HttpServlet的service()方法会根据不同的请求 转调不同的doXxx()方法,在doget/dopost方法中,能够将数据传到指定的页面。

    (4)destroy()销毁过程
    当Servlet容器关闭时,Servlet实例也随时销毁。其间,Servlet容器会调用Servlet 的destroy()方法去判断该Servlet是否应当被释放(或回收资源)

    4.cookie和session的工作原理,联系和区别

    (1)cookie的工作原理

    1、创建Cookie

    当用户第一次浏览某个使用Cookie的网站时,该网站的服务器就进行如下工作:
    ①该用户生成一个唯一的识别码(Cookie id),创建一个Cookie对象;
    ②默认情况下它是一个会话级别的cookie,存储在浏览器的内存中,用户退出浏览器之后被删除。如果网站希望浏览器将该Cookie存储在磁盘上,则需要设置最大时效(maxAge),并给出一个以秒为单位的时间(将最大时效设为0则是命令浏览器删除该Cookie);
    ③将Cookie放入到HTTP响应报头,将Cookie插入到一个 Set-Cookie HTTP请求报头中。
    ④发送该HTTP响应报文。

    2、设置存储Cookie

    浏览器收到该响应报文之后,根据报文头里的Set-Cookied特殊的指示,生成相应的Cookie,保存在客户端。该Cookie里面记录着用户当前的信息。

    3、发送Cookie

    当用户再次访问该网站时,浏览器首先检查所有存储的Cookies,如果某个存在该网站的Cookie(即该Cookie所声明的作用范围大于等于将要请求的资源),则把该cookie附在请求资源的HTTP请求头上发送给服务器。

    4、读取Cookie

    服务器接收到用户的HTTP请求报文之后,从报文头获取到该用户的Cookie,从里面找到所需要的东西。

    注意:Cookie并不是指浏览器的记住账号密码功能,也不是指你输入一个账号就能因为Cookie的存在能够自动填写密码。Cookie类似淘宝的登录,当你登录淘宝后,无论你是否关掉网页甚至关机,只要还是这台电脑,当你再次打开淘宝时你就是已登录的状态,这就是Cookie的功能。服务器获取Cookie用request.getCookies获取,获取的是所有Cookie,用request.addCookie将Cookie存到响应头并发给客户端。

    (2)session工作原理

    1、创建Session

    服务器第一次接收到请求时,开辟了一块Session空间(创建了Session对象),同时生成一个Session id,并通过响应头的Set-Cookie:“JSESSIONID=XXXXXXX”命令,向客户端发送要求设置cookie的响应; 客户端收到响应后,在本机客户端设置了一个JSESSIONID=XXXXXXX的cookie信息,该cookie的过期时间为浏览器会话结束;接下来客户端每次向同一个网站发送请求时,请求头都会带上该cookie信息(包含Session id); 然后,服务器通过读取请求头中的Cookie信息,获取名称为JSESSIONID的值,得到此次请求的Session id;

    2、使用Session

    如果把cookie禁用的话,可以使用URL重写,就是把sessionid直接附加在url后面作为url路径的附加信息或者是查询信息
    还有一种就是表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把Session id传递回服务器。

    (3) cookie和session的区别

    1、存放位置不同

    Cookie保存在客户端,Session保存在服务端。

    2 、存取方式的不同

    Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比拟艰难的。
    而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。

    3、安全性(隐私策略)的不同 

    4、有效期上的不同

    5、对服务器造成的压力不同

    6、 跨域支持上的不同

    5.get提交和post提交的区别

    (1)get是从服务器上获取数据,post是向服务器传送数据。
    (2)get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
    (3)对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
    (4)get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB
    (5)get安全性非常低,post安全性较高。

    HTTP 定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST。事实上 GET 适用于多数请求,而保留 POST 仅用于更新站点。根据 HTTP 规范,GET 用于信息获取,而且应该是 安全的和幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。幂等的意味着对同一 URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。 比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。POST 请求就不那么轻松了。POST 表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过 POST 请求实现,因为在注解提交之后站点已经不同了
    在FORM提交的时候,如果不指定Method,则默认为GET请求,Form中提交的数据将会附加在url之后,以?分开与url分开。字母数字字符原 样发送,但空格转换为“+“号,其它符号转换为%XX,其中XX为该符号以16进制表示的ASCII(或ISO Latin-1)值。GET请求请提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中;GET方式提交的数据最多只能有1024字节,而POST则没有此限制。

    6,请求转发和请求重定向的区别

    转发:一次请求,一次响应(服务器)
    重定向:两次请求,两次响应(服务器)

    例子:假设借钱为一个请求,A为客户端(浏览器),B、C为服务器
    请求转发:A找B借钱(A发起一次请求),B表示自己没钱但是个好人,就去找C告诉他A要借钱(这里还是A的请求),C接受A的请求然后借钱
    给A(C给A响应),所以是一次请求,一次响应。
    重定向:A找B借钱(A发起一次请求),B表示自己没钱但是个好人,就告诉他A跟他说C是个有钱人可以找C借钱(B给A一个响应),
    A听了B的意见然后就去找C借钱(A又向C发起请求),C接受A的请求然后借钱给A(C给A响应),所以是两次请求两次响应。

    7.HTTP协议的相关内容

    Http 是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型,

    HTTP常常载于TCP协议之上,也有是在(TLS/SSL)传输安全协议之上,默认的端口是80, https的默认端口是443

    HTTP永远是客户端发起请求,服务器响应.限制无法在客户端未发送请求的情况下响应消息给客户端

    HTTP的一次操作被称之为一个事务,工作过程分为4个步骤

    1.首先是客户机和服务器建立连接,只需要单击某个超链接http的工作就开始
    2.建立连接之后,客户端向服务器发起一个请求
    3.服务器接收到请求之后,给予相应的响应信息
    4.客户端接收到服务器返回的信息通过浏览器显示,然后客户端和服务器断开连接
    HTTP是一个无状态的协议(无状态的协议是指对于事务处理没有记忆功能,缺少状态意味着如果之后继续处理前面需要的信息,则必须重传,这就导致了传输的数据量增大,另一方面,在服务器不需要先前的信息时,它的应答就比较快)

    要想了解HTTP还有几个内容要了解,三次握手和四次挥手,还有要了解请求头和响应头的结构等。

    8.如何防止表单的重复提交

    原因:

    1、由于用户误操作,多次点击表单提交按钮。
    2、由于网速等原因造成页面卡顿,用户重复刷新提交页面。
    3、黑客或恶意用户使用postman等工具重复恶意提交表单(攻击网站)。

    解决:

    1、JS禁止提交按钮: 表单提交之后使提交按钮disable, 但是如果客户端把js禁用掉的话这种方法就无效了
    2、使用POST/Redirect/GET模式 在提交了表单之后执行页面重定向,转到提交信息成功的页面
    3、在session中存放一个特殊的标志 在服务器端生成一个唯一的标识符,将他存入session,同时写入表单的隐藏字段首次提交时与session比较 相等就说明是首次提交 然后移除这个session,下次提交比较不相等就说明不是首次提交
    4、使用header函数转向 ,这样即使用户使用刷新键也不会重新提交表单
    5、在数据库里添加唯一约束或者创建唯一索引,防止数据出现重复,这是最有效的防止重复提交数据的方法
    6、使用Cookie记录表单的状态,根据它的状态可以检查是否已经提交表单 这种方法如果客户端禁用掉cookie的话就不会生效了

    9.js和JQ的常用选择器和函数

    js:fun(this)
    jq:$(this)
    2.获取父标签
    js:document.getElementById("***").parentNode
    jq:$("***").parent()
    3.获取子标签
    js: document.getElementById("***").childNodes
    jq: $("***").children()
    4.获取上一个标签
    js: document.getElementById("test").previouselementsibling
    jq: $("#test").prev()
    5.获取下一个标签
    js: document.getElementById("test").nextSibling
    jq: $("#test").next()

    js还能够通过getElementsByName()、getElementsByTagName()、getElementsByClassName()、querySelector()、querySelectorAll()
    A: getElementById(ID): 返回对指定ID的第一个对象的引用,如果在文档中查找一个特定的元素,最有效的方法是getElementById()
    B: getElementsByName(name): 返回文档中name属性为name值的元素,因为name属性值不是唯一的,所以查询到的结果有可能返回的是一个数组,而不是一个元素。
    C: getElementsByTagName(tagname): 返回文档中指定标签的元素
    D: getElementsByClassName():返回文档中所有指定类名的元素
    E: querySelector():返回文档中匹配指定css选择器的第一个元素
    F: querySelectorAll():返回文档中匹配指定css选择器的第一个元素

    jq更方便,$("")内选择器写法与css选择器相似
    参考:https://www.cnblogs.com/codingcc1/p/11073083.html

    10.如何防止乱码问题

    1).如果提交方式为post,想不乱码,只需要设置request对象的编码即可。
    request.setCharacterEncoding("UTF-8");
    response.setCharacterEncoding("gb2312");//通知服务器发送数据时查阅的码表
    response.setContentType("text/html;charset=gb2312");//通知浏览器以何种码表打开
    注意:客户机数据是以哪种方式提交的,request就应该设成什么编码。

    2).如果提交方式为get,设置request对象的编码是无效的,想不乱码,只能手工转换。

    String data = "???????";//乱码字符串
    byte source [] = data.getBytes("iso8859-1");//得到客户机提交的原始数据
    data = new String (data.getBytes("iso8859-1"),"UTF-8");//解决乱码

    //等同于

    data = new String (source,"UTF-8");

    3).get方式的乱码,还可以通过更改服务器配置的方式实现。更改Tomact的conf目录下的server.xml文件。

  • 相关阅读:
    Windows安装nginx服务
    高血压食谱 芹菜苦瓜可以降压吗
    非IT,零经验,零基础怎么备考信息系统项目管理师/高项考试?
    为什么要用urlencode()函数进行url编码
    Redis哨兵机制
    Qt 自定义QToolButton 自己互斥同时工具按钮之间实现互斥
    QItemSelectionModel获取QModelIndexList程序崩溃
    Qt QListView scrollTo定位指定项 和 LayoutMode布局的简单用法
    Sublime Text3 离线安装中文插件
    VSCODE导出PDF的数学公式
  • 原文地址:https://www.cnblogs.com/zn19961006/p/11879092.html
Copyright © 2011-2022 走看看