JavaWeb学习:JSP篇

第1章 Tomcat目录结构

在这里插入图片描述

第2章 JSP的指令和动作元素

2.1 JSP注释

2.1.1.html注释(查看网页源代码会显示):

<!-- 注释内容 -->

2.1.2.JSP注释(只会在编辑JSP代码时显示):

<%-- 注释内容 --%>

jsp程序段中的注释

<%

//单行注释

/*
多行注释
*/

%>

2.2 JSP脚本元素

2.2.1.表达式及声明

1."<%  %>“叫做JSP程序段,其中写的内容会翻译在Servlet的Service方法中,在程序段中定义的变量是是局部变量,不同请求之间都有一份独立的变量定义。我们可以在”<%  %>"中定义局部变量或者调用方法,但不能定义方法。在jsp页面可以有多个脚本片段,但是多个脚本片段之间要保证结构完整。

2."<%!  %>"称作JSP声明代码,其中写的内容将来会直接翻译在Servlet类中,用来定义页面范围的变量,函数和类。JSP声明定义的变量是全局变量,不同请求之间共用一个变量定义。因为我们可以在类中定义方法和属性以及全局变量,所以我们可以在<%!%>中声明方法、属性、全局变量。

3."<%=  %>“称作JSP表达式,用于将已经声明的变量或者表达式输出到网页上面。
  
