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