Loading

JavaWeb02-JSP数据交互

01.页面编码格式

001.jsp页面本身的编码 page指令中的 pageEncoding属性!
002.浏览器渲染页面采用的编码 contentType属性
003.服务器保存数据采用的编码(request) 默认为 ISO-8859-1

注意:
01.--前两种(pageEncoding/contentType),一旦指定了一种,另一种如果不指定的话 默认采用已指定的编码!
--request.setCharacterEncoding(String charset)用来设置request内部保存数据的格式!(不包括URL!)
02.contentType和pageEncoding的区别:
contentType定义的是响应的资源类型,也可以包含jsp页面和响应内容的字符集;
pageEncoding指定jsp文件的字符集以及默认的contentType字符集!

02.JSP 九个内置对象!
out : JspWriter类的实例!
常用方法:01.void print(Object); ==》输出各种类型!
02.void println(Object);==》输出各种类型!
03.void write(charset); ==》输出字符类型! 不能打印 null String str=null!
response: 最常用重定向! void sendRedirect(String location)

session:会话!(HttpSession类的实例)
浏览器与web服务器之间使用http协议进行通信的!
HTTP协议是一种基于请求/响应模式的 无状态 访问协议!
“无状态”是指每一个HTTP请求都是独立的!服务器不会保存以往的请求和会话!
因此,当一个客户端发送请求到web服务器时,无论是否是第一次来访,服务器都当他是第一次来访!
作为服务器来说,必须有一种机制来唯一标识每一个请求用户(不然不能确定每一次操作是否是同一用户!),同时记录该用户的状态信息!==》会话跟踪机制!
该机制可以保存每个请求用户的会话信息!

session 一词指 有始有终的一系列动作!
session执行过程:
01.会话机制是一种服务器端的机制!当用户第一次向服务器发送请求时,服务器会为该用户创建唯一的会话,会话将一直持续到用户访问结束!
02.当服务器接收到客户端请求时,服务器端会首先判断是否创建了与该客户端对应的会话!
如果已创建,就将该请求与此会话相关联!反之,就创建一个新的会话!
03.服务器端是否创建了相关会话,是通过一个唯一的标识 sessionid来实现的!
如果在客户端的请求中包含了一个sessionid。则说明在此前已经为该客户端创建了会话!
服务器就根据这个sessionid将之前的session对象读取出来!
否则就创建一个新的会话对象并生成一个sessionid!
并将sessionid在本次响应中 “返回给客户端保存” !(sessionid是保存在 客户端cookie中!)

sessionid会返回客户端,那么在客户端sessionid保存在哪??
在客户端保存信息使用 cookie,在cookie中,保存sessionid的名称是JESEEIONID!(由一串复杂的字符串组成!)

session和浏览器窗口:
通过超链接打开的新窗口,新窗口与其父窗口的sessionid相同!
(目前针对与谷歌/IE8以上的浏览器,多个窗口为同一个sessionid!共享同一个缓存!保存在本地的cookie中!)

会话的失效:
01.会话超时:两次请求的时间间隔超过了服务器允许的最大时间间隔!
001.通过session对象的setMaxInactionInterval(单位秒)设置session的 “非活动时间”!(浏览器最后依次访问服务器开始计算!)
002.在项目的web.xml中设置!
<session-config>
<session-timeout>10(单位分钟)</session-timeout>
</session-config>
003.在应用服务器中的web.xml中设置!

这里引入一个概念:
项目中web.xml和tomcat服务器中的web.xml
01.tomcat-web.xml + 项目-web.xml = 合并的xml
02.如果这两个中出现重复的配置,项目中的优先!(就近原则)
03.tomcat服务器中为全局配置!项目中是局部的!只针对本项目有效!

02.手动调用方法使其失效
session.invalidate():设置session对象失效!主要应用于 用户注销登录的功能!
如果只想清空会话中的某个数据对象,使用session.removeAttribute(String key)!会话仍然有效!

注意:session.setAttribute(String key,Object value) value值为Object类型,get获取时需要向下转型!


request:将url和data封装成request请求!
请求中的中文乱码问题:
01. post请求方式: tomcat对请求数据默认采用ISO-8859-1的编码!
request.setCharacterEncoding("utf-8"); 页面中
页面本身的编码要和请求没编码一致!<%@page contentType="text/html;charset=utf-8"%>
02. get请求方式:
因为get请求时,提交的数据作为查询字符串被附加到url的末尾发送至服务器!
对于这部分数据,使用request.set..是不起作用的!
解决方式1:
得到请求的参数后进行编码转换!
String name = request.setParameter("name");
name = new String(name.getBytes("ISO-8859-1"),"utf-8");
其中,getBytes()按照ISO-8859-1的编码格式把name转化为 byte数组!
在通过new String()使用指定的utf-8将 byte数组狗造成一个新的String!
解决方式2:
方式1中,如果存在多个参数,则要对每个参数都进行操作!繁琐,效率不高!
可以通过tomcat目录结构\conf\server.xml 文件
设置<Connector>节点!
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" redirectPort="8443"
URIEncoding="UTF-8"/>

application : 类似于系统的全局变量!同一个应用内的所有用户之间的数据共享!
常用方法:String getRealPath();返回相对路径的真实路径!
e:\apache-tomcat-7.0.73\webapps\...
经常应用于统计访问人数!
Integer count = (Integer)application.getAttribute("count");
if(count != null){
count = count+1;
}else{
count =1;
}
application.setAttribute("count",count);

