文章目录
- 一. 概述
- 1. 定义
- 2. 特点
- 二. JSP九大内置对象
- 1. out 输出对象
- 2. request 请求对象
- (1). 定义
- (2). 对应的类型
- (3). request获取客户端信息的常见方法
- 1. String getParameter(String name)
- 2. String[] getParameterValues(String name)
- 3. void setCharacterEncoding("编码格式utf-8")
- 4. getRequestDispatcher("B.jsp").forward(request,response)
- 5. ServletContext getServerContext()
- 6. 实例分析
- ①. 结构思维图
- ②.代码部分
- ③注意事项:
- (4). 统一请求编码request
- 1. get请求方式
- 2. post方式
- 3. response 响应对象
- (1). 定义
- (2). 提供的方法
- 1. void addCookie(Cookie cookie);
- 3. void setContentType(String type);
- 3. void sendRedirect(String location) throws IOException;
- (1). 实例:登录
- ①. 思维导图
- ②. 代码
- (2). 请求转发和重定向的区别
- 4. session 会话对象
- (1). 定义
- (2). Cookie对象
- 1. 定义
- 2. 本质
- 3. Cookie对象有的方法
- 4. 服务端发送给客户端:
- 5. 实例1
- 6. 实例2
- 7. 实例3
- 8. Cookie的特点
- 1. 缺点
- 2. 优点
- 3. 解决cookie安全的方法
- (3). session:会话
- 1. 概述
- 2. session运行机制
- 3. 举例理解session
- 5. session对象的方法
- 6. 实例1
- (4). cookie和session的区别
- (5). session的钝化和活化
- 5. application 全局对象
- (1). 方法
- (2). 举例理解
- 6. exception 异常对象
- (1). 方法
- 7. page 当前JSP页面对象(相当于java的this)
- (1). 方法
- 8. pageContext JSP页面容器对象
- (1). 方法
- 9. config 配置对象(服务器配置信息)
- (1). 方法
- 三. 四种范围对象(从小到大)
- 1. 以上四个对象共有方法
- 2. pageContext 当前页面有效
- 3. request 同一次请求有效;其他请求无效
- 4. session 同一次会话有效
- 5. application 整个项目运行期间有效
- 6. 总结
- 四. 乱码问题理解
- 1. JSP编码乱码
- 2. HTML编码乱码
- 3. request获取数据乱码
- 4. response输出信息乱码
- 5. Cookie导致的编码问题
一. 概述
1. 定义
JSP内置对象:JSP自带的,不需要new也能使用的对象
JSP预定义了内置对象原因:提高程序员的开发效率
2. 特点
- 内置对象是自动载入的,不需要直接实例化
- 内置对象通过web容器来实现和管理的
- 在所有的JSP页面中,直接调用内置对象都是合法的
二. JSP九大内置对象
- 内置对象使用的时候需要配合jsp的脚本语法。
- 需要引入servlet和jsp的jar包。
1. out 输出对象
负责向客户端输入内容
2. request 请求对象
(1). 定义
存储客户端向服务端发送的请求信息
(2). 对应的类型
javax.servlet.http.HttpServletRequest
(3). request获取客户端信息的常见方法
1. String getParameter(String name)
根据请求的字段名key(input标签的name属性值),返回字段值value(input标签value属性值)
功能:获取客户端传送给服务器的name参数的值,当传送给此函数的参数名没有实际参数与之对应时返回null
2. String[] getParameterValues(String name)
根据请求的字段名key,返回多个字段值value
常见用于checkbox
功能:以字符串数组的形式返回指定参数的所有值
3. void setCharacterEncoding(“编码格式utf-8”)
设置请求编码
Tomcat7以前默认编码为ISO-8859-1
Tomcat8以后改为了utf-8
4. getRequestDispatcher(“B.jsp”).forward(request,response)
请求转发的方式跳转页面 A—>B
5. ServletContext getServerContext()
获取项目的ServletContext对象
6. 实例分析
①. 结构思维图
②.代码部分
注册页
显示页面
③注意事项:
get提交方式:method=“get” 和地址栏、超链接(a href=“xxx”)请求方式默认都属于get提交方式
结构:连接/文件? 参数名1=参数值1 & 参数名2=参数值2 & 参数名3=参数值3
get与post请求方式的区别
(4). 统一请求编码request
1. get请求方式
如果出现乱码
解决:
方法一:统一每一个变量的编码(麻烦,不推荐)
方法二:修改server.xml,一次性修改Tomcat默认get提交方式的编码(utf-8)
2. post方式
如果出现乱码
解决:
设置post方式编码:request.setCharacterEncoding(“utf-8”)
这个只适用于post方式请求编码
这个方法缺点是:只能解决当前页面的乱码问题
过滤器:
想要对整个web应用进行统一编码
可以使用过滤器进行统一的过滤,比较方便
3. response 响应对象
(1). 定义
响应对象
(2). 提供的方法
1. void addCookie(Cookie cookie);
服务端向客户端增加一个cookie对象
3. void setContentType(String type);
设置服务端响应时的编码,设置服务端的contentType类型
3. void sendRedirect(String location) throws IOException;
页面跳转的一种方式(重定向)
(1). 实例:登录
①. 思维导图
②. 代码
login.jsp页面
check.jsp页面
mian.jsp页面
(2). 请求转发和重定向的区别
- 地址栏是否改变
请求转发:不变
重定向:改变
- 是否保留第一次请求时的数据
请求转发(forword):保留
重定向(redirect):不保留 - 请求的次数
请求转发:1次
重定向:2次 - 跳转发生的位置
请求转发:服务端
重定向:客户端发出的第二次跳转
转发、重定向实例:
转发:
重定向:
4. session 会话对象
(1). 定义
session(服务端)
cookie(客户端,不是内置对象)
session对应类(接口)是:javax.servlet.http.HttpSession
(2). Cookie对象
1. 定义
由服务端生成,再发送给客户端保存
相当于本地缓存的作用:客户端(hello.mp4;zs/123)——>服务端(hello.mp4;zs/123)
提高访问服务端的效率,但是安全性较差
2. 本质
Cookie:key=value
Cookie对象由javax.servlet.http.Cookie产生
3. Cookie对象有的方法
- public Cookie(String key, String value)
- String getName()
- String getValue()
- void setMaxAge(int expiry);最大有效期(秒)
4. 服务端发送给客户端:
产生完cookie放在以下方法里面去:
response.addCookie(Cookie cookie)
发送给客户端:
页面跳转(转发、重定向)
客户端获取cookie:
request.getCookies();
注意:
通过F12可以发现,除了自己设计的Cookie对象外,还有一个name为JSESSIONID的cookie
每一个cookie都有一个JSESSIONID
5. 实例1
了解Cookie的工作流程
6. 实例2
使用Cookie实现 记住用户名功能
7. 实例3
了解cookie最大有效期的方法,进行代码实现。
8. Cookie的特点
1. 缺点
cookie不是绝对的安全,用户名、密码保存在cookie中,当cookie被盗取就会暴露了
盗取cookie的方法:
2. 优点
cookie能够持久化保存
cookie可以帮助服务器保存多个状态信息,但不用服务器分配专门存储资源
cookie可以持久保持一些和客户相关的信息
3. 解决cookie安全的方法
- 替代cookie,将数据保存在服务器端,选用session
- 及时删除cookie
(3). session:会话
1. 概述
一次会话:从一次开始——>一次结束
a. 浏览网站:从开始——>关闭就是一次会话
b. 购物: 从浏览、付款、退出就是一次会话
c. 电子邮件:浏览、写邮件、退出就是一次会话
2. session运行机制
客户端第一次请求服务端时,(JSESSIONID——sessionid匹配失败),服务端会产生一个session对象(用于保存该客户的信息);
并且每个session对象 都会有一个唯一的sessionId(用于区分其他session)
服务端又会产一个cookie,并且该cookie的name(key)=JSESSIONID,value=sessionId的值;
然后服务端会在响应客户端的同时 将该cookie发送给客户端,至此 客户端就有了一个cookie(里面是JSESSIONID);
因此客户端的cookie就可以和服务端的session一一对应起来(cookie的JSESSIONID和session的sessionID对应)
客户端第二/n次请求服务端时,服务器会先用客户端cookie中的JSESSIONID去服务端的session中匹配sessionid,如果匹配成功(cookie的JSESSIONID和session的sessionid值相同),说明此用户不是第一次访问,无需登录;
session在用户登录的时候创建
注:
- session存储在服务端
- session是在同一个用户(客户)请求时共享
- 实现机制:第一次客户请求 产生一个sessionid并复制给cookie的jsessionid然后发给客户端。最终通过session的sessionid——和cookie的jsessionid一一对应
3. 举例理解session
例子:
客户端:顾客(客户端)
服务端:存包处——商场(服务端)
顾客第一次存包:商场判断此人是否之前已经存过包(通过你手里面是否有钥匙)
如果是新顾客(没钥匙),分配一个钥匙给该顾客:钥匙会和柜子一一对应
第二次/n次存包:商场判断此人是否之前已经存过包(通过你手里面是否有钥匙)
如果是老顾客(有钥匙),则不需要分配,该顾客手里面的钥匙会和柜子自动一一对应起来
5. session对象的方法
- String getId():获取sessionId
- boolean isNew():判断是否是新用户(第一次访问)
- void invalidate():使session失效(退出登录、注销)
- void setMaxInactiveInterval(秒):设置最大有效 非活动时间
- int getMaxInactiveInterval():获取最大有效 非活动时间
属性操作
- void setAttribute()
- Object getAttribute()
6. 实例1
登录
同一个浏览器可以共用一个session
注:
客户端在第一次请求服务端时,如果服务端发现,此请求没有JSESSIONID,则会创建一个拥有name=JSESSIONID的cookie 并返回给客户端
cookie:
不是内置对象,要使用必须new
但是,服务端会自动生成一个(服务端自动new一个cookie)name=JSESSIONID的cookie 并返回给客户端
(4). cookie和session的区别
- 保存的位置
session:服务端
cookie:客户端 - 安全性
session:较为安全
cookie:较不安全 - 保存的内容
session:Object
cookie:String
(5). session的钝化和活化
- 钝化:内存—>硬盘
- 活化:硬盘—>活化
5. application 全局对象
(1). 方法
- String getContextPath(); 获取虚拟路径
- String getRealPath(); 获取绝对路径(虚拟路径相对的绝对路径)
(2). 举例理解
实现页面被访问次数的统计
6. exception 异常对象
(1). 方法
- 功能:异常处理对象(需要页面设置isErrorPage属性参数)
- 类型:Throwable
7. page 当前JSP页面对象(相当于java的this)
(1). 方法
- 功能:描述页面的对象
- 类型:Object
8. pageContext JSP页面容器对象
(1). 方法
- 功能:页面的全局对象【作用域】
- 类型:PageContext
9. config 配置对象(服务器配置信息)
(1). 方法
- 功能:配置
- 类型:ServletConfig
三. 四种范围对象(从小到大)
pageContext JSP页面容器对象 (page对象)
- 当前页面定义的变量只能本页面使用不能跨页面调用
request 请求对象
- 客户端发起请求到服务器响应结束
session 会话对象
- 从浏览器打开到结束的过程,过程中可以发起多次请求操作
application 全局对象
- 服务器从启动到停止的整个过程
1. 以上四个对象共有方法
- Object getAttribute(String name):根据属性名,获取属性值
- void setAttribute(String name, Object obj):设置属性值(新增,修改)
- void removeAttribute(String name);根据属性名,删除对象
2. pageContext 当前页面有效
页面跳转后无效
3. request 同一次请求有效;其他请求无效
请求转发后有效;重定向后无效
4. session 同一次会话有效
无论怎么跳转,都有效;
关闭/切换浏览器后无效;
从登录到退出之间全部有效
5. application 整个项目运行期间有效
全局变量
切换浏览器任然有效
6. 总结
对个项目共享、重启后仍然有效LJNDI
- 以上的4个范围对象,通过setAttribute()赋值,再通过getAttribute()取值
- 以上范围对象,尽量使用最小的 范围对象,对象范围越大造成的损耗越大
作用域对象范围:从小到大排列
- pageContext<request<session<application
代码举例:
四. 乱码问题理解
1. JSP编码乱码
这种是最常见的,设置编码的位置位于JSP的第一行,如果在Eclipse中新建一个JSP默认是下面这种:
它默认的页面编码和传输编码都是ISO-8859-1,这是用于欧洲国家的编码。
可以通过设置Eclipse中JSP的编码格式,来修改默认生成的编码格式。
如果想要支持中文,可以使用UTF-8、GB2312、GBK等,其中UTF-8是国际化的,哪个国家的都支持。
上面涉及到编码的两个地方:charset 和 pageEncoding
charset是指服务器发往客户端展现时的编码;
pageEncoding用于设置JSP页面本身的编码。
JSP在部署后提供给用户使用,会经过三个阶段:
1 JSP生成java文件:这个阶段会使用pageEncoding所定义的编码格式进行转换
2 java文件生成class文件:这个阶段由服务器tomcat自动使用utf-8编码把java文件转换成字节码class文件
3 通过读取class文件展现给用户:这个阶段由tomcat服务器获取字节码内容,通过使用contentType所定义的编码格式展现给用户。
大致过程如下图:
可以这样设置:
2. HTML编码乱码
因为JSP中也包含HTML的内容,HTML本身也是有编码格式的。
如果这部分编码出现问题,那么HTML中标签的中文命名就会出现乱码。
HTML中因为只涉及到表现层,所以只有一个属性content中charset,这个编码格式设置对了,就没问题了。
3. request获取数据乱码
有时候在做jsp逻辑处理时,比如提交表单,从前台注册的页面提交了一部分的数据,但是后面处理的JSP页面
通过 request.getParameter 调用时,获取到的是一堆乱码。
这是因为虽然前面JSP设置了编码格式,却没有在当前的JSP中设置读取数据的编码格式。
使用下面的代码,就可以是设置request获取请求内容的数据编码:
需要注意的是,这种方式对 URL传参这种JSP请求 是没有作用的。比如:
这种情况仍然会出现乱码,这种URL传参的方式,只能修改服务器tomcat的传输编码格式。
修改tomcat安装文件 apache-tomcat-6.0.43\conf 目录下的server.xml
4. response输出信息乱码
response输出页面元素内容时,也会出现乱码。
使用下面代码就可以设置response输出的编码格式:
response.setCharacterEncoding(“UTF-8”)的作用是指定服务器响应给浏览器的编码。
response.setContentType(“text/html;charset=utf-8”)的作用是指定服务器响应给浏览器的编码。同时,浏览器也是根据这个参数来对其接收到的数据进行重新编码(或者称为解码)。
5. Cookie导致的编码问题
Cookie由于需要保存在客户端中,因此使用过程中都需要编码以及转码:
在使用Cookie数据前
依然要注意导入必备的包:java.net.*
注意request的编码;
使用URLDecoder进行解码