JAVAWEB开发之Session的追踪创建和销毁、JSP详解(指令,标签,内置对象,动作即转发和包含)、JavaBean及内省技术以及EL表达式获取内容的使用

 Session的追踪技术

已知Session是利用cookie机制的服务器端技术,当客户端第一次访问资源时 如果调用request.getSession() 就会在服务器端创建一个由浏览器独享的session空间,并分配一个唯一且名称为JSESSIONID的cookie发送到浏览器端,如果浏览器没有禁用cookie的话,当浏览器再次访问项目中的Servlet程序时会将JSESSIONID带着,这时JSESSIONID就像唯一的一把钥匙  开启服务器端对应的session空间,进而获取到session中的内容(Session没有失效的情况下)。之所以第一次访问会创建与浏览器对应的一个Session空间,是因为第一次访问浏览器是不会携带对应的JSESSIONID,凡是不带有JSESSIONID的访问 调用request.getSession()方法都会为客户端创建一个session空间。
  当浏览器客户端禁用了cookie之后,浏览器端就无法保存JSESSIONID,就无法使用session。不是说服务器端的Session空间丢失了,而是在服务器端找到打开对应Session空间的钥匙(JSESSIONID)丢失了。这时就需要使用Session的追踪技术。
  session的销毁:
(1)非正常关闭服务器。注意:非正常关闭服务器是不会序列化session到本地的。会导致session丢失。
(2)手动正常关闭服务器。不会导致session丢失(正常关闭服务器后,会在服务器中将session存储起来,再次启动服务器的时候 会被重新加载到内存中)
(3)session的过期,默认是30分钟(在不关闭浏览器的情况下) 可以在服务器的web.xml文件中进行设置
         <session-config>
<session-timeout>30</session-timeout>
</session-config>
    注意:关闭浏览器 后重新访问无法获取session内容 并不是因为session被销毁 而是session只是一次会话,其客户端的JSESSIONID是保存在内存里的,关闭浏览器后JSESSIONID在内存里被释放。
(4)调用session.invalidate() 手动销毁session 。
示例如下:
  SessionDemo1.java    路径:/session1
public class SessionDemo1 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// session域对象
		HttpSession session = request.getSession();
		session.setAttribute("username", "小风");
		// DD64756D56885AF87E883B887BF77E6C		jsessionid=DD64756D56885AF87E883B887BF77E6C
		System.out.println(session.getId());
		
		response.sendRedirect("/day12/session2");
		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

SessionDemo2.java  /session2
package cn.itcast.session;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class SessionDemo2 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 手动传入jsessionid=DD64756D56885AF87E883B887BF77E6C	
		HttpSession session = request.getSession();
		String username = (String) session.getAttribute("username");
		
		response.setContentType("text/html;charset=UTF-8");
		response.getWriter().write("<h4>访问到了..."+username+"</h4>");
		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}




正常关闭服务器


重新启动服务器 session又被反序列化到内存中


禁用浏览器的cookie之后


重新访问:


发现cookie被浏览器被禁用之后,无法获取session空间的内容。可以使用cookie追踪技术,就是在跳转路径后加上;jsessionid=DE3D5641D0D1D248D66C7A3D67E47F8E 访问路径即http://localhost/day12/session2;jsessionid=DE3D5641D0D1D248D66C7A3D67E47F8E 效果如下:

session的域对象:
ServletContext:代表整个web应用,数据库连接
session:一次会话,存放个人信息
request:一次请求,存放错误处理

JSP设置与页面的注释

(1)设置JSP文件的打开方式(以便快速打开)window -- 选项 -- General -- Editors -- 文件关联 -- *.jsp -- 选择MyEclipse JSP Editor -- default

(2)设置JSP的编码(用于显示中文)window -- 搜索JSP -- 找到JSP -- 选择UTF-8 -- OK


JSP页面的注释:
(1)HTML的注释 <!--  -->  JSP文件的阶段存在,在翻译成Java文件后也存在,在页面也存在。
(2)Java的注释     JSP文件的阶段存在,在翻译成Java文件也存在,在页面不存在。
     <%
          //       单行
          /**/    多行
         /**
          *        文档注释
          */
     %>
(3)JSP的注释   <%--  JSP的注释  --%>   只存在于JSP文件阶段。

JSP指令元素

功能:用于指示JSP执行某些步骤 或用于指示JSP表现特定行为。
语法格式:<%@ directive [attribute="value"]*%>   即 <%@  指令元素  属性名=属性值  %>
分类:page指令标记、include指令标记、taglib指令标记

page指令标记

(1)page属性包含在" <%@ page " 和 "%>" 之间。
(2)这些属性可以单独使用,也可以几个或多个同时使用。
(3)在JSP页面中,只有import可以出现多次,其他属性都只能出现一次。
page指令属性:
  • language:声明使用脚本的种类,即JSP文件运行嵌入的语言。目前只支持Java一种语言(不需要改变)例如:language="java"
  • extends:JSP翻译成Servlet的Java文件时,Servlet继承的类(不需要改变)例如:extends="src.class"
  • session:例如session="true",指定一个Http会话是否使用session对象,默认值是true 可以直接使用session。设置成false不能直接使用session(如果设置成false 要想获取session  只能使用Java代码  <%  HttpSession session2 = request.getSession()  %>)
  • import: 用于导入Java包或类的列表 (可以使用后多次  import="java.util.Date")
  • buffer:指定JSP对客户端输出缓冲区的大小,默认是8kb  (buffer="8k")
  • autoFlush:设置默认自动刷新缓冲区(不需要改变),如果buffer溢出,设置成true时正常输出,设置成false时 出现异常 (autoFlush="true")
  • errorPage: 处理异常事件时调用的JSP页面 ,指定错误页面 (errorPage="error.jsp")
  • isErrorPage:设置此页是否可以为其它页的errorPage目标 (设置值为true,可以是exception对象,设置成false不能使用exception对象)
  • contentType:定义JSP页面响应的MIME类型(指定服务器端输出所有内容采用的编码 contentType="text/html,charset=utf-8")
  • pageEncoding:JSP页面字符编码,其优先权高于contentType(JSP翻译成Servlet文件时采用的编码 pageEncoding="gb2312")
  • isELIgnored:用于指定EL(表达式语言)是否被忽略。true则忽略,false则计算表达式的值 (isELIgnored="false")
 重点:session  import contentType  pageEncoding  isELIgnored
配置全局的错误页面
在项目中的web.xml中进行配置:
<error-page>
    <error-code>404</error-code>
    <location>/404.jsp</location>
<error-page>
<error-page>
     <error-code>500</error-code>
     <location>/500.jsp</location>
</error-page>
注意:所有的请求出现错误后 都会跳转到对应的错误页面。errorPage属性的优先级大于全局错误页面的优先级。如果一个JSP的page指令属性后指定了errorPage属性,出现了错误的话,会跳转到errorPage指定的页面。

在WebRoot下新建jsp的文件夹,在jsp文件夹下新建demo.jsp、error.jsp, 在WebRoot根目录下下新建全局的错误页面404.jsp、500.jsp 进行测试page指令有关的属性
error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<h3>亲,服务器正在维护!!</h3>

<%=exception.getMessage() %>	


</body>
</html>

404.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<h3>亲,您访问的资源恋爱了,不在服务区!!</h3>
	
</body>
</html>
500.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<h3>亲,服务器正在维护,这回是真的维护!!</h3>
	
</body>
</html>

demo.jsp
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="true" buffer="8kb" autoFlush="true" 
    errorPage="/jsp/error.jsp" isELIgnored="false"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title 
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值