1,Web四大请求域和九大内置对象
javaWeb jsp (四大请求域)
1,pageContext 只能在当前jsp页面中访问
2,request 请求域,只要是同一请求对象。都能访问到请求域中 的值。在做请求转发操作的时候吗,服务器是将原始的请求对象,原封不动的转发给目标页面,目标页面也是可以服务请求域中的数据的。
3,session 会话级别 打开浏览器,发送请求,表示开启了跟服务器的一次会话,关闭浏览器会话结束,session域中的数据也会清除。(只要浏览器不关闭,不管发送多少次请求,都时可以从session中拿到数据的。)
4,application 服务器级别,只要服务器不关闭,里面的数据永久有效。(服务器关闭,application中 的数据也会被清空。)
javaWeb jsp(九大内置对象)
1,pageContext
2,request
3,session
4,application
5,page
6,out
7,response
8,config
9,exception
2,请求转发和重定向的区别
1,
请求转发的时候,地址栏不会发生改变。
重定向的地址栏会发生改变。
2,
请求转发是服务器行为,
重定向时浏览器(客户端)行为 。
3,
请求转发只发送一次请求,使用的是同一request对象
重定向发送两次请求,使用的不是同一request对象
4,
使用请求转发,可以访问到请求域中的数据
使用重定向是无法 访问到请求域中的数据的
5,(相同点)
请求转发和重定向后面都可以使用?进行传值。使用request.getParameter去接收。
6,
请求转发的效率要高一些
重定向的效率要低一些
7,
请求转发只能在当前项目下
重定向可以 定位到任意项目(包括一些跳转页面)
8,
forward 是在服务器端的跳转,就是客户端的一个请求发给服务器 ,服务器直接将请求相关的参数的信息原封不动的传递到该服务器的其他jsp或servlet去处理。
sendredirect是在客户端的跳转,服务器会返回给客户端一个响应报头和新的URL地址,原来的参数什么的信息如果服务器端没有特别处理就没有了,浏览器会访问新的URL所指的servlet或jsp。
3,session和cookie
一,cookie
1,服务器创建好一个cookie对象
Cookie c1=new Cookie(“user”,“tom123”);
如果当前的cookie对象,没有调用setMaxAge()方法那么默认cookie时存在浏览器的。浏览器关闭,这个cookie也会随之清除。
2,将cookie发送给浏览器
c1.setPath("/")
c1.setMaxAge(60);
浏览器拿到响应数据后,会把数据存在内存中,只要没过设置的时间,就会一直存在
只要cookie存在,以后发出的任意请求,都会在请求头中,携带cookie信息发送给服务器
二,session
1,请求访问,会创建一个session对象
session 671673bb() sessionid:345A5FE449B09BF7…
每一个session都有一个默认的有效期,有效期就是30分钟。服务器响应的时候,就会写入一个cookie,这个cookie的name就是JSESSIONID,这个cookie的值就是session的值sessionid:345A5FE449B09BF7…。
(前提不关闭浏览器)
第二次再去请求。此时 请求的参数中会携带cookie,这个cookie的name和值就是上面的cookie的name 和值sessionid:345A5FE449B09BF7…
服务器 会接受到你的cookie知道你的cookie的值,此时回去内存中寻找跟你匹配的session对象。所以会找到 671673bb()这个session对象 返回给你
2,HttpSession的生命周期
1),什么时候创建HttpSession对象
1,对于jsp:是否浏览器访问服务端的任何一个jsp,服务器都会立即创建 一个HttpSession对象呢? (不一定)
<1>若当前jsp时客户端访问的当前文本应用的第一个资源且 JSP 的 page 指定的 session 属性值为 false, 则服务器就不会为 JSP 创建一个 HttpSession 对象; (设置页面为 session=“false” ,并且没有 手动的创建session对象的时候。此时上面的话才成立 。)
<2>若当前 JSP 不是客户端访问的当前 WEB 应用的第一个资源,且其他页面已经创建一个 HttpSession 对象,则服务器也不会为当前 JSP 页面创建一个 HttpSession 对象,而回会把和当前会话关联的那个 HttpSession 对象返回给当前的 JSP 页面 (JSESSION已经在第二次请求的时候被带过来给服务器了,所以说第二次请求不会创建新的HttpSession对象,而是会把老的session对象返回给你。)
2,对于 Serlvet: 若 Serlvet 是客户端访问的第一个 WEB 应用的资源,
则只有调用了 request.getSession() 或 request.getSession(true) 才会创建 HttpSession 对象
2)page 指令的 session=“false“ 到底表示什么意思?
> 当前 JSP 页面禁用 session 隐含变量!但可以使用其他的显式的 HttpSession 对象
3). 在 Serlvet 中如何获取 HttpSession 对象?
(
request.getSession(true) 有就用原来的session没有就创建。
request.getSession(false) 有就用没有就是null。
request.getSession()跟request.getSession(true) 是等价的。
)
4). 什么时候销毁 HttpSession 对象:
1,直接调用 HttpSession 的 invalidate() 方法: 该方法使 HttpSession 失效
2,服务器卸载了当前 WEB 应用.
3,超出 HttpSession 的过期时间.
> 设置 HttpSession 的过期时间: session.setMaxInactiveInterval(5); 单位为秒
> 在 web.xml 文件中设置 HttpSession 的过期时间: 单位为 分钟.
<session-config>
<session-timeout>30</session-timeout>
</session-config>
4, 并不是关闭了浏览器就销毁了 HttpSession.
4,EL表达式C标签
1,导入jar包 。
2个 。 2. 导入c标签库 固定的话 。(只要页面想要使用c标签 必须加上)
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
2,
var 表示 存储test中的结果 。 把true的值 存储到c1变量中
<c:if test="${name=='tom123'}" var="c1" scope="request">
如果test属性中的结果为true ,那么我会显示到页面上。
${sessionScope.c1}
</c:if>
${requestScope.c1}
test中需要写el 表达式 ''
test = "true false"
var 表示test属性返回值存储在var属性中 。 var="c1"
c1= test的结果
scope 可以指定c1变量存储的位置 。session .
<c:choose>
<c:when test="${i==1}">
第一种情况 。
</c:when>
<c:when test="${i==2}">
第二种情况 。
</c:when>
<c:otherwise>
其他情况。
</c:otherwise>
</c:choose>
<%
pageContext.setAttribute("name", "tom123");
//跟下面的写法 作用是一样的。
pageContext.setAttribute("name", 1,3);//等价写法。
%>
<c:set var="name" value="${i}" scope="session">
</c:set>
<c:set var="root" value="${pageContext.request.contextPath }" scope="session">/c:set
${root}
<%
Person p = new Person("tom123",12);
session.setAttribute("user", p);
%>
<!--target 给哪一个对象设置属性 。property name -->
<c:set target="${user }" property="name" value="柳岩" ></c:set>
${user.name}
<hr>
<c:out value="${haha}" escapeXml="" default="没有数据"></c:out>
<hr>
<!--
escapeXml 当设置成true 默认会把你输出的内容当成一个字符串,而不是按照html语法去解析。
escapeXml
-->
<c:out value="<a href='http://www.baidu.com'>超链接</a>" escapeXml="false" default="没有数据"></c:out>
<hr/>
<%
List list = new ArrayList();
list.add("香蕉1");
list.add("香蕉2");
list.add("香蕉3");
list.add("香蕉4");
list.add("香蕉5");
list.add("香蕉6");
list.add("香蕉7");
list.add("香蕉8");
request.setAttribute("list", list);
%>
<!-- items 表示你要遍历的对象 。 var="l" 给里面的每一个元素取一个别名 。 begin end指定下标 。
step="2" 指定间隔 基本用不着。
varStatus="s" 其实s 对象 就封装了 循环过程中的一些状态信息。
-->
<c:forEach items="${list}" var="l" varStatus="s">
${l},${s.index},${s.count},${s.first},${s.last}<br/>
</c:forEach>
<hr>
<%
Map map = new HashMap();
map.put("addr1", "东京");
map.put("addr2", "东莞");
map.put("addr3", "巴黎");
map.put("addr4", "东南亚");
pageContext.setAttribute("map", map);
%>
<!-- items 条目 名目 项目 。 -->
<c:forEach items="${map}" var="m">
${m.key} + ${m.value}
</c:forEach>