Servlet学习记录

1. HTTP协议

浏览器和服务器的交互模式:
浏览器和服务器的交互模式
URL:统一资源定位符。网络中唯一标识的地址。

1.1 HTTP协议

HTTP协议(Hypertext Transfer Protocol,超文本传输协议),是一个客户端请求和响应的标准协议,详细规定了浏览器和万维网服务器之间互相通信的规则。
客户端发送给服务器的内容格式为“请求协议”,服务器发送给客户端的内容格式为“响应协议”。
HTTP是一个基于请求与响应模式的、应用层的协议,常基于TCP的连接方式。

1.1.1 浏览器中的书写格式

在这里插入图片描述

1.1.2 HTTP协议特点
  1. 支持客户/服务器模式。
  2. 简单快速:客户向服务器请求服务时,只需要传送请求方法(GET\POST)和路径。HTTP协议简单使得HTTP服务器程序规模小,因而通信速度很快。
  3. 灵活:允许传输任意类型的数据对象。传输类型由Content-Type加以标记。
  4. 无连接:每次连接只处理一个请求。服务器处理完客户的请求并受到客户的应答后,即断开连接,节省传输时间。(HTTP1.1版本后支持可持续连接)
  5. 无状态:HTTP协议是无状态协议。即对于事物处理没有记忆能力。
1.1.3 URL

HTTP URL是一种特殊类型的URI,包含了用于查找某个资源的足够信息。
URL的格式如下:

http://host[:port]/[abs_path]
http://IP(主机名/域名):端口/访问的资源路径
  • http表示通过HTTP协议来定位网络资源;
  • host表示合法的Internet主机域名或者IP地址;
  • port指定一个端口号,缺省端口为80;
  • abs_path指定请求资源的URI
1.1.4 HTTP请求

HTTP请求由三部分组成:请求行、请求头、请求正文。

请求行包括:请求方式、请求路径、请求协议版本。
请求头:键-值对。

get请求:(只有请求行和请求头)
在这里插入图片描述
post请求:

格式:

请求行
请求头1
请求头2
...
请求空行
请求体
1.1.5 HTTP响应

HTTP响应也是由三部分组成:状态行、消息报头、响应正文。
状态行包括:响应协议版本、状态码(404、200等)、对状态码的说明。
在这里插入图片描述
响应正文:
在这里插入图片描述

格式:

状态行
响应头1
响应头2
...
响应空行
响应体
1.1.6 消息头

HTTP消息由请求和响应组成。
请求消息和响应消息都是由开始行(对于请求消息,即请求行;对于响应消息,即状态行)、消息报头(可选)、空行、消息正文(可选)组成。
报头域由 名字+":"+空格+值 组成,大小写无关。

请求头:
允许客户端向服务端传递请求的附加信息以及客户端自身的信息。

  • Referer:该请求头指明请求从哪里来。通常用来做统计工作、防盗链。

响应头:
允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对request-URL所标识的资源进行下一步访问的信息。

  • Location:Location响应报头域用于重定向接受者到一个新位置,常用在更换域名的时候。
response.sendRedirect("http://www.baidu.com");
  • Refresh:自动跳转(单位是秒),可以在页面通过meta标签实现,也可以在后台实现。
<meta http-equiv="refresh" content="3;url=http://www.baidu.com">
<!--
content="3"3秒刷新一次页面
content="3;url=http://www.baidu.com"	3秒后跳转到http://www.baidu.com
-->

2. Tomcat服务器

服务器是一种管理计算资源的计算机,在网络中为其它客户提供计算或者应用服务。
相对于普通PC来说,服务器在稳定性、安全性、性能等方面有更高的要求。
服务器统一接收客户请求,根据客户请求将资源分发给不同的方法去处理,方法处理完成后将结果返回。

2.1 Tomcat介绍

Tomcat是一个符合JavaEE WEB标准的最小的WEB容器。简单来说就是一个运行Java的网络服务器,底层是Socket的一个程序,也是JSP和Servlet的一个容器。
Tomcat默认占用端口8080。

2.2 Tomcat目录结构

在这里插入图片描述
conf:

  • server.xml文件配置server相关的信息,比如tomcat启动的端口号、主机(Host);
  • web.xml文件配置web应用(web站点);
  • tomcat-user.xml文件配置用户名密码和相关权限;

3. Servlet的实现

