第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]+"  ";
}
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="唱">唱
<input type="checkbox" name="hobby" value="跳">跳
<input type="checkbox" name="hobby" value="rap">rap
<input type="checkbox" name="hobby" value="篮球">篮球
<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]+"  ");
}
%>
</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的业务逻辑代码,这样大大提升了程序的可维护性。
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的对比
区别 | Session | Cookie |
---|---|---|
保存信息 | 服务器 | 客户端 |
保存信息类型 | Object类型 | String类型 |
生命 | 随会话的结束而将其储存的数据销毁 | cookie可以长期保存在客户端 |
保存的信息类型 | 保存重要信息 | 保存不重要的用户信息 |