本帖最后由 小石姐姐 于 2018-6-7 10:27 编辑
就业班_JavaEE_day16_17_JSP_会话跟踪
一 概述
jsp就是servlet,有html和java代码组成。
默认第一次请求访问jsp时 服务器将jsp转换为类servlet的java文件,然后编译成class文件,并创建该类对象,调用service方法对外提供服务。
第二次请求访问jsp则直接调用service方法。
二 jsp中嵌套java代码的三种写法
1 <% int i=0; %> 这种形式的代码相当于写在service方法内 ;可以定义局部变量、局部代码块、局部内部类
2 <%=xx %> 这种形式的代码相当于 out.println(xx),会向页面输出,xx后面不带分号 ;
3 <%! int j=0; %> 这种形式的代码相当于类的成员申明 ,比如成员变量或者成员方法或者成员内部类 ,一般比较少用到。
tomcat中 jsp被转化的java文件和class文件放在work目录中。
三 jsp和servlet的分工
jsp负责两头,即请求页面,和 显示响应结果
servlet负责中间处理。 在servlet中获取请求参数,然后访问后台数据库中结果拿到后,放在request域中,然后转发给jsp进行展示。
四 jsp九大对象
request response session application page(相当于this) out(和response.getWriter()的区别) config
exception(表示异常的隐藏对象,只能在设置为 isErrorPage="true" 的错误页面才可以使用)
pageContext (域对象,该域对象只能在jsp中使用,不能在servlet中使用) 在实际开发中不会用到,在对jsp的扩展中会使用它。
*域对象 四个域对象中范围最小,只存在于当前页面。
*代理其它域对象功能
pageContext.setAttribute("x", "X");[向pageContext中存储数据]
pageContext.setAttribute("x", "XX", PageContext.REQUEST_SCOPE);[向request中存储数据]
pageContext.setAttribute("x", "XXX", PageContext.SESSION_SCOPE);[向session中存储数据]
pageContext.setAttribute("x", "XXXX", PageContext.APPLICATION_SCOPE);[向application中存储数据]
Object findAttribute(String name):依次在page、request、session、application范围查找名称为name的数据,如果找到就停止查找。
*获取其他内置对象 1个顶9个
补充: out 和response.getWriter()的区别:
out 的缓冲区是jspWriter response.getWriter 缓冲区是printWriter 。
输出到浏览器的顺序是 printWriter缓冲区+jspWriter缓冲区 。 jspWriter缓冲区会先刷新到printWriter缓冲区
五 jsp三大指令
<%@ page attr1=”” attr2=”” %>
* page中常用属性名: import 导包 可以出现多次 language="java" 表示jsp可以写的语言
pageEncoding="utf-8" 这个编码表示jsp和转换后的servletjava文件保存在硬盘上的格式
contentType=”text/html;charset=utf-8” 这个编码表示浏览器打开jsp使用的编码
(其中pageEncoding和contentType二个属性只需要设置其中一个就行,另外一个会自动赋一样的值)
errorPage 可以用来设置出现错误统一转发的页面 isErrorPage 表示本jsp是专门处理错误的页面,可以获得exception隐藏对象
在实际工作中,通过在web.xml中设置全局的错误页面 error-page,来进行页面错误的提示。
<%@ taglib %> 可以用来导入第三方标签库
*<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ include %> 静态包含 二个jsp先合并 然后在转化为java文件
* 属性: file <%@include file=”b.jsp”%>
应用场景 : 页头和页脚页面,可以通过静态包含引入,不用在每个jsp中都编写。
六 jsp七大动作
<jsp:include page="xxx.jsp"> 动态包含
动态包含与静态包含的区别
A 动态包含会生成多个servletjava文件。静态包含只会生成一个servletjava文件
B 动态包含是在最后将每个jsp的显示结果进行合并, 静态包含是在页面没转换之前就对页面进行了合并。
<jsp:forward page="xxx.jsp"> 请求转发 与request.getRequestDispatcher.forward() 类似
<jsp:param value="zhangSan" name="username"> 用在<jsp:include> <jsp:forward>中间来传递参数
<jsp:useBean>
*<jsp:useBean id="user1" class="cn.itcast.domain.User" scope="page"/>
首先在指定的scope中根据ID值查找是否有对象,如果有则返回,如果没有则创建该对象,并将对象放在scope中。scope可以是jsp中的4个域
<jsp:setProperty> 设置属性值
<jsp:getProperty> 获取属性值
<jsp:plugin>
七 jsp的注释
<%-- --%> 针对<%%> 进行注释
<!-- --> 针对html进行注释
java中的三种注释 在<% %> 中针对java代码进行注释
快捷键 CTRL+SHIRT+/
会话跟踪机制之cookie
一 概述
cookie是服务器发送给浏览器的东西,浏览器每次请求会带上cookie给服务器端。 cookie是一对键值对的形式。是由http协议制定 ,不能跨浏览器。
实现原理:
服务器端通过addheader(Set-Cookie) 来添加cookie的相应头
客户端每次请求 通过请求头cookie带上cookie的信息
二 API
Cookie cookie = new Cookie(String name, String value);
cookie.getName() cookie.getValue()
cookie.setMaxAge(int maxAge)
cookie.setPath(String path)
cookie.setDomain(String domain)
应用于二级域名之间共享cookie例如:www.baidu.com www.zhidao.baidu.com www.map.baidu.com
cookie.setDomain(".baidu.com");
cookie.setPath("/"); path必须设置成/
void response.addCookie(cookie);
Cookie[] cookies = request.getCookies(); 通常提供cookie的工具类来根据name查找cookie
Cookie中存储中文,通过URLEncoder 先对中文进行编码 然后获取时通过URLDecoder进行解码 。
三 cookie的生命周期
根据cookie的maxage不同有如下区别。 默认不设置maxage ,是存在浏览器内存中,浏览器关闭则消失 叫会话cookie
maxage> 0 表示存在与客户端硬盘中多长时间 。 参数以秒单位 叫持久化cookie
maxage<0 表示cookie存在与客户端浏览器内存中,浏览器关闭则消失
maxage = 0 表示清除浏览器中该cookie
四 cookie的路径
服务器端发送给客户端的cookie不设置path 会有一个默认路径值。 默认情况举例如下:
http://localhost:8080/helloworld/Aservlet 则路径值是 /helloworld/Aservlet
http://localhost:8080/helloworld/demo/a.jsp 则路径值是 /helloworld/demo
如果不设置path,则cookie的路径是添加cookie的servlet或者jsp的当前路径。
浏览器每次请求服务器会带上cookie。带那些cookie 是根据请求路径是否包含cookie的路径值。举例如下
本地cookie的路径值 是 /helloworld/Aservlet 则 请求 /helloworld/Aservlet/Bservlet 则会带上该cookie
如何删除cookie
Cookie cookie = new Cookie("要删除的cookie的名字",null);
cookie.setPath() 设置相同的path
cookie.setMaxAge(0);
response.addCookie(cookie);
通常我们设置path为项目名称。
Jseesionid该cookie的路径是 /项目名称 并且该cookie的生命周期默认存在于浏览器内存中。
五 cookie应用场景
登录记住用户名
记录浏览过的商品信息
会话跟踪机制之session
一 概述
服务器端会话;
存在范围:针对一次会话,多次请求;
第一次调用request.getSession()创建;
是javaweb提供 ;
依赖于cookie,后者url重写。
二 sessionAPI
session域对象的getAttribute setAttrbute removeAttribute
getID 获取sesison的ID sesison的ID是32为UUID
invalidate() 使session失效
isNew() 判断session是不是新的 第一次请求时 返回true
三 session原理
request.getSession() 方法执行顺序:
1 先判断cookie中是否有jsessionid , 如果没有,则创建session 并将jsessionid写回浏览器
2 如果cookie中有jessionid,则在服务器端查找该jessionid对应的session,如果没查到,则创建session并将新生成的jessionid写回浏览器
3 如果cookie中有jessionid,并在在服务器端能找到该jessionid对应的session,则不再创建session。
request.getSession()和 request.getSesion(true) 用法一样。
request.getSession(false) 表示如果服务器没有sesion则返回null 只有当cookie中有jessionID并且能查到对应的session时,才返回session
注意:如果浏览器禁用了cookie,则request.getSession() 方法在cookkie中没找到,会继续在连接或者表单的请求参数中去查找jsessionid。
这种情况下就要用到URL重写技术。通过response.encodeURL() 对所有连接进行编码,该方法会自动识别cookie中是否有jsessionid,如果有则不
添加;jsessionid参数, 如果没有,则添加;jsessionid参数。
三 销毁session的三种方式
1 sesison.invalidate()
2 服务器非正常关闭 如果服务器正常关闭,会将sesison序列化到硬盘,等服务器重启时,会将session反序列化到内存中。
3 session超时
sesison的最大不活动时间配置,单位是分钟。
在web.xml中通过如下配置实现,默认tomcat的web.xml中配置的是30分钟,可以通过在我们的项目web.xml中进行覆盖。
<session-config>
<session-timeout>15</session-timeout>
</session-config>
四 session应用场景
用户登录保存登录信息
购物车
验证码
|