Servlet是server与applet的缩写,即服务端小程序的意思。
Servlet主要运行在服务器端,并由服务器调用执行,是一种按照Servlet标准开发的类。是SUN公司提供的一门用于开发动态Web资源的技术。
Servlet本质上也是Java类,但要遵循Servlet规范进行编写,没有main()方法,其创建、使用、销毁都由Servlet容器进行管理(如Tomcat)。提供了Servlet功能的服务器叫做Servlet容器。
Servlet是和HTTP协议紧密联系的,其可以处理HTTP协议相关的所有内容。

3.1 实现Servlet

  1. 创建普通Java类;
  2. 实现Servlet规范:即继承HttpServlet,并导入响应的包,让我们能够满足接收请求的要求,该类中已经完成了通信的规则,我们只需进行业务的实现即可。
  3. 重写service(或者doGet和doPost)方法:重写service方法用来做请求处理的操作,实现业务。
  4. 设置注解:在完成代码编写后,还需要向服务器说明,特定请求对应的特定资源。使用@WebServlet将一个继承于javax.servlet.http.HttpServlet的类定义为Servlet组件,标注为可以处理用户请求的Servlet。
package com.xx.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/s01")//4
public class Servlet00 extends HttpServlet {//2
    @Override//3
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.service(req, resp);
    }
}

Servlet实现方式:

  • 继承HttpServlet类
  • 继承GenericServlet类
  • 实现Servlet接口

3.2 Servlet的生命周期

Servlet不能独立运行,其运行完全由Servlet引擎来控制和调度。

  • 实例和初始化时机:请求到达容器时,容器查找该Servlet对象是否存在,不存在则创建实例并初始化。
  • 就绪/调用/服务阶段:有请求到达容器,容器会调用Servlet对象的service()方法,处理请求的方法在整个生命周期中可以被多次调用。
  • 销毁时机:容器关闭时(应用程序停止时),会将程序中的Servlet实例进行销毁。

init方法在Servlet实例创建之后执行:

public void init(ServletConfig config) throws ServletException {
	super.init();
}

service方法,每次有请求到达某个Servlet方法时执行,用来处理请求:

public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
	//super.service(req, res);
}

destory方法,Servlet实例销毁时执行:

public void destroy() {
	//super.destroy();
}

Servlet生命周期简单概括分为四步:
Servlet类加载–>实例化–>服务–>销毁

Tomcat与Servlet工作时序

  1. Web Client向Servlet容器(Tomcat)发送Http请求
  2. Servlet容器接收Web Client的请求
  3. Servlet容器创建一个HttpServletRequest对象,将Web Client请求的信息封装到这个对象中
  4. Servlet容器创建一个HttpServletResponse对象
  5. Servlet容器调用HttpServlet对象的service方法,把Request与Response作为参数,传给HttpServlet
  6. HttpServlet调用HttpServletRequest对象的有关方法,获取Http请求信息
  7. HttpServlet调用HttpServletResponce对象有关方法,生成响应数据
  8. Servlet容器把HttpServlet的响应结果传给Web Client
package com.xx.servlet;

import javax.jws.WebService;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import java.io.IOException;

//@WebServlet("/ser01")
@WebServlet(value={"/ser01","/ser001"})
public class Servlet01 extends HttpServlet {
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("hello servlet!");
        //通过流输出到浏览器
        res.getWriter().write("hello servlet!");
        System.out.println(req.getProtocol());
        req.setCharacterEncoding("UTF-8");
        System.out.println(req.getParameter("uname").toString());
        System.out.println(req.getParameter("upwd").toString());
    }

    @Override
    public void init() throws ServletException {
        super.init();
    }

    @Override
    public void destroy() {
        super.destroy();
    }
}

4. HttpServletResquest对象

HttpServletResquest对象:是ServletRequest的子接口,主要用来接收客户端发送过来的请求信息。