page :当前jsp页面实例化的对象 (this)
这里说明下 两个 include的区别:
01.include指令:
<%@include file="**.jsp"%>
例如 a.jsp include b.jsp
过程:
将a.jsp+b.jsp= c.jsp (合并后生成 c.jsp) c 是我们模拟的,实际没有 c.jsp文件!
c.jsp--c.java--c.calss--执行!
所以说 两个pageContext在同一个作用域中!
02.pageContext.include("**.jsp");
例如 a.jsp include b.jsp
过程:
01.先执行 b.jsp--b.java--b.class--执行!--得到结果 c(null)
02.将结果 c(null) 与 a.jsp合并成新的c.jsp! --c.java--c.class--执行!--得到结果
所以说 两个pageContext分别在 a和b 两个作用域中!
a.jsp页面:
String name = "haha";
pageContext.setAttribute("name",name);
a中内容:<%=pageContext.getAttribute("name")%>
<%=pageContext.include("b.jsp")%>//在 a页面中 引入b页面
b.jsp页面:
b中内容:<%=pageContext.getAttribute("name")%>

运行a.jsp得到结果为:haha null

config :指定jsp页面初始化配置(servlet中会使用!)

exception :异常一般使用java代码处理!此对象很少使用!
该对象只有在 page指令中设定 isErrorPage为true的页面中使用!

pageContext :内置对象的集大成者!通过pageContext 可以获取其他8个内置对象! pageContext.getRequest()...
Object getAttribute();//返回Object类型value值!
void include();//请求指定的资源,并将目标资源的响应结果包含在调用页面的响应中!

JSP内置对象不需要实例化?
所谓内置对象就是由Web容器加载的一组ServletAPI的实例,这些实例由JSP规范进行了默认的初始化操作!(_jsp.java中!)
内置对象名均为JSP的保留字!

03.JSP四大作用域
page;对应一个jsp页面的运行
request:一次请求
session: 会话有效期内
application:整个应用上下文

范围 : application > session > request > page


04.转发和重定向!
转发过程:
web容器内部将一个request请求的处理权交给了另外一个资源,属于同一个请求/响应的过程!request对象的信息不会丢失!
转发是在 服务器端发挥作用!通过RequestDispatcher对象的forward()将提交信息在多个页面间进行传递!
转发是在服务器内部进行控制权的转移!客户端浏览器地址栏不会显示出转发后的地址!(可以共享请求中的数据!)
重定向过程:
web容器向浏览器返回一个响应,浏览器接收这个响应后再发送一个新的http请求到服务器(属于两次不同的请求!第一次请求request对象的信息将丢失!)
重定向是在客户端发挥作用!通过请求新的地址实现页面跳转!(浏览器重新请求地址!地址栏中显示转向后的地址!)

注意:如果想在重定向下 传递少量的参数,可以将参数追加至url末尾!
response.sendRedirect("welcome.jsp?userName="+name+"&pwd="+pwd);

在使用超链接<a>进行数据传递时,采用的是get方式!
(除了form中指定post和ajax指定post,其他情况都默认采用get方式提交请求!)

05.include指令!
通过include指令引用公用代码文件,从而缓解代码冗余问题!
<%@include file="文件路径"%>
01.在JSP编译阶段 插入一个包含文本或代码的文件,这个包含的过程是 静态的!(可包含JSP HTML 文本文件等...)
02.include指令只有 一个属性 file! 被包含的文件路径!

06.cookie
cookie 由Netscape公司发明,是最常用的 跟踪用户会话的方式!
是由服务器端生成 并发送给客户端浏览器!浏览器会将其保存在某目录下的文本文件!

应用场景:
01.判断用户注册用户是否已经登录,保存信息以便下次简化登录!
02.最近浏览的商品
03.统计网站浏览次数
04.实现个性化服务,针对用户喜好展示不同内容

注意:
cookie会将用户信息保存在客户端,安全性上cookie存在一定风险!不建议将敏感信息保存在cookie中!

01.创建cookie
Cookie cookie = new Cookie(String name,String value);
02.写入cookie
response.addCookie(cookie);
03.读取cookie
Cookie[] cookies = request.getCookies();//该方法返回http请求中的coookie数组!

遍历此数组,通过getName()和getValue() 获取!

04.验证sessionid以cookie的形式保存在客户端之中!
创建会话
session.setAttribute("str","haha");
response.sendRedirect("getCookie.jsp");
//此处如果为转发,则得不到cookie中的JSESSIONID!
因为转发是一次请求,客户端没有得到响应!故没有向客户端写入cookie!

在getCookie.jsp中进行获取
out.print("sessionid="+session.getId());
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for(Cookie cookie:cookies){
out.print("cookieName="+cookie.getName())
out.print("cookieValue="+cookie.getValue());
}
}

得到结果 sessionid 和 cookieValue 的值一致!

05.cookie的有效期
cookie是有生命周期的!
cookie.setMaxAge(int expiry); 以秒为单位!

注意:
如果设置expiry=0 则表示从客户端删除该cookie!
如果设置expiry为负数/不设置 则表示cookie会在当前窗口关闭后失效!

07.cookie 和 session

session的作用域是在服务器端保存用户信息,cookie是在客户端!
session作用域中保存的值是Obejct类型,cookie保存的值是String类型!
session作用域随会话的结束而将其存储的数据销毁,cookie可以长期保存在客户端!
session通常保存重要的信息,而cookie通常保存不重要的信息!

例如 保存用户登录名/密码 不能使用cookie!
电商网站中的“最近浏览过的商品”可以使用cookie保存!


















posted @ 2017-12-02 13:25  yanbubao  阅读(250)  评论(0编辑  收藏  举报