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文件。

javaweb阶段几个必会面试题的更多相关文章

  1. java基础阶段几个必会面试题

    摘自:https://www.cnblogs.com/zn19961006/p/11869182.html java基础阶段几个必会面试题 目录 1.说出你对面向对象的理解 在我理解,面向对象是向现实 ...

  2. (转)Linux运维MySQL必会面试题100道

    老男孩教育Linux运维班MySQL必会面试题100道 (1)基础笔试命令考察 (要求:每两个同学一组,一个口头考,一个上机实战作答,每5个题为一组,完成后换位) 1.开启MySQL服务 2.检测端口 ...

  3. Django 必会面试题总结

    1 列举Http请求中常见的请求方式 HTTP请求的方法: HTTP/1.1协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式   注意: 1)方法名称是 ...

  4. C语言必会面试题(3、耶稣有13个门徒,当中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:13人围坐一圈,从第一个開始报号:1,2,3,1,2,3...。凡是报到“3”就退出圈子,...)

    3.耶稣有13个门徒.当中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:13人围坐一圈,从第一个開始报号:1.2,3.1,2,3.... 凡是报到"3"就退出圈子.最后留在圈子 ...

  5. MySQL必知必会面试题 基础

    1.登录数据库 (1).单实例 mysql -uroot -poldboy (2).多实例 mysql -uroot -poldboy -S /data/3306/mysql.sock 2.查看数据库 ...

  6. java必背面试题

    JAVA必背面试题和项目面试通关要点 一 数据库 1.常问数据库查询.修改(SQL查询包含筛选查询.聚合查询和链接查询和优化问题,手写SQL语句,例如四个球队比赛,用SQL显示所有比赛组合:举例2:选 ...

  7. JAVA必背面试题和项目面试通关要点

    一 数据库 1.常问数据库查询.修改(SQL查询包含筛选查询.聚合查询和链接查询和优化问题,手写SQL语句,例如四个球队比赛,用SQL显示所有比赛组合:举例2:选择重复项,然后去掉重复项:) 数据库里 ...

  8. Web前端开发的四个阶段(小白必看)

    第一阶段:HTML的学习 超文本标记语言(HyperText Mark-up Language 简称HTML)是一个网页的骨架,无论是静态网页还是动态网页,最终返回到浏览器端的都是HTML代码,浏览器 ...

  9. JAVA必背面试题和项目面试通关要点(带答案)

    转载:https://blog.csdn.net/qq_36896779/article/details/78247050 一 数据库 1.常问数据库查询.修改(SQL查询包含筛选查询.聚合查询和链接 ...

随机推荐

  1. 循环Gray码的生成(非递归)

    #!/usr/bin/env python #coding:utf-8 import sys def gray_code(n): if n < 1: return [] n += 1 array ...

  2. P3958奶酪

    这个题是2017noip提高组的真题,是一个深度搜索题,得分轨迹:10-80-100pts. 在三维空间里,存在可能连通的洞(半径r),问是否可以通过这些洞从底部到达顶部.一开始我联想到了01迷宫,以 ...

  3. Tarjan水题系列(2):HNOI2012 矿场搭建

    题目: 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后 ...

  4. SSM框架中数据库无法连接的问题

    首先是SSM框架中所有的配置都是没有问题的,而且项目在其他人的环境上也能正常访问数据库:那么最有可能的就是数据库版本的问题导致数据库连接不上,服务器给我的报错是: 15:37:25.902 [C3P0 ...

  5. Scrapy 教程(八)-分布式爬虫

    scrapy 本身并不是一个分布式框架,而 Scrapy-redis 库使得分布式成为可能: Scrapy-redis 并没有重构框架,而是基于redis数据库重写了框架的某些组件. 分布式框架要解决 ...

  6. Codeforces - 1096G - Lucky Tickets - NTT

    https://codeforc.es/contest/1096/problem/G 把数组分成前后两半,那么前半部分的各个值的表示方案的平方的和就是答案. 这些数组好像可以dp出来. 一开始设dp[ ...

  7. MY SQL数据库密码最简单的一个方法()

    https://zhidao.baidu.com/question/564368111.html 非常简单的一个修改方法!!!!!!!!!!!!!!!!!!!!! 最简单的方法就是借助第三方工具Nav ...

  8. MySQL使用explain时各字段解释

    1.id select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序 三种情况: (1)id相同,执行顺序由上至下 id相同,执行顺序由上至下 此例中 先执行where 后的 ...

  9. C scanf 函数的其他使用注意点

    1.scanf 函数中没有精度控制,如: scanf("%5.2f", &a )是非法的,不能企图用此语句数据小数位2位的实数 2.scanf中要求给出变量地址,如给出变量 ...

  10. Array.prototype

    Array.prototype  属性表示 Array 构造函数的原型,并允许您向所有Array对象添加新的属性和方法. /* 如果JavaScript本身不提供 first() 方法, 添加一个返回 ...