一。Session: 服务器中的会话技术
存储数据 - 域对象
域对象范围: 一次会话
-
获得session对象:
// 当客户端第一次调用该方法, 服务器会创建一个session对象并返回
// 当客户端再次调用该方法, 服务器直接将之前的session返回
request.getSession();服务器第一次为客户端创建Session对象的时候, 会分配一个JSESSIONID编号
并且将 JSESSIONID 传递给客户端的cookie进行保存一次会话结束, 下次会话想要继续访问之前的session,
需要将 JSESSIONID 进行持久化 -
session的生命周期:
创建: 客户端第一次调用getSession()方法时
销毁: 1.手动销毁 session.invalidate();
2.服务器非正常关闭
注:服务器正常关闭, session不会消失, 会变成文件保存在本地磁盘 - session钝化
3.超时 超时在web.xml配置文件写
《session-config》
《session-timeout》几分钟《/session-timeout》
《/session-config》 -
域对象:
ServletContext: 服务器启动期间
session: 一次会话
request: 一次请求
pageContext: page域
public class SessionServlet1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//session要依赖cookie将cookie带给客户端来分辨session数据是否要被客户端获取
//获得session对象
HttpSession session = request.getSession();//创建出来就会有JSESSIONID
//获取session对象的id
String jsession=session.getId();
//3.创建一个一摸一样的cookie给客户端用
Cookie cookie=new Cookie("JSESSIONID",jsession);//cookie
cookie.setPath(request.getContextPath());//设置cookie路径也要和session相同
//4.设置cookie持久化
cookie.setMaxAge(60*10);
//5.覆盖原来的cookie,即带给客户端
response.addCookie(cookie);//JSESSIONID=1CD3EF6DCE420E7131543C2982F70E37
//6.向session中存数据
session.setAttribute("name","zhangsan");
}
------------------------------------------------
//获取session对象
HttpSession session = request.getSession();
String sessionname=(String) session.getAttribute("name");
System.out.println(sessionname);
response.getWriter().println(sessionname+";;;"+session);
------------------------------------------------
HttpSession session = request.getSession();
//销毁session
//1.手动销毁
session.invalidate();
/*
2.超时自动销毁。在配置文件设置
<session-config>
<session-timeout>1</session-timeout>//单位分钟
</session-config>
*/
//3.服务器非正常关闭会销毁。但是正常关闭不会销毁。正常关闭数据存放在本地硬盘,当重新开启服务器,数据又到内存中去
二。JSP
1.jsp脚本和注释
-
.jsp文件第一次运行之前会先翻译成xx_jsp.java文件, 再编译成xx_jsp.class。jsp 本质就是Servlet
-
jsp脚本和注释:
<% 普通java代码 %>: 翻译到service方法中
<%=表达式 %>: 翻译到service方法中, out.print(表达式);
<%! 声明语句 %>: 翻译成 xx_jsp 类的成员html注释 : JSP源码 java代码 前端页面
// Java注释 : JSP源码 java代码
<%-- JSP注释 --%> : JSP源码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<% int a=0; for(a=0;a<10;a++){%>
<h2><%= a %></h2>
<%
}
%>
<%= a=3%>
<%! public void get(int m){};//声明语句,翻译成类的成员(成员变量、成员方法)%>
<!--html注释-->
<%-- jsp注释 --%>
</body>
</html>
-
JSP指令
-1.page指令:
page: <%@ page 属性 %>
contentType: response.setContentType(“text/html;charset=utf-8”)
language: java语言
session: true-默认
pageEncoding: response.setContentType(“text/html;charset=utf-8”)
buffer: out缓冲区大小, 默认8kb, 设置关闭=none
extends: 继承 HttpJspBase
import: 导包
isErrorPage: 是否是错误页面, 默认false
errorPage: 错误页面, 当前页面出现异常后转发到的页面
isELIgnored: 是否忽略EL表达式, 默认"false"2.include指令
include: <%@ include%> 静态包含
引入文件, 属性file=“不加虚拟目录uri”
3.taglib指令
taglib: <%@ taglib%> 标签库
uri:jar路径 prefix:前缀
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page session="true" %>
<%@page buffer="8kb" %>
<%@page errorPage="/jsp1.jsp" %>
<html>
<head>
<title>jsp指令</title>
</head>
<body>
aaaaa
<% session.setAttribute("name","zhangsan");%>
<% List<String>list=new ArrayList<>();%>
<%out.write("cccc");%>
<%out.print("dddd");%>
<% response.getWriter().write("eeee");%>
<%--<% int a=1/0; //生成一个错误 %>--%>
<%--
jsp属性out有缓冲区(out的类型:JspWriter),会在缓冲完后再加到response缓冲区中。可以通过设置buffer="none"将数据直接加到respons缓冲区
<%@page errorPage="/jsp1.jsp"%> 设置errorPage属性会在页面出错后跳转到那个页面
import属性用来导入java的包
--%>
<%@include file="/includeB.jsp"%>
</body>
</html>
-
jsp属性out有缓冲区(out的类型:JspWriter),会在缓冲完后再加到response缓冲区中。可以通过设置buffer=“none"将数据直接加到respons缓冲区
<%@page errorPage=”/jsp1.jsp"%> 设置errorPage属性会在页面出错后跳转到那个页面
import属性用来导入java的包
-
JSP内置对象9个: 在<% %>中可以直接使用的对象
HttpServletRequest request
HttpServletResponse response
PageContext pageContext
pageContext.findAttribute(“name”)
从 page->request->session->application 按顺序搜索name对应的值, 直到找到为止, 并返回
HttpSession session: session = true
ServletContext application
ServletConfig config
JspWriter out
Object page = this
Throwable exception: isErrorPage = true
<body>
<% pageContext.setAttribute("name","zhansan",PAGE_SCOPE);%>
<% pageContext.setAttribute("name", "lisi",REQUEST_SCOPE);%>
<% pageContext.setAttribute("name", "wangwu",SESSION_SCOPE);%>
<% pageContext.setAttribute("name", "hongqi",APPLICATION_SCOPE);%>
<!--
1. pageContext是一个域对象
2. pageContext可以向指定的其他域中存取数据
-->
<%= pageContext.getAttribute("name",PAGE_SCOPE)%>
<%= pageContext.getAttribute("name",REQUEST_SCOPE)%>
<%= pageContext.getAttribute("name",SESSION_SCOPE)%>
<%=pageContext.getAttribute("name",APPLICATION_SCOPE)%>
</body>
----------------------------------------------
<body>
<%= pageContext.getAttribute("name",PAGE_SCOPE)%>
<%= pageContext.getAttribute("name",REQUEST_SCOPE)%>
<%= pageContext.getAttribute("name",SESSION_SCOPE)%>
<%=pageContext.getAttribute("name",APPLICATION_SCOPE)%>
<!--换了一个应用,只能访问到session会话和application-->
<!--findAttribute依次从pageContext域,request域,session域,application域中获取属性,在某个域中获取后将不在向后寻找 -->
<%= pageContext.findAttribute("name") %>
</body>
-
JSP动态标签:
意义-减少java脚本的书写
<jsp:include page=“uri”> 动态包含
<%@ include file=“uri” %> 静态包含<jsp:forward page=“uri”/>页面转发
<!--jsp标签之 页面包含 和 页面转发-->
<jsp:include page="pageContext1.jsp"/>
<jsp:forward page="PageContext2.jsp"/>
三。EL
- expression language 对象属性导航语言 OGNL
作用: 为了取代get方法
${对象.属性} - 对象.get属性()
<% // 模拟向域中存值
request.setAttribute("name", "zhangsan");
Cookie cookie1 = new Cookie("user", "tom");
Cookie cookie2 = new Cookie("password", "12345");
response.addCookie(cookie1);
response.addCookie(cookie2);
%>
<%-- <%=request.getAttribute("name")%> --%>
${requestScope.name}<br>
<%-- request.getParameter("username") --%>
${param.username} -- ${param["username"]}
<br>
<%-- request.getHeader("user-agent") --%>
${header["user-agent"]}<br>
<%-- Cookie[] cookies = request.getCookies()其中name=user的cookie对象
for(int i ) {
cookies[i].getName() == "user"
cookies[i].getValue() -> tom
}
cookie.user -- Cookie对象
--%>
${cookie}<br>
${cookie.user.name} --- ${cookie.user.value}
-----------------------------------------------
<% // 模拟向域中存数据
request.setAttribute("name", "张三");
session.setAttribute("name", "李四");
// 存储User对象
User user = new User();
user.setId(1);
user.setUsername("tom");
pageContext.setAttribute("user", user);
// 存储List<String>集合
List<String> strList = new ArrayList<>();
strList.add("小王");
strList.add("小赵");
strList.add("小谢");
strList.add("小张");
request.setAttribute("strList", strList);
// 存储List<User>集合
List<User> userList = new ArrayList<>();
userList.add(new User(1, "谢逊"));
userList.add(new User(2, "张无忌"));
userList.add(new User(3, "赵敏"));
userList.add(new User(4, "张翠山"));
request.setAttribute("userList", userList);
// 存 Map<String , String>
Map<String, String> strMap = new HashMap<>();
strMap.put("谢逊", "金毛狮王");
strMap.put("张无忌", "九阳神功");
strMap.put("赵敏", "郡主");
strMap.put("张翠山", "打酱油");
request.setAttribute("strMap", strMap);
%>
<%-- pageContext.findAttribute("name") --%>
${name}<br>
${user.username}<br>
<%-- strList.get(3) --%>
${strList[3]}<br>
<%-- List<User> list = pageContext.findAttribute("usrList")
User user = list.get(2)
user.getUsername()
--%>
${userList[2].username}<br>
<%-- strMap.get("张无忌") --%>
${strMap["张无忌"]}
-------------------------------------------------
<!--EL获得Map<String, List<User>>的值-->
<% List<User> userList = new ArrayList<>();
List<User> userList1 = new ArrayList<>();
Map<String, List<User>> listMap = new HashMap<>();
userList.add(new User(1, "欧阳锋"));
userList.add(new User(2, "黄药师"));
userList.add(new User(3, "洪七"));
userList.add(new User(4, "张无忌"));
listMap.put("map", userList);
userList1.add(new User(5, "赵敏"));
userList1.add(new User(6, "张翠山"));
listMap.put("map2",userList1);
request.setAttribute("pemap", listMap);
%>
<!-- [User{id=1, username='欧阳锋'}, User{id=2, username='黄药师'},
User{id=3, username='洪七'},User{id=4, username='张无忌'}]-->
${pemap.map}<br>
<!--User{id=1, username='欧阳锋'}-->
${pemap.map[0]}<br>
<!--欧阳锋-->
${pemap.map[0].username}<br>
<!--1-->
${pemap.map[0].id}<br>
${pemap.map2}<br>
${pemap.map2[1].username}<br>
${pemap.map2[1].id}<br>
路径中不加虚拟目录:
1.转发
2.errorPage
3.include中file属性