4.直接写在jsp页面中的代码称作模板元素,将来会Servlet的Service方法中的out.print(”___")中,作为输出内容。

2.3 JSP编译指令

  • 编译指令:通知Servlet引擎的处理消息,他只在JSP程序在转换成Servlet过程中起作用。

2.3.1.JSP 编译指令 page

  • 主要用于定义当前JSP页面的全局属性,包括所使用的脚本语言类型,需要导入的Java包列表。一般位于JSP页面最上方由"<%@       %>"包括,同一个页面可以有多个page编译指令。
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
  • language”:用来声明当前JSP页面使用的脚本语言,默认为Java。
  • contentType”:有两个作用:1.设置MIME类型(多用途互联网邮件扩展类型) 2.设置网页生成编码
  • charset”:用于指定服务器生成网页的编码,默认为"ISO-8859-1",一般设置为"UTF-8"
  • pageEncoding”:用于设置JSP页面本身的编码。
  • import”:默认没有,用于导入Java类。一个"import"导入两个Java类用逗号分隔
<%@ page import="java.util.ArrayList,java.util.LinkedList"%>
或者为
<%@ page import="java.util.ArrayList"%>
<%@ page import="java.util.LinkedList"%>
  • errorPage”:默认没有,用于指定错误处理界面,如果当前jsp页面出现错误,而且该jsp程序没有对应的处理代码,那jsp引擎自动调用该指令所指定的jsp页面。
  • isErrorPage”:默认没有,用于设置当前jsp页面是否为错误处理页面。

2.3.2.JSP 编译指令 include

  • 静态包含指令,可以将web文件包含到当前jsp页面中,web文件可以是html文件,jsp文件或者txt等。如果是jsp文件,会在包含进来的同时,解析其中的jsp语句。
  • 通过include包含指令,包含进来的所有文件最终和源文件一起转化成一个Servlet。
  • 在包含页面和被包含页面中,同一个名字的变量不能定义两次。(注意)
<%@ include file="" %>

用file属性来指定包含的目标文件。

2.4 JSP动作元素

动作元素为请求处理阶段提供信息。动作元素遵循XML元素的语法,有一个包含元素名的开始标签,可以有属性,可选内容,与开始标签匹配的结束标签。

  • 动作指令:客户端在请求时期,动态被执行的。每次客户端请求时都可能被执行一次。

2.4.1.JSP 动作 forward

  • 用于将当前程序重新定向到一个html页面或者动态程序。可以带参数和不带参数。
  • forward指令用page属性来指代要重定向的目标文件和url。
  • forward指令是重定向指令,forward指令之后的代码将不会执行,也不会被发送到客户端。(注意)
  • 等同于request.getRequestDispatcher("").forward(request,response);
<jsp:forward page=""></jsp:forward>
out.print("hello world!")  //不执行

向跳转页面传递数据的时,要用到param指令,例如:
同一级文件夹下,两个JSP文件:
index.jsp文件:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
	
<jsp:forward page="login.jsp">		//forward指令跳转至login.jsp文件
	<jsp:param value="admin1" name="username"/>			//用param指令传递名为username的参数,值为admin1
	<jsp:param value="123456" name="password"/>			//用param指令传递名为password的参数,值为123456
</jsp:forward>
这是主页!		//此语句不会被执行

login.jsp文件:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	登录页面!</br>
	<%
	//request为JSP内置对象,封装了客户端的请求信息,通过request的getParameter()方法可以获取到请求中的参数
	String username = request.getParameter("username");			//获取名为username的参数
	String password = request.getParameter("password");			//获取名为password的参数

	out.print(username);
	out.print("</br>");
	out.print(password);
%>
</body>
</html>

2.4.2.JSP 动作 include

  • 动态包含指令,用于在JSP程序中包含静态或者动态文件。
  • 如果被包含的是静态文件,处理过程是把静态文件中的内容直接加入到JSP程序中。
  • 如果被包含的是动态文件,处理过程是当前文件经过引擎编译后,将生成的内容加入到JSP程序中。

表达式为

<jsp:include page="" flush="true|false" />

page:要包含的页面
flush:被包含的页面是否从缓冲区读取

对比编译指令includ动作指令include(主要)
代码表达<%@ include file="" %><jsp:include page="" />
运行流程在页面转换期间(只执行一次)在请求期间
包含内容文件的实质内容(代码,文字)页面的输出(被包含页面的结果)
转换成的servlet主页面好包含页面转换为一个Servlet主页面和包含页面转换为独立的Servlet
编译时间较慢——资源必须被解析较快
执行时间稍快较慢——每次资源必须被解析
加请求参数不可以可以

include实例:
同一级文件夹下,三个JSP文件:
index.jsp文件:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<jsp:include page="head.jsp"></jsp:include>			//无参include
<jsp:include page="body.jsp">
	<jsp:param value="background:red;" name="bodystyle" />			//有参,将body的背景设置为红色
</jsp:include>
</html>

head.jsp文件:

<head>
<meta charset="UTF-8">
<title>this is from head.jsp</title>
</head>

body.jsp文件:

<body style="<%=request.getParameter("bodystyle") %>">			//获取传递的参数

</body>

2.4.3.JSP 动作 useBean

javabean要求:
1.要有公有无参的构造函数。
2.所有属性为private,必须通过getter()和setter()来进行访问。
3.必须是可序列化的。(实现serializable接口)

例:实现一个简单的登录界面,
src目录下,创建一个javabean:

package com.bean;

import java.io.Serializable;

public class User implements Serializable {				//实现serializable接口
	private String username;				//private属性
	private String password;				//private属性

	public User() {				//默认构造函数
		super();
	}
	
	//属性的getter和setter方法
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}

useBean动作指令可以在JSP页面中实例化一个或者多个javabean对象。

<jsp:useBean id="" class="" scope="page|request|session|application"></jsp:useBean>

id:为实例化javabean对象后的标识符。
class:应用javabean类的全名(为javabean所在"src"中的目录)。
scope:为该实例化javabean的有效范围(4种参数)。

参数值作用范围
page(默认)仅在该页面有效
request仅本次请求有效,可以通过HttpRequest.getAttribute()方法取得javabean对象
session在本次session内有效,可以通过HttpSession.getAttribute()方法取得javabean对象
application在本应用内一直有效,可以通过application.getAttribute()方法取得javabean对象

接着用JSP实现一个简单的登录界面:
login.jsp登录页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
	//通过表单提交数据
	<form action="login_result.jsp" method="post">				//action属性用来指定表单提交给的url,method属性用来指定表单的提交形式。
		账号<input type="text" name="username" /><br>			//文本框用来输入账号
		密码<inputtype="password" name="password"><br> 			//文本框用来输入密码
		<input type="submit" value="登录">		//提交按钮
	</form>
</body>
</html>

登录反馈页面(用上javabean)
login_result.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login-Result</title>
</head>
<jsp:useBean id="user" class="com.lhj.bean.User"></jsp:useBean>
<jsp:setProperty property="username" name="user" />
<jsp:setProperty property="password" name="user" />
<body>
	<%
		//方式1:用request.getParameter()方法获取参数
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		out.print("方式1:<br>");
		out.print(username);
		out.print("<br>");
		out.print(password);
		out.print("<br>");

		//方式2(用到useBean):用javabean的实例和jsp的setProperty设置获取参数
		out.print("方式2:<br>");
		out.print(user.getUsername());
		out.print("<br>");
		out.print(user.getPassword());
		out.print("<br>");
	%>
	<!--方式3-->
	方式3(用到useBean):用jsp:getProperty获取参数
	<br>
	<jsp:getProperty property="username" name="user" />
	<br>
	<jsp:getProperty property="password" name="user" />
</body>
</html>

setProperty方法用于为JavaBean实例的属性设置值。
有4种表达方式:

表达式描述
<jsp:setProperty property="*" name="Javabean实例名"/>与之前页面提交的表单的所有属性(property=" * ")进行匹配,若有与javabean类属性名相同的,则进行赋值(与表单关联)
<jsp:setProperty property="Javabean属性名" name="Javabean实例名"/>与之前页面提交的表单的指定的属性进行匹配(与表单关联)
<jsp:setProperty property="Javabean属性名" name="Javabean实例名" value="值"/>手动对指定元素进行赋值
<jsp:setProperty property="Javabean属性名" name="Javabean实例名" param="request对象中的参数名"/>通过request对象的属性传递参数

getProperty方法用于获取指定Javabean对象的属性值。

表达式描述
<jsp:getProperty property="Javabean属性名" name="Javabean实例名" />获取Javabean实例的指定属性的属性值

2.4.4.JSP 动作 param

语法:

<jsp:param name="参数名" value="参数值">
  • 常常与jsp:forward一起使用,作为其的子标签。用来传递数据。

第3章 JSP内置对象

内置对象作用
out (常用)out对象用来向客户端浏览器输出信息
request对象(常用)封装了来自客户端浏览器的各种信息
response对象(常用)封装了服务器的响应信息
exception对象封装了JSP程序执行中发生的错误和异常信息
config对象封装了应用程序的配置信息
page对象指向了当前JSP程序本身
session对象(常用)用来保存会话信息,可以在同一用户不同强求之间共享数据
application对象(常用)代表当前应用程序的上下文,可以在不同用户之间共享信息
pageContext对象提供了对JSP页面所有对象及命名空间的访问

3.1 out对象

其常用方法如下。
使用out对象进行页面输出

out对象的常见用法描述
out.print("")在页面上输出文字,不换行。
out.println("")在页面上输出文字,浏览器页面上显示一个空格,不换行。在查看页面源代码中显示换行效果。换行一般是输出"<br/>"文本
out.newLine()浏览器页面上显示一个空格,不换行。在查看页面源代码中显示换行效果。

使用out对象求得缓冲区使用大小

out对象的用法描述
out.getBufferSize()获取当前缓冲区大小,单位kb,默认大小为8kb,可以通过 page编译指令 进行设置。
out.getRemaining()当前缓冲区剩余大小,单位kb
out.flush()将缓冲区内容输出到客户端,在 page编译指令 中默认 autoFlush=“true”,一般情况下不会使用
out.clearBuffer()清空缓冲区中数据,如果之前使用过out.flush()不会报错
out.isAutoFlush()缓冲区满时,是否自动清空
out.clear()清空缓冲区中数据,如果之前使用过out.flush()会报错
out.close()关闭输出流

3.2 request对象

封装了从客户端向服务器发送的请求信息,通常包括用户提交的表单信息,请求参数,请求的来源,cookies,客户端的ip,主机名等等。
常用方法(把以下代码复制到JSP页面中):

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
body {
	font-family: Consolas;
}

table tr td {
	padding-left: 5px;
}
</style>

</head>
<body>
	<%
		request.setCharacterEncoding("UTF-8");
	%>
	<form action="" method="post">
		要提交的信息:<input type="text" name="input"><br> 爱好:<input
			type="checkbox" name="hobby" value=""><input
			type="checkbox" name="hobby" value=""><input
			type="checkbox" name="hobby" value="rap">rap <input
			type="checkbox" name="hobby" value="篮球">篮球 <input
			type="submit">
	</form>
	<br>
	<table border="1" cellspacing="0" cellpadding="1">
		<tr>
			<th>表达式</th>
			<th>返回值</th>
			<th>描述</th>
		</tr>
		<tr>
			<th colspan="3">在请求中存储读取属性:</th>
		</tr>
		<tr>
			<td>request.setAttribute("name","Bob")</td>
			<td>不返回值 <%
				request.setAttribute("name", "Bob");
			%>
			</td>
			<td>在此请求中存储名为"name",值为"Bob"属性。</td>
		</tr>
		<tr>
			<td>request.getAttribute("name")</td>
			<td><%=request.getAttribute("name")%></td>
			<td>在此请求中获取名为"name"属性的值。</td>
		</tr>
		<tr>
			<th colspan="3">获取请求的参数:</th>
		</tr>
		<tr>
			<td>request.getMethod()</td>
			<td><%=request.getMethod()%></td>
			<td>返回客户端向服务器端传送数据的方法,有get、post、put等类型</td>
		</tr>
		<tr>
			<td>request.getParameter("input")</td>
			<td><%=request.getParameter("input")%></td>
			<td>返回request对象中"name"属性为"input"的值</td>
		</tr>
		<tr>
			<td>request.getParameterValues("hobby")</td>
			<td>
				<%
					if (request.getParameterValues("hobby") != null) {
						String[] hobbys = request.getParameterValues("hobby");
						String str = "";
						for (int i = 0; i < hobbys.length; i++) {
							str = str + hobbys[i]+"&nbsp&nbsp";
						}
						out.print(str);
					}
				%>
			</td>
			<td>返回request对象中"name"属性为"hobby"的多选框的数组的值</td>
		</tr>
		<tr>
			<td>request.getProtocol()</td>
			<td><%=request.getProtocol()%></td>
			<td>返回请求使用的协议</td>
		</tr>
		<tr>
			<td>request.setCharacterEncoding("UTF-8")</td>
			<td>不返回值 <%
				request.setCharacterEncoding("UTF-8");
			%>
			</td>
			<td>返回字符编码方式</td>
		</tr>
		<tr>
			<td>request.getCharacterEncoding()</td>
			<td><%=request.getCharacterEncoding()%></td>
			<td>返回字符编码方式</td>
		</tr>
		<tr>
			<td>request.getContentLength()</td>
			<td><%=request.getContentLength()%></td>
			<td>返回请求文件长度</td>
		</tr>
		<tr>
			<th colspan="3">返回资源路径:</th>
		</tr>
		<tr>
			<td>request.getRequestURL()</td>
			<td><%=request.getRequestURL()%></td>
			<td>返回客户端用于发出请求的URL,包含协议、服务器名称、端口号和服务器路径,不包含查询字符串参数。</td>
		</tr>
		<tr>
			<td>request.getRequestURI()</td>
			<td><%=request.getRequestURI()%></td>
			<td>返回客户端用于发出请求的URI,除去host(域名或者ip)部分的路径</td>
		</tr>
		<tr>
			<td>request.getContextPath()</td>
			<td><%=request.getContextPath()%></td>
			<td>返回工程名部分,如果工程映射为,此处返回则为空</td>
		</tr>
		<tr>
			<td>request.getServletPath()</td>
			<td><%=request.getServletPath()%></td>
			<td>返回客户端所请求的脚本文件的文件路径,除去host和工程名部分的路径</td>
		</tr>
		<tr>
			<td>request.getRealPath("index.jsp")</td>
			<td><%=request.getRealPath("index.jsp")%></td>
			<td>返回请求的指定文件真实路径</td>
		</tr>
		<tr>
			<th colspan="3">获取服务器数据:</th>
		</tr>
		<tr>
			<td>request.getServerName()</td>
			<td><%=request.getServerName()%></td>
			<td>返回服务器IP</td>
		</tr>
		<tr>
			<td>request.getServerPort()</td>
			<td><%=request.getServerPort()%></td>
			<td>返回服务器接受此请求所用的端口号</td>
		</tr>
		<tr>
			<th colspan="3">获取客户端数据:</th>
		</tr>
		<tr>
			<td>request.getRemoteAddr()</td>
			<td><%=request.getRemoteAddr()%></td>
			<td>返回发送请求的客户机或最后一个代理的IP地址。</td>
		</tr>
		<tr>
			<td>request.getRemoteHost()</td>
			<td><%=request.getRemoteHost()%></td>
			<td>返回发送请求的客户机或最后一个代理的完全限定名。如果引擎不能或选择不解析主机名(以提高性能),此方法将返回IP地址。</td>
		</tr>
		<tr>
			<td>request.getRemotePort()</td>
			<td><%=request.getRemotePort()%></td>
			<td>返回发送请求的客户机或最后一个代理的IP源端口。</td>
		</tr>
		<tr>
			<td>request.getHeader("user-agent")</td>
			<td><%=request.getHeader("user-agent")%></td>
			<td>返回客户端浏览器的版本号、类型</td>
		</tr>
		<tr>
			<th colspan="3">返回收到请求的接口的信息:</th>
		</tr>
		<tr>
			<td>request.getLocalAddr()</td>
			<td><%=request.getLocalAddr()%></td>
			<td>返回收到请求的接口的IP地址</td>
		</tr>
		<tr>
			<td>request.getLocalName()</td>
			<td><%=request.getLocalName()%></td>
			<td>返回收到请求的接口的主机名</td>
		</tr>
		<tr>
			<td>request.getLocalPort()</td>
			<td><%=request.getLocalPort()%></td>
			<td>返回收到请求的接口的端口号。</td>
		</tr>
	</table>
</body>
</html>
request的getAttribute()和getParameter()的区别
区别request.getParameter()request.getAttribute()
获取数据来源用于获取客户浏览器经过POST,GET方式提交的表单数据用于在服务器内部共享信息,
用途获取的是客户端设置的数据获取的是服务器设置的数据
返回的值只返回字符串返回值是任意类型
使用没有request.getParameter()方法一般和request.setAttribute()方法配套使用

request对象使用

在同一级目录新建三个JSP文件
输入信息页面input.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>录入表单信息</title>
</head>
<body>
	<form action="do.jsp" method="post">
		姓名:<input type="text" name="name">
		<br> 
		<input type="checkbox" name="hobby" value="">&nbsp; 
		<input type="checkbox" name="hobby" value="">&nbsp; 
		<input type="checkbox" name="hobby" value="rap">rap&nbsp; 
		<input type="checkbox" name="hobby" value="篮球">篮球&nbsp;
		<br> 
		<input type="submit" value="提交"> 
		<input type="reset" value="重置">
	</form>
</body>
</html>

处理request页面do.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("UTF8");

	String name = request.getParameter("name");
	String hobbys = "";
	String[] hobbyArr = request.getParameterValues("hobby");

	if (hobbyArr != null && hobbyArr.length > 0) {
		for(String hobby:hobbyArr){
			hobbys=hobbys+" "+hobby;
		}
	}
	
	request.setAttribute("name", name);
	request.setAttribute("hobbys",hobbys);
%>
<jsp:forward page="return.jsp"></jsp:forward>

信息输出页面return.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>信息展示页面</title>
</head>
<body>
	<%
		if (request.getAttribute("name") == null) {
	%>
	<jsp:forward page="input.jsp"></jsp:forward>
	<%
		}
	%>
	<%=request.getAttribute("name")%>
	<br>
	<%=request.getAttribute("hobbys")%>
</body>
</html>

要点:
1.<input type=“checkbox” name=" ">同一级复选框的name属性要相同,request获取时需要用request.getParameterValues()方法,返回是数组类型。
2.当信息输出页面输出乱码的时候,需要在处理request提交的信息之前,通过request.setCharacterEncoding()方法设置request的编码。

3.3 response对象

包含了相应客户请求的有关信息。response对象具有页面作用域,该页面内的response对象只能对这次访问有效。
设置标头:

表达式作用
response.setContentType("txt/html;charset=UTF-8")设置相应的MIMI类型
response.getWriter()返回一个PrintWriter对象,PrintWriter对象的out()方法可以向页面输出字符,提前于内置out对象
response.sendRedirect("http://www.baidu.com")重新定向客户端的请求
  • 请求重定向与请求转发的区别
  • 请求重定向:客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏URL地址会改变
  • 请求转发:服务器行为,request.getRequestDispatcher("目标页面").forward(request,response),是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变。

3.4 session对象

session是指:

  • session表示客户端与服务器的一次会话。
  • Web中的session指的是用户在浏览某个网站是,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。
  • session实际上是一个特定的时间概念。
  • 在服务器的内存中保存着不同用户的session,session与用户一一对应。

session对象:

  • session对象在第一个jsp页面被装载时自动创建,完成会话期管理。
  • 从一个客户打开浏览器连接到服务器开始,到客户关闭浏览器离开服务器结束,被称为一个会话。
  • 当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器通过session对象知道这是一个客户。
    常用方法(把以下代码复制到JSP页面中):
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<table border="1" cellspacing="0" cellpadding="1">
		<tr>
			<th>表达式</th>
			<th>返回值</th>
			<th>描述</th>
		</tr>
		<tr>
			<td>session.getCreationTime()</td>
			<td><%=session.getCreationTime()%></td>
			<td>返回session创建时间,返回的是long类型的毫秒数</td>
		</tr>
		<tr>
			<td>session.getId()</td>
			<td><%=session.getId()%></td>
			<td>返回session创建时JSP引擎为它设的唯一ID号</td>
		</tr>
		<tr>
			<td>session.setAttribute("name","Bob")</td>
			<td>不返回值 <%
				session.setAttribute("name", "Bob");
			%>
			</td>
			<td>在session中储名为"name",值为"Bob"的属性</td>
		</tr>
		<tr>
			<td>session.getAttribute("name")</td>
			<td><%=session.getAttribute("name")%></td>
			<td>在session中获取名为"name"属性的值</td>
		</tr>
		<tr>
			<td>session.getValueNames()</td>
			<td>
				<%
					//新建两个属性
					session.setAttribute("age", 18);
					session.setAttribute("job", "student");
					
					String[] names = session.getValueNames();
					for(int i=0;i<names.length;i++){
						out.print(names[i]+"&nbsp&nbsp");
					}
				%>
			</td>
			<td>返回包含在此session中所有可用属性的数组</td>
		</tr>
		<tr>
			<td>session.setMaxInactiveInterval(180)</td>
			<td>不返回值<%
				session.setMaxInactiveInterval(180);
			%></td>
			<td>设置当前session最大存活时间(单位秒)</td>
		</tr>
		<tr>
			<td>session.getMaxInactiveInterval()</td>
			<td><%=session.getMaxInactiveInterval()%></td>
			<td>返回当前session最大存活时间(单位秒)</td>
		</tr>
	</table>
</body>
</html>

session的生命周期:
创建:

  • 当客户端第一次访问某个jsp或者Servlet时候,服务器会为当前会话创建一个SessionId,每次客户端向服务器发送请求时,都会将此SessionId进行校验。

活动:

  • 某次会话当中通过超链接打开的新页面属于同一次会话。
  • 只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话。
  • 除非本次会话的所有页面都关闭后再重新访问某个JSP或者Servlet将会创建新的会话。(注意:原有会话还存在,只是这个旧的sessionID仍然存在于服务端,只不过再也没有客户端会携带它然后交予服务器校验。)
    销毁:
    1.调用session.invalidate()方法
    2.session过期(超时),方法:
               a.通过session.setMaxInactiveInterval(int time)方法
               b.在web.xml中配置,单位:分钟
<session-config>
<session-timeout>
	1
</session-timeout>
</session-config>

3.服务器重启

3.4 application对象

  • application对象实现了用户间数据的共享,可存放全局变量。
  • application开始于服务器的启动,终止与服务器的关闭。
  • 在用户的前后的连接或不同用户之间的连接中,可以对application对象的同一属性进行操作。
  • 在任何地方对application对象属性的操作,都将影响到其他用户对此的访问。
  • 服务器的启动和关闭决定了application对象的生命。
  • application对象是ServletContext类的实例。

常用方法:

表达式作用描述
application.setAttribute(name, object)使用指定名称将对象绑定到此会话。
application.getAttribute(name)返回与此会话中的指定名称绑定在一起的对象,若没有绑定则返回null

3.5 page对象

指当前JSP页面本身,有点像类中的this指针,它是java.lang.Object类的实例。

3.6 pageContext对象

  • pageContext对象提供了对JSP页面内所有的对象及名字空间的访问
  • pageContext对象可以访问到本页所在的session,也可以取本页面所在的application的某一属性值
  • pageContext对象相当于页面中所有强大功能的集大成者。
  • pageContext对象的本类名也叫pageContext。
表达式描述
pageContext.getOut()返回当前客户端响应被使用的JspWrite流(out对象)
pageContext.getSession();返回当前页面中的HttpSession对象(session对象)
pageContext.getPage()返回当前页的Object对象(page对象)
pageContext.getRequest()返回当前页的ServletRequest对象(request对象)
pageContext.getResponse()返回当前页的ServletResponse对象(response对象)
pageContext.setAttribute(name, value)设置属性及属性值
pageContext.getAttribute(name, scope);在指定范围内取属性值
pageContext.getAttributesScope(name)返回某属性的作用范围
pageContext.forward(relativeUrlPath);是当前页面重导到另一页面
pageContext.include(relativeUrlPath)在当前位置包含另一文件

3.7 Config对象

config对象是在一个Servlet初始化时,JSP引擎向他传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)。
常用方法:

