jsp-session

jsp原理–其实是一种特殊的servlet
*>当jsp页面第一次被访问时,服务器会把jsp编译成java文件(这个java其实是个servlet类)
*>然后再把java编译成.class
*>然后再创建该类对象
*>最后调用它的service方法
*>第二次请求同一jsp时,直接调用service方法
*在tomcat的work目录下可以找到jsp对应的.java源代码
*查看jsp对应java文件-----java脚本和html

jsp注释:<%-- … --%>

Cookie:服务器存到客户端的东西
Cookie的用途
*服务器使用Cookie来跟踪客户端状态
*保存购物车(购物车的商品不能使用request保存,因为它是一个用户向服务器发送的多个请求信息)
*显示上次登录名(也是一个用户,多个请求)

JavaWeb中使用Cookie
*原始方式
*>使用response发送set-Cookie响应头
*>使用request获取Cookie请求头
*便捷方式
*>使用response.addCookie()方法向浏览器保存Cookie
*>使用request.getCookies()方法获取浏览器归还的Cookie

例:一个jsp保存cookie,a.jsp
另一个jsp获取浏览器归还的cookie,b.jsp

a.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'a.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    <h1>保存</h1>
    <%
    	Cookie cookie1 = new Cookie("aaa","AAA");
    	response.addCookie(cookie1);
    	
    	Cookie cookie2 = new Cookie("bbb","BBB");
    	response.addCookie(cookie2);
    %>
  </body>
</html>

b.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'b.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    <h1>获取cookie</h1>
    <%
    	Cookie[] cookies = request.getCookies();
    	if(cookies != null){
    		for(Cookie c : cookies){
    			out.print(c.getName()+"="+c.getValue()+"<br>");
    		}
    	}
    %>
  </body>
</html>

Cookie详解
*Cookie不只有name和value两个属性
*Cookie的maxAge(掌握):Cookie的最大生命,即Cookie可保存的最大时长,以秒为单位,例如Cookie.setMaxAge(60)表示这个Cookie会被浏览器保存到硬盘上
*> maxAge>0:浏览器会把Cookie保存到客户机硬盘上,有效时长为maxAge的值决定
*>maxAge<0:Cookie只在浏览器内存中存在,当用户关闭浏览器时,浏览器进程结束,同时Cookie也就死亡了
*> maxAge =0:浏览器会马上删除这个Cookie

Cookie的path
*Cookie的path并不是设置这个Cookie在客户端的保存路径
*Cookie的path由服务器创建Cookie时设置
*>当浏览器访问服务器的路径时,需要归还哪些Cookie给服务器?这由Cookie的path决定
*>浏览器访问服务器的路径,如果包含某个Cookie的路径,那么就会归还给这个Cookie

HttpSession

Servlet三大域对象:request、session、application(ServletContext())

HttpSession的作用
*会话范围:会话范围是某个用户从首次访问服务器开始,到该用户关闭浏览器结束
*>会话:一个用户对服务器的多次连贯性请求,所谓连贯性请求,就是该用户多次请求中间没有关闭浏览器
*服务器会为每一个客户端创建session对象,session就好比客户在服务器端的账户,他们被服务器保存到一个Map中,这个Map被称为session加粗样式缓存
*>Servlet中得到session对象,HttpSession session = request.getSession();
JSP中得到session对象:session是jsp内置对象之下,不用创建就可以直接使用
*>session域相关方法:
void setAttribute(String name,Object value)
Object getAttribute(String name)
void removeAttribute(String name)

案例
演示保存用户登录信息
*案例相关页面和Servlet
login.jsp:登录页面
succ1.jsp:只有登录成功才能访问的页面
succ2.jsp:只有登录成功才能访问的页面
loginServlet:校验用户是否登录成功
*各页面和Servlet内容
login.jsp:提供登录表单,提交表单请求LoginServlet
LoginServelt:获取请求参数,校验用户是否登录成功
失败:保存错误信息到request域中,转发login.jsp(login.jsp显示request域中的错误信息)
成功:保存用户信息到session域中,重定向到succ1.jsp页面,显示session中用户信息
*>succ1.jsp:从session域中获取用户信息,如果不存在,显示您还没登录
*>succ2.jsp:从session域获取用户信息,如果不存在,显示还没登录