4.1 接收请求

  • getRequestURL() 获取客户端发出请求时完整的URL(http://…?)
  • getRequestURI() 获取请求中的资源名称部分(项目名称开始…?)
  • getQueryString() 获取请求行中的参数部分(?..)
  • getMethod() 获取客户端请求方式(GET/POST)
  • getProtocol() 获取Hppt版本号(HTTP/1.1)
  • getContextPath() 获取webapp名字(项目对外访问路径)
  • getParameter(name) 获取指定名称的参数
  • getParameterValues(String name) 获取指定名称参数的所有值(用于复选框)
@WebServlet("/s01")
public class Servlet00 extends HttpServlet {
	@Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String url=req.getRequestURL()+"";
        System.out.println("获取请求时的完整路径:"+url);
        String uri=req.getRequestURI();
        System.out.println("获取请求时的部分路径:"+uri);
        String method=req.getMethod();
        System.out.println("获取请求方式:"+method);
        String queryString=req.getQueryString();
        System.out.println("获取请求时的参数字符串:"+queryString);
        String protocol=req.getProtocol();
        System.out.println("获取当前协议版本:"+protocol);
        String webapp=req.getContextPath();
        System.out.println("获取项目的站点名:"+webapp);
        
        //获取指定名称的参数,返回字符串
        String uname=req.getParameter("uname");
        System.out.println("uname的参数值:"+uname);
        //获取指定名称参数的所有参数值,返回数组
        String[] hobbys=req.getParameterValues("hobby");
        System.out.println("获取指定名称参数的所有参数值"+ Arrays.toString(hobbys));
    }
}

4.2 请求乱码问题

由于现在request属于接收客户端的参数,在解析过程中默认的编码方式为 ISO-8859-1,次编码不支持中文,所以解析时会出现乱码。解决乱码问题需要设置request中的编码方式,告诉服务器解析数据的方式,或者在接收到乱码数据以后,通过相应的编码格式还原。
(Tomcat8以上一般GET方法不会乱码)

方法一:

  • request.setCharacterEncoding(“UTF-8”);//该方法仅对POST方法有效

方法二:

  • new String(request.getParameter(name).getBytes(“ISO-8859-1”),“UTF-8”);
    //借助了String对象的方法,通过设置服务器解析编码的格式(如果本身不乱码,用这种方式反而会乱码)
req.setCharacterEncoding("UTF-8");//该方法仅对POST方法有效
new String(req.getParameter("uname").getBytes("ISO-8859-1"),"UTF-8");

4.3 请求转发

请求转发是一种服务器的行为
客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的URL地址不变,得到相应后,服务端再将响应发给客户端,从始至终只有一个请求发出。request数据可以共享。

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	//req.getRequestDispatcher(url).forward(req,resp);
	
	//请求转发跳转到Servlet05
	//req.getRequestDispatcher("/s05").forward(req,resp);
	
	//请求转发跳转到jsp页面
	//req.getRequestDispatcher("login.jsp").forward(req,resp);
	
	//请求转发跳转到html页面
	 req.getRequestDispatcher("login.html").forward(req,resp);
}

Servlet05.java

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/s05")
public class Servlet05 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.service(req, resp);
        String uname=req.getParameter("uname");
        System.out.println("servlet05 uname :"+uname);
    }
}

4.4 Request作用域

通过该对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转失效。

设置域对象内容:

req.setAttribute(String name,Object value);

获取域对象内容:

req.getAttribute(String name);

删除域对象内容:

req.removeAttribute(String name);

request域对象中的数据在一次请求中有效,经过请求转发,request域中数据依然存在,因此在请求转发过程中可以通过request来传输/共享数据。

//设置域对象内容
req.setAttribute("name","admin");
req.setAttribute("age",18);
List<String> list=new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
req.setAttribute("list",list);
	
//请求跳转到index.jsp
req.getRequestDispatcher("index.jsp").forward(req,resp);

index.jsp

<%--如果要在jsp中写java代码,需要写在脚本段中--%>
<%
    //获取域对象内容
    //req.getAttribute(String name);
    String name=(String)request.getAttribute("name");
    System.out.println("name :"+name);
    Integer age=(Integer) request.getAttribute("age");
    System.out.println("age :"+age);
    List<String> list=(List<String>)request.getAttribute("list");
    //System.out.println("list :"+list.get(0));
%>

5. HttpServletResponse对象

Web服务器收到客户端的HTTP请求,会针对每一次请求,分别创建一个用于代表请求的request对象和代表响应的response对象。
request和response对象代表请求响应:获取客户端数据,需要通过request对象;向客户端输出数据,需要通过response对象。

5.1 响应数据

接收到客户端请求后,可以通过HttpServletResponse对象直接进行响应,响应时需要获取输出流。

有两种形式:(二者不能同时使用)

  • getWriter() 获取字符流(只能输出字符串)
  • getOutputStream() 获取字节流(能响应一切数据)
