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保存!

JavaWeb02-JSP数据交互的更多相关文章

  1. JSP数据交互

    JSP数据交互   一.jsp中java小脚本 1.<% java代码段%> 2.<% =java表达式%>不能有分号 3.<%!成员变量和函数声明%>二.注释 1 ...

  2. #学习笔记#JSP数据交互

    #学习笔记#JSP数据交互 数据库的使用方式:   当用户在第一个页面的查询框输入查询语句点提交的时候我们是用什么样的方式完成这个查询的? 答:我们通过在第一个页面提交表单的形式,真正的数据库查询时在 ...

  3. JSP/Servlet开发——第二章 JSP数据交互(一)

    1. JSP内置对象:JSP内置对象是 Web 容器创建的一组对象:   ●JSP常用的内置对象:out.request.application.session.response等: ●内置对象不需要 ...

  4. jsp数据交互(一).2

    01.什么是JSP内置对象(jsp核心)? Java 内置对象 Java  作用域 解析:jsp内置对象是web容器创建的一组对象.我们都知道tomcat这款软件可以看成是一种web容器,所以我们可以 ...

  5. 第二章 jsp数据交互(一)

    JSP如何处理客户端的请求? 解析:通过jsp内置对象 表单数据被提交到了jsp页面! 什么是JSP内置对象(jsp核心)? Java 内置对象 Java  作用域 解析:jsp内置对象是web容器创 ...

  6. JSP———数据交互【1】

    JSP的内置对象 不用声明就可以在JSP页面中使用 request对象 内置对象 request 封装了用户提交的信息,主要用于处理客户端请求 <FORM action="tom.js ...

  7. JSP数据交互(二)和Servlet基础

    01.Application原理与应用 01.application对象的作用域范围是整个应用服务,而它在应用中所承担的责任就类似于一个全局变量.只要服务启动,则application对象就会存在. ...

  8. jsp数据交互(一),九大内置对象

    九大内置对象 九大内置对象 内置对象 类型 说明 作用域 request javax.servlet.ServletRequest 请求对象——在 一次请求/一个Request请求周期 中传递数据,请 ...

  9. JSP数据交互——九大内置对象及其方法详解(一)

    ①既然说到JSP内置对象,那么什么是JSP内置对象呢? 解析:JSP内置对象,就是在编写JSP页面时,不需要做任何声明就可以直接使用的对象. 如下代码片段:  <% int[]  value  ...

  10. JSP数据交互(一)

    1.JSP内置对象 请求对象:request 输出对象:out 响应对象:response 应用程序对象:application 会话对象:session 页面上下文对象:pageContext 页面 ...

随机推荐

  1. LeetCode Two Sum&Two Sum II - Input array is sorted&3Sum&4Sum 一锅煮题解

    文章目录 Two Sum Two Sum II 3Sum 4Sum Two Sum 题意 给定一个数组,和指定一个目标和.从数组中选择两个数满足和为目标和.保证有且只有一个解.每个元素只可以用一次. ...

  2. 【巨杉数据库SequoiaDB】企业级和开源领域“两开花”,巨杉引领国产数据库创新

    2019年12月15日,OSC 源创会·年终盛典在深圳圆满举行.巨杉数据库作为业界领先的金融级分布式数据库厂商, 获得 “2019年开源数据库先锋企业” 及 “2019 GVP-Gitee最有价值开源 ...

  3. vue报错[Vue warn]: The data property "record" is already declared as a prop. Use prop default value instead.

    当我写了一个子组件,点击打开子组件那个方法时报了一个错 这句话说明意思呢?谷歌翻译一下↓ 数据属性“record”已声明为prop. 请改用prop默认值. 感觉翻译的有点怪,通过最后修改代码后大概意 ...

  4. Python标准库Random

    基本方法 获取一个[0,1)的随机浮点数: import random print(random.random()) #输出 0.6701488343121276 获取指定区间的随机浮点数: impo ...

  5. 你所不知道的Hello World[C++实现]

    要说OIer界内最简单的程序,那恐怕非Hello World莫属了, 那么这篇文章就介绍如何写Hello World(被打). 最简单的一种实现: #include <iostream> ...

  6. spring中实现基于注解实现动态的接口限流防刷

    本文将介绍在spring项目中自定义注解,借助redis实现接口的限流 自定义注解类 import java.lang.annotation.ElementType; import java.lang ...

  7. 测度论--长度是怎样炼成的[zz]

    http://www.58pic.com/newpic/27882296.html http://www.58pic.com/newpic/27893137.html http://699pic.co ...

  8. office2019与Visio2016不能共存解决办法

    我们电脑已经安装office2019,可是安装visio2016就会安装不了.只要两个软件同时安装就可以解决了,简单粗暴. 首先把电脑的offic或者visio都卸载了,删除干净. 然后先打开visi ...

  9. 什么是kafka,怎么使用? (2) - 内含zookeeper等

    zookeeper依赖于java https://baike.baidu.com/item/yum/2835771?fr=aladdin http://yum.baseurl.org/ 去yum官网下 ...

  10. Shell脚本查询磁盘数量

    之前帮朋友写的脚本,运维大数据服务器时候用的. #!/bin/bash ##磁盘数量 Disk=$( fdisk -l |grep 'Disk' |grep 'sd' |awk -F , '{prin ...