LoginServlet

package cn.itcast.servlet;

import java.io.IOException;
import java.io.PrintWriter;

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

public class LoginServlet extends HttpServlet {
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		/*
		 * 1、获取表单数据
		 */
//		获取
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		/*
		 * 校验用户名和密码是否正确
		 */
		if(!"itcast".equalsIgnoreCase(username)){
			//登录成功
			/*
			 * 附加项:把用户名保存到Cookie中,发送给客户端浏览器
			 * 当再次打开login.jsp时,login.jsp中会读取request中的cookie,把它显示到用户名文本框
			 */
			Cookie cookie = new Cookie("uname",username);
			cookie.setMaxAge(60*60);
			response.addCookie(cookie);//保存cookie
			/*
			 * 3、保存用户信息到session中
			 * 重定向到succ1.jsp
			 */
			HttpSession session = request.getSession();//获取session
			session.setAttribute("username", username);
			response.sendRedirect("/day1011_2/session2/succ1.jsp");
		}else{
			//登录失败
			/*
			 * 失败,保存村务信息到request域中,转发到login.jsp
			 */
			request.setAttribute("msg", "用户名或密码错误");
			RequestDispatcher qr = request.getRequestDispatcher("/session2/login.jsp");//得到转发器
			qr.forward(request, response);
		}
	}

}

login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'login.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    <%--本页面提供登录表单,还要显示错误信息 --%>
    
    <h1>登录</h1>
    <%
    	/*
    	读取名为uname的Cookie
    	如果为空显示""
    	如果不为空显示值
    	*/
    	String uname="";
    	Cookie[] cs = request.getCookies();
    	if(cs != null){
    		for(Cookie c : cs){
    			if("uname".equals(c.getName())){
    				uname = c.getValue();
    			}
    		}
    	}
    %>
    <%
    	String message = "";
    	String msg = (String) request.getAttribute("msg");
    	if(msg != null){
    		message = msg;
    	}
    %>
    <font color="red"><b><%=message %> </b></font>
    <form action="/day1011_2/LoginServlet" method="post">
    	用户名:<input type="text" name="username" value="<%=uname %>"><br>
    	密   码:<input type="text" name="password"><br>
    	<input type="submit" value="登录">
    </form>
  </body>
</html>

succ1.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'succ1.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
   	<h1>succ1</h1>
   	<%
   		String username = (String) session.getAttribute("username");
   		if(username == null){
   			/*
   				1、向request域中保存错误信息,转发到login.jsp
   			*/
   			request.setAttribute("msg", "您还没登录");
   			request.getRequestDispatcher("/session2/login.jsp").forward(request, response);
   			return;
   		}
   	%>
   	欢迎欢迎,热烈欢迎<%=username %>指导工作
  </body>
</html>

HttpSession原理
*request.getSession()方法:
*其他方法
String getID():获取sessionId
int getMaxInactiveInterval():获取session可以的最大不活动时间(秒),默认为30分钟
void invalidate():让session失效,调用这个方法会使session失效,
boolean isNew():查看session是否为新。

JSP三大指令
一个jsp页面中,可以有0-N个指令
1、page–>最复杂:<%@page language=“java” info="" %>
*pageEncoding:它指定当前jsp页面的编码,就不会有乱码,在服务器要把jsp编译成.java时需要使用pageEncoding
*>contentType:它表示添加一个响应头:Content-Type
*import:导包,可以出现多次
*errorPage和isErrorPage
errorPage:当前页面如果抛出异常,那么要转发到哪一个页面,有errorPage来指定
isErrorPage:它指定当前页面是否为处理错误的页面!当该属性为True时,这个页面会设置状态码为500!而且这个页面可以使用9大内置对象中的exception

*autoFlush和buffer
*>autoFlush:指定jsp的输出流缓冲区满时,是否自动刷新!默认为true,如果为false,那么在缓冲区满时抛出异常
*>buffer:指定缓冲区大小,默认为8KB,通常不需要修改