@WebServlet("/s01")
public class Servlet01 extends HttpServlet {
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        //设置编码格式解决乱码问题
        res.setContentType("text/html;charset=UTF-8");
        //PrintWriter writer=res.getWriter();
        //writer.write("<h2>你好</h2>");

        ServletOutputStream out=res.getOutputStream();
        out.write("<h2>你好</h2>".getBytes("UTF-8"));
    }
}

5.2 响应乱码问题

在响应中,如果我们响应的内容含有中文,则可能出现乱码。服务端和客户端的编码方式不同时会出现乱码。

getWriter()字符乱码解决:保证发送端和接收端编码格式一致,设置编码能够支持中文

//设置服务器编码格式
//response.setCharacterEncoding("UTF-8");
//设置客户端编码格式和响应的MIME类型
//response.setHeader("content-type","text/html;charset=UTF-8");

//同时设置客户端和服务端的编码方式
 res.setContentType("text/html;charset=UTF-8");

getOutputStream()字节乱码:指定客户端和服务端使用编码方式一致。解决方案同getWriter()

5.3 重定向

服务器指导客户端的行为。
客户端发出第一个请求,被服务器接收处理后,服务器会进行响应,
在响应的同时,服务器会给客户端一个新的地址,客户端接收到响应后,会立刻马上自动根据新地址发出第二次请求,服务器接收请求并做出响应,重定向完成。

特点:

  • 1.服务端指导,客户端行为
  • 2.存在两次请求
  • 3.地址栏会发生改变
  • 4.request对象不共享
//重定向到Servlet05
resp.sendRedirect("s05");
//重定向到index.jsp
resp.sendRedirect("index.jsp");
//重定向到http://www.baidu.com
resp.sendRedirect("http://www.baidu.com");

5.4 请求转发与重定向的区别

请求转发request.getRequestDispatcher().forward()响应重定向response.sendRedirect()
一次请求,数据在request域中共享两次请求,request域中数据不共享
服务器端行为客户端行为
只能请求转发到同一WEB应用中的组件,绝对地址定位到站点后可以指向任意资源,绝对地址可以写到http://
典型应用场景:访问Servlet处理业务逻辑,然后forward到JSP显示处理结果,浏览器URL不变典型应用场景:提交表单,处理成功后重定向到另一个JSP,浏览器URL改变

请求转发本质是在Servlet中调用其他的Servlet。降低Servlet之间的代码冗余。
响应重定向是Servlet处理完后,向客户端返回响应,告诉客户端需重新发起一个请求到目标地址。

6. Cookie对象

Cookie是浏览器提供的一种技术,通过服务器程序将一些只需保存在客户端,或在客户端进行处理的数据,放在本地计算机上,不需通过网络传输,因而提高网页处理效率,减少服务器负载,但是安全性差。

javax.servlet.http.Cookie	//操作Cookie的类

6.1 Cookie的创建与发送

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/cookie01")
public class Cookie01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	//创建Cookie对象
        Cookie cookie=new Cookie("name","value");
        //发送(响应)Cookie对象
        resp.addCookie(cookie);
    }
}

6.2 Cookie的获取

返回的是Cookie数组

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/cookie02")
public class Cookie02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies=req.getCookies();
        if(cookies != null&& cookies.length>0){
            for(Cookie cookie:cookies){
                String name=cookie.getName();
                String value=cookie.getValue();
                System.out.println("name :"+name);
                System.out.println("value:"+value);
            }
        }
    }
}

6.3 Cookie设置到期时间

Cookie cookie=new Cookie("name","value");
...
cookie.setMaxAge(num);//设置到期时间
resp.addCookie(cookie);
  • num为 负整数,表示只在浏览器内存存活,关闭浏览器即失效。(默认為-1)
  • num为正整数,存活秒数,存在磁盘中,浏览器关闭也会存活到到期时间。
  • num为零,删除该Cookie。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/cookie03")
public class Cookie03 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
        //负整数,默认-1,表示只在浏览器内存存活,关闭浏览器即失效
        Cookie cookie1=new Cookie("uname1","张三");
        cookie1.setMaxAge(-1);
        resp.addCookie(cookie1);
        
        //正整数,存活秒数,存在磁盘中,浏览器关闭也会存活到到期时间
        Cookie cookie2=new Cookie("uname2","张四");
        cookie2.setMaxAge(10);
        resp.addCookie(cookie2);
        
        //零,删除该cookie
        Cookie cookie3=new Cookie("uname3","张五");
        cookie3.setMaxAge(0);
        resp.addCookie(cookie3);
    }
}

