Java匹马行天下之JavaWeb核心技术——JSP

JSP动态网页技术

一、JavaWeb简介

一、什么是JavaWeb?

JavaWeb是用Java技术来解决相关web互联网领域的技术总称。

需要在特定的web服务器上运行,分为web服务器和web客户端两部分

跨平台,能够在多个平台下部署和运行

二、静态网页和动态网页

静态网页:网页中的内容是固定的,不会更新。

所用技术为html、css;

动态网页:网页中的内容通过程序动态显示的,自动更新。

所用技术为html、css、数据库、至少一门高级语言(Java、C#,PHP),JavaScript,XML等,主流的动态网页脚本技术(jsp/Asp.net/php)

三、Tomcat服务器目录介绍

WEB-INF是Java的Web应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。

web.xml文件是项目的部署文件

classes文件夹,用于放置*.class文件

lib文件夹,用于存放需要的jar包

如图:

四、修改Tomcat服务器默认端口

在Tomcat的安装目录下,找到conf-->server.xml文件

找到Connector标签

修改port属性的值即可,端口修改完成后要记得保存,并且重启Tomcat服务器。

二、JSP基础学习

一、JSP简介

JSP全名为Java Server Pages,其根本是一个简化的Servlet设计,他实现了再Java当中使用HTML标签。JSP是一种动态网页技术标准也是JavaEE的标准。JSP与Servlet一样,是在服务器端执行的。

JSP实际上就是Servlet。JSP这门技术的最大的特点在于:写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。

二、JSP的作用

Servlet:服务器端的小应用程序。适合编写Java逻辑代码,如果编写网页内容------->费时费力,太苦

缺点:不适合设置HTML响应体,需要大量的

response.getWriter().print("");

优点:动态资源,可以编程。

HTML:静态内容

缺点:HTML是静态页面,不能包含动态信息;

优点:不用为输出html标签而发愁。

jsp(java server pages):适合编写输出动态内容,但不适合编写Java逻辑

优点:在原有HTML的基础上添加java脚本,构成jsp页面。

三、JSP和Servlet的分工

JSP

作为请求发起页面,例如显示表单、超链接。

作为请求结束页面,例如显示数据。

Servlet

作为请求中处理数据的环节

四、JSP的组成

jsp=html+java脚本+jsp标签(指令)

jsp中无需创建即可使用的对象一共有9个,称为九大内置对象。

3种java脚本:

java代码片段(常用),用于定义0-N条java语句,方法内写什么就可以在这里写什么,不能声明方法和类;

java表达式,用于输出(常用),用于输出一条表达式(或变量)的结束,print()括号中参数可以放什么,这里就能放什么;

声明,用来创建类的成员变量和成员方法(基本不用),class A{ } 类体中可以放什么,这里就可以放什么。

五、JSP的执行流程及原理

jsp其实是一种特殊的Servlet

当jsp页面第一次被访问时,服务器会把jsp编译成java文件(这个java其实是一个Servlet类);

然后再把java编译成.class;

然后创建该类对象;

最后调用它的service()方法;

第二次请求同一jsp时,直接调用service()方法。

在Tomcat的work目录下可以找到jsp对应的.java源代码。

1、IE浏览器在访问JSP页面时,Web服务器是如何调用并执行一个jsp页面的?(Servlet)

第一次:转译(翻译) --> 编译 --> 执行

第二次:执行

2、Web服务器在执行jsp页面时,是如何把Jsp页面中的html排版标签发送到客户端的?

out.print(""); 或者 out.write("");

3、Jsp页面中的java代码服务器是如何执行的?

服务器 --> .java文件 --> .class文件 --> 结果out回客户端

4、Web服务器在调用jsp时,会给jsp提供一些什么java对象(内置对象)?

HttpSession、ServletConfig、ServletContent、request、response、out等等。

六、JSP的基本语法

Servlet:控制器。重点编写java代码逻辑。(获取表单数据、处理业务逻辑、分发转向)

JSP:代码显示模板。重点在于显示数据。(为什么显示数据不直接用.html文件呢?因为.jsp文件中可以插入java代码显示回显消息,简言之,jsp功能更强大)

JSP的模版元素:简言之就是网页的静态内容

例如:html标签和普通文本。

JSP的脚本:

java代码片段(常用),用于定义0-N条java语句,方法内写什么就可以在这里写什么,不能声明方法和类;

java表达式,用于输出(常用),用于输出一条表达式(或变量)的结束,print()括号中参数可以放什么,这里就能放什么;

等价于out.print(2 + 3);

声明,用来创建类的成员变量和成员方法(基本不用),class A{ } 类体中可以放什么,这里就可以放什么。

注释:

JSP注释:

特点:安全,省流量

网页注释:

特点:不安全,费流量

七、JSP的三个指令

JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。

在JSP 2.0规范中共定义了三个指令:

page指令(页面级别)

include指令(导入其它页面的信息)

taglib指令(标签指令)

例如:

1、page

作用:

page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面。

为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。

属性:

import和java代码中的import是一样的

或者:

JSP会自动导入(默认导入)以下的包:

import java.lang.*;

import javax.servlet.*;

import javax.servlet.http.*;

import javax.servlet.jsp.*;

session: 表示是否会自动创建session对象。其默认值是true。

buffer: JSP中有javax.servlet.jsp.JspWriter输出字符流。设置输出数据的缓存大小,默认大小是8kb。建议最好不要改大小。

errorPage: 如果页面中有错误,则跳转到指定的资源。(即不让页面弹出404/500等错误)

errorPage="/uri"

如果写"/"则代表当前应用的目录下,绝对路径。

如果不写"/"则代表相对路径。

isErrorPage: 表示是否创建throwable对象。其默认值是false。作用:输出页面错误信息:by zero

contextType: contentType="text/html; charset=UTF-8" 告诉浏览器使用什么编码来解析文本。等同于 response.setContextType("text/html; charset=utf-8");

pageEncoding: 告诉JSP引擎(服务器)要转译(翻译)的文件使用的编码。

例如:

isELIgnored: 是否支持EL表达式。默认是false,表示支持EL表达式。

例如:${1+1} 等价于out.print(1+1);

2、include

include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。

静态包含:把其它资源包含到当前页面中。

动态包含:

两者的区别:转译(翻译)的时间段不同

前者:在翻译时就把两个文件合并

后者:不会合并文件,当代码执行到include时,才包含另一个文件的内容。

使用原则:能用静的就不用动的。原因之一是:可以省略一些代码的书写。

3、taglib

JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。

Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。

Taglib指令的语法:

uri属性确定标签库的位置,prefix属性指定标签库的前缀。

等价的XML语法:

作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。

prefix:前缀(相当于重新给uri起个名字)

示例:

if (5 > 3) {

out.print(5);

}

%>

aaa

下面的这种方式很好用!后面慢慢体会。

八、JSP的动作

使用标签的形式来表示一段java代码。

JSP行为标签使用XML语法结构来控制servlet引擎。它能够动态插入一个文件,重用JavaBean组件,引导用户去另一个页面,为Java插件产生相关的HTML等等。

行为标签只有一种语法格式,它严格遵守XML标准:

行为标签基本上是一些预先就定义好的函数,下表罗列出了一些可用的JSP行为标签:

九、JSP的九个内置对象

指在JSP的 和中可以直接使用的对象,服务器给我们创建好的对象,直接拿过来用就行了。

例如:

Student stu = new Student();

stu.setName("tom");

out.print(stu.getName());

// request.getRequestDispatcher("/7.jsp").forward(request, response);

%>

十、JSP客户端请求

1、HttpServletRequest类

request对象是javax.servlet.http.HttpServletRequest类的实例。每当客户端请求一个页面时,JSP引擎就会产生一个新的对象来代表这个请求。

request对象提供了一系列方法来获取HTTP信息头,包括表单数据,cookies,HTTP方法等等。

接下来将会介绍一些在JSP编程中常用的获取HTTP信息头的方法。详细内容请见下表:

2、HTTP信息头示例

在这个例子中,我们会使用HttpServletRequest类的getHeaderNames()方法来读取HTTP信息头。这个方法以枚举的形式返回当前HTTP请求的头信息。

获取Enumeration对象后,用标准的方式来遍历Enumeration对象,用hasMoreElements()方法来确定什么时候停止,用nextElement()方法来获得每个参数的名字

pageEncoding="UTF-8"%>

菜鸟教程(runoob.com)

HTTP 头部请求实例

Header Name Header Value(s)

Enumeration headerNames = request.getHeaderNames();

while(headerNames.hasMoreElements()) {

String paramName = (String)headerNames.nextElement();

out.print("

" + paramName + "\n");

String paramValue = request.getHeader(paramName);

out.println("

" + paramValue + "\n");

}

%>

十一、JSP服务器响应

1、HttpServletResponse类

response 对象是 javax.servlet.http.HttpServletResponse 类的一个实例。就像服务器会创建request对象一样,它也会创建一个客户端响应。

response对象定义了处理创建HTTP信息头的接口。通过使用这个对象,开发者们可以添加新的cookie或时间戳,还有HTTP状态码等等。

下表列出了用来设置HTTP响应头的方法,这些方法由HttpServletResponse 类提供:

2、HTTP响应头程序示例

接下来的例子使用setIntHeader()方法和setRefreshHeader()方法来模拟一个数字时钟:

pageEncoding="UTF-8"%>

菜鸟教程(runoob.com)

自动刷新实例

// 设置每隔5秒自动刷新

response.setIntHeader("Refresh", 5);

// 获取当前时间

Calendar calendar = new GregorianCalendar();

String am_pm;

int hour = calendar.get(Calendar.HOUR);

int minute = calendar.get(Calendar.MINUTE);

int second = calendar.get(Calendar.SECOND);

if(calendar.get(Calendar.AM_PM) == 0)

am_pm = "AM";

else

am_pm = "PM";

String CT = hour+":"+ minute +":"+ second +" "+ am_pm;

out.println("当前时间: " + CT + "\n");

%>

十二、JSP表单处理

我们在浏览网页的时候,经常需要向服务器提交信息,并让后台程序处理。浏览器中使用 GET 和 POST 方法向服务器提交数据。

1、GET 方法

GET方法将请求的编码信息添加在网址后面,网址与编码信息通过"?"号分隔。如下所示:

用get时,传输数据的大小有限制 (注意不是参数的个数有限制),最大为1024字节。

2、POST 方法

一些敏感信息,如密码等我们可以通过POST方法传递,POST提交数据是隐式的。

POST提交数据是不可见的,GET是通过在url里面传递的(可以看一下你浏览器的地址栏)。

JSP使用getParameter()来获得传递的参数,getInputStream()方法用来处理客户端的二进制数据流的请求。

3、JSP 读取表单数据

getParameter(): 使用 request.getParameter() 方法来获取表单参数的值。

getParameterValues(): 获得如checkbox类(名字相同,但值有多个)的数据。接收数组变量 ,如checkbox类型

getParameterNames():该方法可以取得所有变量的名称,该方法返回一个 Enumeration。

getInputStream():调用此方法来读取来自客户端的二进制数据流。

表单信息

JSP

读取参数信息

参数名 对应值

Enumeration parameterNames = request.getParameterNames();

request.setCharacterEncoding("utf-8");

while (parameterNames.hasMoreElements()){

String name = parameterNames.nextElement();

out.println("

"+name+"\n");

String url = request.getParameter(name);

out.println("

"+url+"\n");

}

%>

%>

十三、四大域对象:实际开发如何用?

PageContext:pageConext

存放的数据仅在当前页面有效。开发时使用较少。当前页面存放数据用表单标签中的,且该存值方式用户看不到。

ServletRequest: request

存放的数据在一次请求(转发:可以传数据)内有效。使用非常多。

HttpSession: session

存放的数据在一次会话(多次请求)中有效。使用的比较多。例如:存放用户的登录信息、购物车功能。

ServletContext: application

存放的数据在整个应用范围内都有效。因为范围太大,应尽量少用。用于统计在线人数。

十四、会话跟踪

1、 会话概述

什么是会话?如同打电话。

会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

会话过程要解决的问题是什么?保持各个客户端自己的数据。

每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。

例如:用户点击超链接通过一个servlet购买了一个商品,程序应该想办法保存用户购买的商品,以便于用户点结帐servlet时,结帐servlet可以得到用户购买的商品为用户结帐。

思考:用户购买的商品保存在request或servletContext中行不行?答:不行。

保存会话数据的两种技术:

Cookie:是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。

当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

HttpSession:Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的HttpSession对象,

由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

2、http协议的无状态性

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

3、JSP Cookie 处理

Cookie是存储在客户机的文本文件,它们保存了大量轨迹信息。在servlet技术基础上,JSP显然能够提供对HTTP cookie的支持。

通常有三个步骤来识别回头客:

服务器脚本发送一系列cookie至浏览器。比如名字,年龄,ID号码等等。

浏览器在本地机中存储这些信息,以备不时之需。

当下一次浏览器发送任何请求至服务器时,它会同时将这些cookie信息发送给服务器,然后服务器使用这些信息来识别用户或者干些其它事情。

JSP Cookie 处理需要对中文进行编码与解码,方法如下:

String str = java.net.URLEncoder.encode("中文","UTF-8"); //编码

String str = java.net.URLDecoder.decode("编码后的字符串","UTF-8"); // 解码

4、Servlet Cookie 方法

5、使用JSP设置Cookie

使用JSP设置cookie包含三个步骤:

1、创建一个Cookie对象:调用Cookie的构造函数,使用一个cookie名称和值做参数,它们都是字符串。

Cookie cookie = new Cookie("key","value");

请务必牢记,名称和值中都不能包含空格或者如下的字符:

[ ] ( ) = , " / ? @ : ;

2、设置有效期:调用setMaxAge()函数表明cookie在多长时间(以秒为单位)内有效。下面的操作将有效期设为了24小时。

cookie.setMaxAge(606024);

3、将cookie发送至HTTP响应头中:调用response.addCookie()函数来向HTTP响应头中添加cookie。

response.addCookie(cookie);

6、实例说明

表单提交

站点名:

网址:

// 编码,解决中文乱码

String str = URLEncoder.encode(request.getParameter("name"),"utf-8");

// 设置 name 和 url cookie

Cookie name = new Cookie("name", str);

Cookie url = new Cookie("url", request.getParameter("url"));

// 设置cookie过期时间为24小时。

name.setMaxAge(60*60*24);

url.setMaxAge(60*60*24);

// 在响应头部添加cookie

response.addCookie( name );

response.addCookie( url );

%>

设置 Cookie

设置 Cookie

  • 网站名:

  • 网址:

7、使用 JSP 读取 Cookie

想要读取cookie,您就需要调用request.getCookies()方法来获得一个javax.servlet.http.Cookie对象的数组,然后遍历这个数组,使用getName()方法和getValue()方法来获取每一个cookie的名称和值。

获取 Cookie

Cookie cookie = null;

Cookie[] cookies = null;

// 获取cookies的数据,是一个数组

cookies = request.getCookies();

if( cookies != null ){

out.println("

查找 Cookie 名与值

");

for (int i = 0; i < cookies.length; i++){

cookie = cookies[i];

out.print("参数名 : " + cookie.getName());

out.print("
");

out.print("参数值: " + URLDecoder.decode(cookie.getValue(), "utf-8") +"
");

out.print("------------------------------------
");

}

}else{

out.println("

没有发现 Cookie

");

}

%>

8、使用JSP删除Cookie

删除cookie非常简单。如果您想要删除一个cookie,按照下面给的步骤来做就行了:

获取一个已经存在的cookie然后存储在Cookie对象中。

将cookie的有效期设置为0。

将这个cookie重新添加进响应头中。

9、实例演示

下面的程序删除一个名为"name"的cookie,当您第二次运行CookieDemo2.jsp时,name 将会为 null。

获取 Cookie

Cookie cookie = null;

Cookie[] cookies = null;

// 获取当前域名下的cookies,是一个数组

cookies = request.getCookies();

if( cookies != null ){

out.println("

查找 Cookie 名与值

");

for (int i = 0; i < cookies.length; i++){

cookie = cookies[i];

if((cookie.getName( )).compareTo("name") == 0 ){

cookie.setMaxAge(0);

response.addCookie(cookie);

out.print("删除 Cookie: " +

cookie.getName( ) + "
");

}

out.print("参数名 : " + cookie.getName());

out.print("
");

out.print("参数值: " + URLDecoder.decode(cookie.getValue(), "utf-8") +"
");

out.print("------------------------------------
");

}

}else{

out.println("

没有发现 Cookie

");

}

%>

10、图解分析

11、Session

HttpSession概述:

HttpSession是有JavaWeb提供的,用来会话跟踪的类,session是服务器对象,保存在服务器端;

HttpSession是Servlet三大域对象之一(request、session、application),所以它也有setAttribute()、getAttribute()、removeAttribute()方法;

HttpSession底层依赖Cookie,或是URL重写。

HttpSession的作用

会话范围:会话范围是某个用户从首次访问服务器开始,到该用户关闭浏览器结束;

会话:一个用户对服务器的多次连贯性请求,所谓连贯性请求,就是该用户多次请求中间没有关闭浏览器。

服务器会为每个客户端创建一个session对象,session就好比客户在服务器端的账户,它们被服务器保存到一个Map中,这个Map被称为session缓存。

Servlet中得到session对象:HttpSession session = request.getSession();

JSP中得到session对象:session是jsp内置对象之下,不用创建就可以直接使用。

12、session域相关方法

void setAttribute(String name,Object val);

Object getAttribute(String name);

void removeAttribute(String name);

13、session保存用户登录信息

案例相关页面和Servlet:

login.jsp:登录页面

LoginSuccess.jsp:只有登录成功才能访问的页面

LoginServlet:校验用户是否登录成功

各页面和Servlet内容:

login.jsp:提供登录表单,提交表单请求LoginServlet

LoginServlet:获取请求参数,校验用户是否登录成功

失败:保存错误信息到request域,转发到login.jsp,在login.jsp中显示request域中的错误信息;

成功:保存用户信息到session域中,重定向到LoginSuccess.jsp页面,显示session域中的用户信息。

LoginSuccess.jsp:从session域获取用户信息,如果不存在,显示“您还没有登录”,存在则显示用户信息;

只要用户没有关闭浏览器,session就一直存在,那么保存在session中的用户信息也就一起存在,那么用户访问LoginSuccess.jsp就会通过

login.jsp

登录页面

//获取cookie的值

String name = "";

String pwd = "";

Cookie[] cs = request.getCookies();

if(cs!=null){

for(Cookie c : cs){

if("username".equals(c.getName())){

name = c.getValue();

}

if("pwd".equals(c.getName())){

pwd = c.getValue();

}

}

}

%>

//获取request信息

String message="";

String mess = (String)request.getAttribute("message");

if(mess!=null){

message = mess;

}

%>

用户登录

账号:

密码:

LoginServlet.java

package com.demo.servlet;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.*;

import java.io.IOException;

@WebServlet("/LoginServlet")

public class LoginServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

doPost(req,resp);

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//设置请求的字符编码

request.setCharacterEncoding("utf-8");

//接收客户端请求

String username = request.getParameter("username");

String pwd = request.getParameter("pwd");

//判断是否登录成功

if("admin".equals(username) && "1234".equals(pwd)){

//登录成功,把信息保存到cookie中

Cookie c1 = new Cookie("username",username);

Cookie c2 = new Cookie("pwd",pwd);

c1.setMaxAge(60*60*24);

c2.setMaxAge(60*60*24);

response.addCookie(c1);

response.addCookie(c2);

//登录成功,保存用户名到session中,并重定向到LoginSuccess.jsp

HttpSession session = request.getSession();

session.setAttribute("username", username);

response.sendRedirect("/LoginSuccess.jsp");

}else{

//转发给客户端“登录失败”

request.setAttribute("message", "用户信息错误,请重新登录");

request.getRequestDispatcher("/login.jsp").forward(request, response);

}

}

}

LoginSuccess.jsp

登录成功

//获取session信息

String name = (String)session.getAttribute("username");

if(name==null){

//session不存在,转发到登录页面,并提示信息

request.setAttribute("message", "您还没有登录,不能访问页面");

request.getRequestDispatcher("/login.jsp").forward(request, response);

//重定向到login.jsp,不会显示request提示的信息

//response.sendRedirect("/login/login.jsp");

return;

}

%>

登录成功

你好,欢迎登录!

14、隐藏表单域

一个网络服务器可以发送一个隐藏的HTML表单域和一个唯一的session ID,就像下面这样:

这个条目意味着,当表单被提交时,指定的名称和值将会自动包含在GET或POST数据中。每当浏览器发送一个请求,session_id的值就可以用来保存不同浏览器的轨迹。

这种方式可能是一种有效的方式,但点击标签中的超链接时不会产生表单提交事件,因此隐藏表单域也不支持通用会话跟踪。

15、重写URL

您可以在每个URL后面添加一些额外的数据来区分会话,服务器能够根据这些数据来关联session标识符。

举例来说,http://w3cschool.cc/file.htm;sessionid=12345, session标识符为sessionid=12345,服务器可以用这个数据来识别客户端。

相比而言,重写URL是更好的方式来,就算浏览器不支持cookies也能工作,但缺点是您必须为每个URL动态指定session ID,就算这是个简单的HTML页面。

session依赖Cookie,目的是让客户端发出请求时归还sessionID,这样才能找到对应的session;

如果客户端禁用了Cookie,那么就无法得到sessionID,那么session也就无用了;

也可以使用URL重写来替代Cookie

让网站的所有超链接、表单中都添加一个特殊的请求参数,即sessionID;

这样服务器可以通过获取请求参数得到sessionID,从而找到session对象;

response.encodeURL(String url)该方法会对url进行智能的重写,当请求中没有归还session这个Cookie,那么该方法会重写URL,否则不重写,当然url必须是指向本站的url。

16、session对象

除了以上几种方法外,JSP利用servlet提供的HttpSession接口来识别一个用户,存储这个用户的所有访问信息。

默认情况下,JSP允许会话跟踪,一个新的HttpSession对象将会自动地为新的客户端实例化。禁止会话跟踪需要显式地关掉它,通过将page指令中session属性值设为false来实现,就像下面这样:

JSP引擎将隐含的session对象暴露给开发者。由于提供了session对象,开发者就可以方便地存储或检索数据。

下表列出了session对象的一些重要方法:

17、Session与Cookie的对比

18、HttpSession原理

服务器不会马上给你创建session,在第一次获取session时,即reques.getSession()方法执行时,才会创建session。

获取Cookie中的JSESSIONID:

如果sessionID不存在,创建session,把session保存起来,把新创建的sessionID保存到Cookie中;

如果sessionID存在,创建sessionID查找session对象,如果没有查找到,创建session,把session保存起来,把新创建的sessionID保存到Cookie中;

如果sessionID存在,通过sessionID查找到了session对象,那么就不会再创建session对象了;

如果创建新的session,浏览器会得到一个包含了sessionID的Cookie,这个Cookie的生命为-1,即只在浏览器内存中存在,如果不关闭浏览器,那么Cookie就会一直存在;

下次请求时,再执行request.getSession()方法时,因为可以通过Cookie中的sessionID找到session对象,所以与上一次请求使用的是同一个session对象。

request.getSession(false):如果Cookie不存在,session也不存在,那么返回NULL,而不会创建session对象;

request.getSession(true)/request.getSession():两个方法一样,当session对象不存在时,创建session对象

String getId() 获取sessionID;

int getMaxInactiveInterval()获取session最大的不活动时间(秒),默认为30分钟,当session在30分钟内没有使用,那么Tomcat就会在session池中移除;

void invalidate() 让session失效,调用这个方法会让session失效,当session失效后,客户端再次请求,服务器会给客户端一个新的session;

boolean isNew() 查看session是否为新的,判断是新创建的,还是从Cookie获取的;

往期推荐

《Java匹马行天下之学编程的起点——编程常识知多少》

《Java匹马行天下之学编程的起点——走进编程的殿堂》

《Java匹马行天下之学编程的起点——高级语言大锅烩》

《Java匹马行天下之C国程序员的秃头原因》

《Java匹马行天下之Java国出了个Java——举国欢庆》

《Java匹马行天下之Java帝国的崛起(大结局)》

《Java匹马行天下之教你用学汉语式方法学编程语言》

《Java匹马行天下之JavaSE核心技术——Java基础语法》

《Java匹马行天下之JavaSE核心技术——面向对象》

《Java匹马行天下之JavaSE核心技术——工具类》

《Java匹马行天下之JavaWeb核心技术——Servlet》

java web中td_Java匹马行天下之JavaWeb核心技术——JSP相关推荐

  1. Java匹马行天下之JavaWeb核心技术——Servlet

    Servlet 一.什么是Servlet? Servlet是在服务器上运行的小程序,也就是一个Java类,但比较特殊,不需要new,自动就可以运行.也有创建.垃圾回收和销毁过程.Servlet是Jav ...

  2. Java匹马行天下之学编程的起点——高级语言大锅烩

    学编程的起点--高级语言大锅烩 前言: 学知识前总想说点鸡汤,想喝的朋友就看看,不想喝的就直接看干货吧,就当鸡汤是给我自己喝的. 前段时间在网上看了一句话感觉挺触动我的,我做个分享: 如果你觉得你的祖 ...

  3. Java匹马行天下之 Java国出了个Java——举国欢庆

    Java帝国的崛起 前言: 看庭前花开花落,宠辱不惊, 望天上云卷云舒,去留无意. 闹心的事儿,选择释怀: 纠缠的人儿,试着放下, 生活其实很美. 心若向阳,就无惧悲伤. 愿你明朗坦荡纵情豁达,有得有 ...

  4. Java匹马行天下之C国程序员的秃头原因

    Java帝国的崛起 前言: 分享技术之前先请允许我分享一下黄永玉老先生说过的话:"明确的爱,直接的厌恶,真诚的喜欢.站在太阳下的坦荡,大声无愧地称赞自己." <编程常识知多少 ...

  5. Java匹马行天下之学编程的起点——走进编程的殿堂

    学编程的起点--走进编程的殿堂 前言: 知其然,知其所以然,努力固然重要,但是思维的提升会让你事半功倍,我会用我花费时间换来的"思维"带更多的朋友入门,让你们明明白白学编程,学编程 ...

  6. Java匹马行天下之学编程的起点——编程常识知多少

    学编程的起点--编程常识知多少 前言: 刚去大学那会,我就知道我被录取的学院是软件学院,还知道一点就是软件学院主要是学电脑的,但具体要学什么其实一无所知.待的时间久了,慢慢的,像"编程&qu ...

  7. Java匹马行天下之教你用学汉语式方法学编程语言

    Java匹马行天下之教你用学汉语式方法学编程语言 前言: 前段时间接连更新了带小白从入门到了解的几篇博客: <Java匹马行天下之编程常识知多少> <Java匹马行天下之走进编程的殿 ...

  8. 匹马行天下——没有无缘无故的爱和恨,没有无缘无故的编程

    没有无缘无故的爱和恨,没有无缘无故的编程 前言: 想这世间,没有无缘无故的爱,也没有无缘无故的恨,一切都有有原因的,我想编程亦是如此,技术时常更新,程序员时常学习,随着时间的推移,程序员发际线的增高, ...

  9. 匹马行天下之思维决定高度篇——编程“价”更高

    匹马行天下之思维决定高度篇--编程"价"更高 ----也许我注定成不了一个伟大的人,但是至少我可以做一个很棒的自己.我想我现在应该做的不是瞻前顾后,而是活在当下,正确认知自己,做好 ...

最新文章

  1. 英特尔显卡linux管理_英特尔 11 代酷睿大揭秘:这次全是大招
  2. VC++ CryptoAPI最基本编程
  3. Java与C#平台通信 WCF CXF SOAP
  4. 磁盘里竟然还有这个东西!多亏这个1.5M大小的神器工具发现了它
  5. 【空间数据库】ArcSDE 10.7+SQLEXPRESS+ArcServer 10.7.ecp企业级数据库环境搭建
  6. azure云数据库_Azure SQL数据库的性能调优
  7. leetCode:35. 搜索插入位置
  8. Confluence 6 安全相关问题提交链接
  9. vivado各个版本百度网盘下载资源(含license(时间到2037年))以及安装流程
  10. whatweb tree
  11. Swing学习01:Swing是什么
  12. 渗透测试---被动信息收集详解
  13. 欢迎进入“健康之家”:Delos推出全球首个住宅健康技术平台
  14. 买菜App综合服务水平排行:盒马、多点、每日优鲜排前三
  15. 在html页面中实现代码的高亮显示
  16. Hashcat使用指南
  17. incident用法_incident与_accident区别
  18. 英雄强渡大渡河!华为正式官宣MetaERP,实现对旧ERP的替换---转自百度新闻|极客网
  19. PandoraBox(openwrt通用)无线桥接中继扩展
  20. powerbi判断父级是否有子集_powerbi可以进行判断吗?

热门文章

  1. 无向图同构 (哈希)
  2. 电脑桌面便签用哪一个?
  3. HTML5电子书翻页效果 代码特效+鼠标点击拖拽滑动翻页+点击书页内容放大+不支持中文
  4. vue项目升级(01):全面解析vuecil3/vuecil4的vue.config.js等常用配置
  5. 2018.10.31模拟赛
  6. OMNET++学习(Networks)
  7. 【深度学习001】深度学习工作站组装—硬件篇—预算2万(20190401)
  8. uniapp返回上一页
  9. Qt中“调试器未设置”的解决方法
  10. 手机NFC有必要常开吗?偶尔坐公交,常开的话一天会耗电多少?