*isELIgnored:是否忽略el表达式,默认为false,不忽略,就是支持

*基本没有
*>language:指定当前jsp编译后的语言类型,默认为java
*>isThreadSafe:当前的jsp是否支持并发访问
*>session:当前页面是否支持session,如果为false,那么当前页面就没有session这个内置对象
*>extends:让jsp生成的Servlet区继承该属性指定的类
2、include–>静态包含
*与RequestDispatcher的include()方法的功能相似
*<%@include%>它是在jsp编译成java文件时完成的,他们共同生成一个java文件,然后再生成一个class
*RequestDispatcher的include是一个方法,包含和被包含的是两个Servlet,即两个.class,他们只是把响应的内容在运行时合并
3、taglib–>导入标签库
两个属性
》prefix:指定标签库在本页面中的前缀,由我们自己来起名称
》url:指定标签库的位置
》<%@taglib prefix = “s” url="/structs-tags"%>

==================================
九个内置对象
*out:jsp的输出流,用来向客户端响应
*page:当前jsp对象,它的引用类型是Object,即真身中有如下代码:Object page = this
*config:它对应真身中的ServletConfig对象
*pageContext
*request
*response
*session
*exception
*application

1、pageContext
Servlet中有三大域,而JSP中有四大域,他就是最好一个域对象
*》ServletContext:整个应用程序
*》session:整个会话(一个会话中只有一个用户)
*》request:一个请求链
*》pageContext:一个jsp页面,这个域是在当前jsp页面和当前jsp页面中使用的标签 之间共享数据
》域对象
》代理其他域:pageContext.setAttribute(“xxx”,“XXX”,PageContext.SESSION_SCOPE)
》全城查找:pageContext.findAttribute(“xxx”):从小到大,依赖查找
》获取其他8个内置对象

================
JSP动作标签
这些jsp的动作标签,与html提供的标签有本质的区别
*动作标签是tomcat来解释执行,是在服务器端进行
*jsp:forward:转发,它与RequestDispatcher的forward一样
*jsp:include:包含,与RequestDispatcher的include方法是一样的

JavaBean
javaBean的规范:
1、必须要有一个默认的构造器
2、提供get/set方法,如果只有get方法,那么这个属性是只读属性
3、属性:有get/set方法的成员,还可以没有成员,只有get/set方法,属性名称由get、set方法来决定,而不是成员名称
4、方法名称满足一定的规范,那么它就是属性

jsp中与JavaBean相关的标签
<jsp:useBean>–创建或查询Bean
》<jsp:userBean id=“user1” class=“类” scope=“session等”> 在session域中查找名为user1的bean,如果不存在是要创建
*《jsp:setProperty》
<jsp:setProperty name = “user1” property=“username” value = “admin”>
设置名为user1的这个JavaBean的username属性值为admin
*《jsp:getProperty》
<jsp:getProperty property = “username” name=“user1”>获取名为user1的JavaBean的名为username的属性值

===================
EL表达式
1、EL是JSP内置的表达式语言
EL替代的是<%= %>,也就是说,EL只能做输出
2、EL表达式来读取四大域
*${xxx},全局查找名为xxx的属性,如果不存在,输出空字符串,而不是null
*${pageScope.xxx}${requestScope/sessionScope/applicationScope.xxx}、指定域获取属性
3、
3、EL可以输出的东西都在11个内置对象中!
param:对应参数,它是一个Map,其中key参数名,value是参数值,适用于单值的参数
paramValues:对应参数,它是一个Map,其中key参数名,value是参数值,适用于多值的参数
header:对应请求头,它是Map,其中key表示头名称,value是单个头值,使用单值请求头
headerValues:对应请求头,它是Map,其中key表示头名称,value是单个头值,使用单值请求头
*initParam
*cookie:Map《String,Cookie》类型,其中key是cookie的name,value是cookie对象
*pageContext:它是pageContest类型
${pageContext.request.}

自定义函数库
*写一个java

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值