6.4 Cookie的注意点

  • Cookie只在当前浏览器有效,不跨浏览器和电脑
  • Cookie同名会覆盖原先的Cookie
  • Cookie存储的大小和数量有上限
  • Cookie存中文需要通過URLEncoder.encode()來進行編碼,獲取時通過URLDecoder.decode()進行解碼
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;

@WebServlet("/cookie04")
public class Cookie04 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //cookie存中文问题
        String name="姓名";
        String value="张三";
        name= URLEncoder.encode(name);
        value= URLEncoder.encode(value);
        Cookie cookie=new Cookie(name,value);
        resp.addCookie(cookie);

        Cookie[] cookies= req.getCookies();
        if(cookies!=null&&cookies.length>0) {
            for (Cookie cook : cookies) {
                System.out.println(URLDecoder.decode(cook.getName()));
                System.out.println(URLEncoder.encode(cook.getValue()));
            }
        }
    }
}

6.5 Cookie的路径

只有访问的路径中包含Cookie对象的path值,才可以获取到该Cookie对象。

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/cookie05")
public class Cookie05 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        //当前服务器下任意项目的任意资源都可以获取cookie对象
        Cookie cookie01=new Cookie("name01","value01");
        cookie01.setPath("/");
        resp.addCookie(cookie01);
        
        //当前项目下的资源可以获取cookie对象(默认不设置的情况)
        Cookie cookie02=new Cookie("name02","value02");
        cookie02.setPath("/sr04");//设置当前站点名sr04
        resp.addCookie(cookie02);
        
        //指定项目下的资源可获取cookie对象
        Cookie cookie03=new Cookie("name03","value03");
        cookie03.setPath("/sr03");//设置指定项目站点名sr03
        resp.addCookie(cookie03);
        
        //指定目录下的资源可获取cookie对象
        Cookie cookie04=new Cookie("name04","value04");
        cookie04.setPath("/sr04/cookie02");//设置指定目录
        resp.addCookie(cookie04);
    }
}

7. HttpSession对象

HttpSession對象是javax.servlet.http.HttpSession的实例,该接口不存在父接口,因为session本身就属于HTTP协议的范畴。
对于服务器而言,每一个连接到它的客户端都是一个session,servlet容器使用此接口创建HTTP客户端和服务器之间的会话。一个会话通常对应一个用户。通过此接口可以查看和操作有关某个会话的信息,比如会话标识符、创建时间等。
每一个session只保存在当前浏览器中,并在相关页面取得。
session的作用是为了标识一次会话,即确认一个用户;并且在一次会话(一个用户的多次请求)期间共享数据。

request.getSession();	//获取当前会话的session对象(存在则获取,不存在则创建)
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * session对象获取时,如果对象存在则获取,不存在则创建
 */
@WebServlet("/s01")
public class Session01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取session
        HttpSession session=request.getSession();
        //获取session的会话标识符
        String id=session.getId();
        System.out.println(id);
        //获取session创建时间
        String creationTime=session.getCreationTime()
        System.out.println(creationTime);
        //获取session最后一次打印时间
        String lastAccessedTime=session.getLastAccessedTime();
        System.out.println(lastAccessedTime);
        //判断是否是新的session对象
        Boolean isNew=session.isNew();
        System.out.println(isNew);
    }
}

7.1 标识符JSESSIONID

每当一次请求到达服务器的时候,如果开启了会话(访问了session),服务器会首先查看客户端是否回传一个名为JSESSIONID的cookie。
如果没有则认为这是一次新的会话,会创建一个新的session对象,并用sessionId作为此处会话的一个标志。
如果有JSESSION这个cookie回传,服务器会根据JSESSIONID这个值去查找是否有id为JSESSIONID值的session对象,没有则创建新的session对象,并标志此次会话;有则认为是之前标志过的一次会话,返回该session对象。
叫做JSESSIONID的cookie当用户请求服务器时,如果访问了session,则服务器会创建一个名为JSESSIONID,值为获取到的session的sessionId的cookie对象,并添加到response对象中,响应给客户端,有效时间为关闭浏览器。
(session底层依赖Cookie来实现)