表达式描述
config.getServletContext()返回含有服务器相关信息的ServletContext对象
config.getInitParameter()返回初始化参数值
config.getInitParameterNames()返回Servlet初始化所需所有参数的枚举,Enumeration类型

3.8 Exception对象

  • exception对象是一个异常对象,当一个页面在运行过程中发生了异常,就产生这个对象。
  • 如果一个JSP页面要应用此对象,就必须把isErrorPage设置为true,否则无法编译。
  • 是java.lang.Throwable的对象
表达式描述
exception.getMessage()返回描述议程的消息
exception.toString()返回关于异常的简短描述消息
exception.printStackTrace()显示异常及其栈轨迹
exception.fillInStackTrace()重写异常的执行栈轨迹



JAVA WEB 应用开发模式之 Model1

  • model1 模型出现前,整个Web应用的情况:几乎全部由JSP页面组成,JSP页面接受处理客户端请求,队请求处理后直接做出响应,弊端是在界面层充斥着大量的业务逻辑的代码和数据访问层的代码,Web程序的可拓展性和维护性非常差。
  • Javabean的出现可以使jsp页面中使用Javabean封装的数据或者调用Javabean的业务逻辑代码,这样大大提升了程序的可维护性。

Model1图示

JSP的状态管理

1.http协议的无状态性

        无状态是指,当浏览器发送请求给服务器的时候,服务器响应客户端请求。但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道它就是刚才那个浏览器。简单地说,就是服务器不会去记得你,所以就是无状态协议。

保存用户状态的两大机制:a.session对象   b.Cookie

2.Cookie概述

是Web服务器保存在客户端的一些列文本信息。
典型应用一:判定注册用户是否已经登录网站。
典型应用二:“购物车”的处理。

Cookie的作用

  • 对特定对象的追踪
  • 保存用户网页浏览记录与习惯
  • 简化登录

安全风险:容易泄露用户信息

3.JSP页面中创建与使用Cookie

创建Cookie对象

Cookie cookie=new Cookie(String key,Object value);

写入Cookie对象

response.addCookie(Cookie cookie);

读取Cookie对象

Cookie[] cookies=request.getCookies();

常用方法

表达式描述
void setMaxAge(int expiry)设置cookie的有效期,以秒为单位
void setValue(String value)在cookie创建后,对cookie进行赋值
Srting getName()获取cookie的名称
String getValue()获取cooki的值
int getMaxAge()获取cookie的有效时间,以秒为单位

4.Session与Cookie的对比

区别SessionCookie
保存信息服务器客户端
保存信息类型Object类型String类型
生命随会话的结束而将其储存的数据销毁cookie可以长期保存在客户端
保存的信息类型保存重要信息保存不重要的用户信息
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值