7.2 session域对象

  • session不销毁,域对象数据就可一直共享
  • 请求转发情况下request和session域对象均可共享,重定向情况下request域对象不可共享,而session对象可以
//获取session
HttpSession session=request.getSession();

//设置域对象
session.setAttribute("uname","admin");
session.setAttribute("upwd","123456");

//获取指定名称的session域对象
session.getAttribute("uname");

//删除域对象
//session.removeAttribute("upwd");

@WebServlet("/s02")
public class Session02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取session
        HttpSession session=request.getSession();
        //设置域对象
        session.setAttribute("uname","admin");
        session.setAttribute("upwd","123456");
        //删除域对象
        //session.removeAttribute("upwd");

        request.setAttribute("name","adminreq");

        //request.getRequestDispatcher("index.jsp").forward(request,response);
        response.sendRedirect("index.jsp");
    }
}

index.jsp

<body>
  <h2>获取域对象</h2>
  <%
    String uname=(String)request.getSession().getAttribute("uname");
    String upwd=(String)request.getSession().getAttribute("upwd");
    out.println("uname :"+uname);
    out.println("upwd  :"+upwd);
    String name=(String)request.getAttribute("name");
    out.println("name :"+name);
  %>
  </body>

7.3 session对象的销毁

  • tomcat默认session在没有操作的情况下存活时间为30分钟,可以在tomcat的conf目录下的web.xml文件修改
<session-config>
   <session-timeout>30</session-timeout>
</session-config>
  • 手动设置到期时间:单位为秒
session.setMaxInactiveInterval(int);
  • 立即销毁:
session.invalidate();
  • 关闭浏览器失效:(session底层依赖cookie,默认只在浏览器内存中存活,关闭浏览器即失效)
  • 关闭服务器失效

Session失效意味着此次会话结束,数据共享结束。

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/s03")
public class Session03 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取session
        HttpSession session=request.getSession();
        session.setMaxInactiveInterval(10);
        session.invalidate();
    }
}

8. ServletContext对象

每个web应用都有且仅有一个ServletContext对象,即Application对象(应用对象),该对象与应用程序相关。WEB容器启动时,会为每个web应用程序创建一个对应的ServletContext对象

作用:

  • 作为域对象来共享数据,此时数据在整个应用程序中有效。服务器关闭后失效
  • 该对象中保存了当前应用程序相关信息

8.1 ServletContext对象的获取

  • 通过request对象获取ServletContext对象
ServletContext servletContext= request.getServletContext();
  • 通过session对象获取ServletContext对象
ServletContext servletContext=request.getSession().getServletContext();
  • 通过ServletConfig对象获取ServletContext对象
ServletContext servletContext=getServletConfig().getServletContext();
  • 直接获取ServletContext对象
ServletContext servletContext=getServletContext();

常用方法:

ServletContext servletContext=request.getServletContext();
//获取当前服务器版本信息
String servertInfo=servletContext.getServerInfo();
//获取项目当前路径
String realPath=servletContext.getRealPath("/");
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/c01")
public class Servlet01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	/*获取ServletContext对象*/
        //通过request对象获取ServletContext对象
        ServletContext servletContext1= request.getServletContext();
       
        //通过session对象获取ServletContext对象
        ServletContext servletContext2=request.getSession().getServletContext();
       
        //通过ServletConfig对象获取ServletContext对象
        ServletContext servletContext3=getServletConfig().getServletContext();
        
        //直接获取ServletContext对象
        ServletContext servletContext4=getServletContext();

        /*常用方法*/
        //获取当前服务器版本信息
        String servertInfo=servletContext1.getServerInfo();
        System.out.println("serverInfo :"+servertInfo);
        //获取项目当前路径
        String realPath=servletContext1.getRealPath("/");
        System.out.println("realPath :"+realPath);
    }
}

8.2 ServletContext域对象

ServletContext域对象可以在整个应用程序共享某些数据。

ServletContext servletContext= request.getServletContext();
//设置域对象
servletContext1.setAttribute("name","admin");
//获得域对象
String name=(String)servletContext1.getAttribute("name");
//移除域对象
servletContext1.removeAttribute("name");

Servlet三大域对象:

  1. request域对象
    在一次请求中有效。请求转发有效,重定向失效。
  2. session域对象
    在一次会话中有效。请求转发和重定向都有效,session销毁后失效。
  3. servletContext域对象
    在整个应用程序中有效。服务器关闭后失效。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值