Servlet

本文详细介绍了Servlet技术中的关键概念,包括请求和响应对象、会话管理和数据共享机制等内容。探讨了Servlet、HTTPSession、Cookie的工作原理及应用场景,同时也涉及了监听器、拦截器的作用与配置。
  1. request.getSession(true):若存在会话则返回该会话,否则新建一个会话。HttpServletRequest.getSession(ture) 等同于 HttpServletRequest.getSession()

  2. request.getSession(false):若存在会话则返回该会话,否则返回NULL

一、Servlet四种数据共享方案

一、ServletContext接口

全局作用域对象。【应用域】
1、工作原理:每一个网站都存在一个全局作用域对象,这个对象相当于一个Map,将一个Servlet中的数据存入该对象,当前网站中其他的Servlet都可以从该对象中的得到数据并使用。
2、生命周期:贯穿于整个网站运行期间。

//存放
	ServletContext application=request.getServletContext();
	application.setAttribute("key","共享数据");
//获取
	ServletContext application=request.getServletContext();
	Object data=application.getAttribute("key");
二、cookie

1、工作原理:用户通过浏览器向myweb网站发送请求申请OneServlet,OneServlet在运行期间创建了一个cookie存储当前用户相关数据。OneServlet工作完毕后,将cookie写入到响应头交还给浏览器,浏览器收到响应包之后,将cookie存储在浏览器的缓存中。
用户通过同一个浏览器再次向myweb网站发送请求申请TwoServlet时,浏览器需要无条件的将myweb网站之前推送过来的cookie写入到请求头发送过去。
2、前提:两个Servlet来自于同一个网站并且为同一个浏览器/用户提供服务。
3、生命周期:默认情况下,浏览器关闭则销毁。但可以手动设置,要求浏览器将接受的cookie存放在客户端计算机的硬盘上,同时需要指定cookie在硬盘上的存活时间:cookie.setMaxAge(秒)

  • cookie.setMaxAge(1) : 表示cookie在1秒后被自动删除(存储在硬盘当中)

  • cookie.setMaxAge(0): 表示删除同名cookie

  • cookie.setMaxAge(-1) : 表示cookie不会被存储 (不会被存储在硬盘中,会放在浏览器运行内存中)

4、注意:一个cookie只能存放一个键值对,键和值的类型都只能是String,键不能是中文。

//存放
	Cookie card1=new Cookie("key","共享数据1");
	Cookie card2=new Cookie("key","共享数据2");
	/*将cookie响应到浏览器*/
	response.addCookie(card1);
	response.addCookie(card2);
//获取
	Cookie[] cookies=request.getCookies();
	for(Cookie cookie:cookies){
		System.out.println(cookie.getName());
		System.out.println(cookie.getValue());
	}
三、HttpSession接口

会话作用域对象。【会话域】
1、工作原理:Tomcat在创建一个cookie对象
1)cookie是用户与session的关联,浏览器关闭则cookie销毁,也就是用户与session的关联断开。但Tomcat无法检测浏览器是否关闭,因此浏览器关闭时session并不会销毁。
2)了解决这个问题,Tomcatsession对象设置了空闲时间,默认为30分钟,超过30分钟session将被销毁。另外,可以在web.xml文件中自定义session空闲时间。

//存放
	HttpSession session=request.getSession();
	session.setAttribute("key","共享数据");
//获取
	HttpSession session=request.getSession();
	Object data=session.getAttribute("key");


//额外的方法:销毁session对象
	session.invalidate();

//----------------------------------Web.xml 自定义session空闲时间----------------------------
<session-config>      //设置当前网站中每个session最大空闲时间为5分钟
    <session-timeout>5</session-timeout>
</session-config>

四、HttpServletRequest接口

请求作用域对象。【请求域】
1、工作原理:在同一个网站中,如果两个Servlet通过【请求转发】方式进行调用,则彼此之间共享一个请求协议包,而一个请求协议包只对应一个请求对象,此时可利用请求对象进行数据共享。
2、前提:Servlet共享同一个请求协议包(请求对象)。

3、请求对象在实现Servlet之间数据共享功能时,开发人员将请求对象称为【请求作用域对象】

常用的方法:request.getServletPath; 获取请求路径

	request.setAttribute("key","共享数据");
	request.getRequestDispatcher("/two").forward(request,response);
//获取 此处为别名/two的servlet
	Object data=request.getAttribute("key");

五、HttpSessionCookie区别:【面试题】
1)存储位置:  一个在天上,一个在地下
	Cookie:存放在客户端计算机(浏览器内存/硬盘)---->浏览器的缓存中
	HttpSession:存放在服务端计算机内存

2)数据类型:
	Cookie对象存储共享数据类型只能是String
	HttpSession对象可以存储任意类型的共享数据Object

3) 数据数量:
	一个Cookie对象只能存储一个共享数据
	HttpSession使用map集合存储共享数据,所以可以存储任意数量共享数据

4)参照物:
 	Cookie相当于客户在服务端【会员卡】
	HttpSession相当于客户在服务端【私人保险柜】
5)对象:
	Cookie 将会话的状态保存到浏览器客户端上
	HttpSession 将会话的状态保存到服务器端上

二、Http 报文结构

HTTP request报⽂结构
  • 行 请求方法 请求 url 协议版本
  • 头 若干个请求头,包括 general-header(通用头部),request-header(响应头部) 或者 entity-header(实体头部)。格式为:key: value
  • 空行 必须有空行
  • 体 可以有内容,也可以没有内容。如果是GET请求,请求体是为空的,如果是POST请求,请求体可以不为空
  • 举个例子

img

HTTP response报⽂结构
  • 行 协议版本 状态码 状态描述
  • 头 若干行响应头,包括:通用头部,响应头部,实体头部 。格式为:key: value
  • 空行 必须有空行
  • 体 主要的返回结果
  • 举个例子

img


三、Servlet监听器

概述:

1、Listener是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。监听的事件源分别为SerlvetConext,HttpSessionServletRequest这三个域对象。

实现:

不同功能的Listener 需要实现不同的 Listener 接口,一个Listener也可以实现多个接口,这样就可以多种功能的监听器一起工作。

2、8种监听器可以分为三类:

​ 1)监听 Session、request、context 的创建于销毁,分别为

HttpSessionListerServletContextListenerServletRequestListener

​ 2)监听对象属性变化,分别为:

HttpSessionAttributeListerServletContextAttributeListenerServletRequestAttributeListener

​ 3)监听Session 内的对象,分别为HttpSessionBindingListenerHttpSessionActivationListener。与上面六类不同,这两类 Listener 监听的是Session 内的对 象,而非 Session 本身,不需要在 web.xml中配置。

3、实现web.xml的Listener配置。

	1)<listener>标签与 <listener-class>标签

​	2)<listener>一般配置在 <servlet>便签的前面。
接口

4.ServletContextListener接口:

1)作用:通过这个接口合法的检测全局作用域对象被初始化时刻以及被销毁时刻。

2)监听事件处理方法:
public void contextInitlized() :在全局作用域对象被Http服务器初始化被调用。
public void contextDestory(): 在全局作用域对象被Http服务器销毁时候触发调用。

5.ServletContextAttributeListener接口:

1)作用:通过这个接口合法的检测全局作用域对象共享数据变化时刻。

2)监听事件处理方法:
public void contextAdd():在全局作用域对象添加共享数据。
public void contextReplaced():在全局作用域对象更新共享数据。
public void contextRemove():在全局作用域对象删除共享数据。

四、Servlet拦截器

一.介绍

(1)来自于Servlet规范下接口,在Tomcat中存在于servlet-api.jar包

(2)Filter接口实现类由开发人员负责提供,Http服务器不负责提供

(3) Filter接口在Http服务器调用资源文件之前,对Http服务器进行拦截

二.具体作用

1.拦截Http服务器,帮助Http服务器检测当前请求合法性.

2.拦截Http服务器,对当前请求进行增强操作.

三.Filter接口实现类开发步骤

其开发步骤一共有三步:

(1)创建一个Java类实现Filter接口

(2)重写Filter接口中doFilter方法,完成我们具体想要实现的功能。

(3)web.xml将过滤器接口实现类注册到Http服务器(此处我们是tomcat),并且可以设置去通知我们的Tomcat在调用何种资源文件前需要使用我们的过滤器类进行拦截。

四.Filter拦截地址格式

(1) 命令格式:

首先将我们的的Filter接口实现类注册到我们的tomcat容器

     <!--将过滤器类文件路径交给Tomcat-->
      <filter>
          <filter-name>oneFilter</filter-name>
          <filter-class>com.bjpowernode.filter.OneFilter</filter-class>
      </filter>
      <!--通知Tomcat在调用何种资源文件时需要被当前过滤器拦截-->
      <filter-mapping>
          <filter-name>oneFilter</filter-name>
          <url-pattern>想要拦截的路径</url-pattern>
      </filter-mapping>

首先使用filter将我们的过滤器接口实现类注册到我们的tomcat,然后此时再使用filter-mapping来指定我们注册到tomcat的过滤器类需要拦截哪个资源文件。

(2)下面我们来介绍下 中可以放入哪些拦截路径,假设此时我们设置的过滤器类为OneFilter

要求Tomcat在调用某一个具体文件之前,来调用OneFilter拦截
/img/mm.jpg

要求Tomcat在调用某一个文件夹下所有的资源文件之前,来调用OneFilter拦截
/img/*

要求Tomcat在调用任意文件夹下某种类型文件之前,来调用OneFilter拦截
*.jpg

要求Tomcat在调用网站中任意文件时,来调用OneFilter拦截
/*

要求Tomcat在调用网站中的某个动态资源文件(servlet实现类)时,来调用OneFilter拦截

<url-pattern>/请求资源别名</url-pattern>  注意:此处的请求资源别名指的是我们在web.xml所设置的访问我们某个servlet实现类时候的请求别名。

当我们在网站中输入 http://localhost:8080/网站名/想要拦截的资源文件/ 这个路径的时候便会先进行拦截,然后再去访问我们的资源文件。

五.代码实现

代码逻辑:当用户在前台进行登录的时候,会输入自己的姓名密码,点击提交后,此时需要一个Filter接口实现类来验证我们输入的姓名密码是否与我们之前注册的账号和密码相同,如果相同的话,此时再继续访问我们点击提交后想要访问的地址,假设此时点击提交后浏览器的访问地址为http://localhost:8080/myweb/one

1:首先我们先编写一个前端页面:里面需要放入我们的登录页面的代码,在action中指定提交后我们想要访问的地址。

登陆界面 用户名称: 用户密码: 提交按钮: Duplicate entry '60' for key 'dept.PRIMARY'

2:然后再写我们的Filter接口实现类:假设此时之前我们注册的姓名为王五,密码为123。

public class OneFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    servletRequest.setCharacterEncoding("utf-8");
    String name=servletRequest.getParameter("username");
    String password=servletRequest.getParameter("password");
    if(name.equals("王五")&&password.equals("123")){
        //将拦截请求对象和响应对象交还给Tomcat,由Tomcat继续调用资源文件
        filterChain.doFilter(servletRequest,servletResponse);
    }else{
        servletResponse.setContentType("text/html;charset=utf-8");
        PrintWriter printWriter=servletResponse.getWriter();
        printWriter.print("请重新输入");
    }
}

注意事项:当if语句中我们校验成功后,需要将我们的拦截请求对象和响应对象交还给Tomcat,由Tomcat继续调用资源文件,所以此时需要我们的过滤器链条对象filterChain调用doFilter方法将拦截请求对象和响应对象交还给Tomcat,注意filterChain所调用的doFilter方法是它自己的,并不是Filter接口类中的doFilter方法,如下图所示:

我们一般将这个交还的动作称为放行。

如果前台用户输入的姓名和密码有误的话,就提醒用户重新输入,此时我们的过滤器代替Http服务器拒绝本次请求

3:编写完我们的过滤器接口实现类OneFilter后,再编写我们的OneServlet接口实现类,此类是当用户校验成功后,继续访问的动态资源文件。

public class OneServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name=req.getParameter("username");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter printWriter=resp.getWriter();
        printWriter.print("用户的姓名为"+name);
        System.out.println();
        printWriter.print("用户的密码输入正确");
        printWriter.flush();
    }
}

此处就假设当用户通过校验后,显示姓名和密码正确即可。

4:最后在web.xml文件中进行我们的配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <filter>
        <filter-name>onefilter</filter-name>
        <filter-class>com.bjpowernode.Filter.OneFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>onefilter</filter-name>
        <url-pattern>/one</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>OneServlet</servlet-name>
        <servlet-class>com.bjpowernode.controller.OneServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>OneServlet</servlet-name>
        <url-pattern>/one</url-pattern>
    </servlet-mapping>
</web-app>

注意事项:中的处填写的应该是我们想要拦截的资源路径,因为我们是想在访问OneServlet的时候进行一个校验,所以此处就填写我们的请求别名/one即可。


五、 Get与Post

1. get
  • 前面的例子:https://api.github.com/search/users?q=JakeWharton 就是一个非常典型的 GET 请求的表现形式,即请求的数据会附在 URL 之后(放在请求行中),以 ? 分割 URL 和传输数据,多个参数用 & 连接。

  • 除此之外,根据 HTTP 规范,GET 用于信息获取,而且应该是安全幂等的 。

    • 安全性指的是非修改信息,即该操作用于获取信息而非修改信息。换句话说,GET请求一般不应产生副作用,也就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。
    • 幂等性 (Idempotence) 则指的是无论调用这个URL 多少次,都不会有不同的结果的 HTTP 方法。而在实际过程中,这个规定没有那么严格。例如在一个新闻应用中,新闻站点的头版不断更新,虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。
  • GET 是会被浏览器主动缓存的,如果下一次传输的数据相同,那么就会返回缓存中的内容,以求更快地展示数据。

  • GET 方法的 URL 一般都具有长度限制,但是需要注意的是 HTTP 协议中并未规定 GET 请求的长度。这个长度限制主要是由浏览器和 Web 服务器所决定的,并且各个浏览器对长度的限制也各不相同。

  • 从服务器上获取数据

  • GET 方法只产生一个 TCP 数据包,浏览器会把请求头和请求数据一并发送出去,服务器响应 200 ok(返回数据)。

2. post
  • 根据 HTTP 规范,POST 表示可能修改变服务器上的资源的请求。例如我们在刷知乎的时候对某篇文章进行点赞,就是提交的 POST 请求,因为它改变了服务器中的数据(该篇文章的点赞数)。

  • 向服务器提交数据

  • POST 方法因为有可能修改服务器上的资源,所以它是不符合安全和幂等性的。

  • 从前面关于 POST 的请求报文也可以看出,POST 是将请求信息放置在请求数据中的,这也是 POST 和 GET 的一点不那么重要的区别。

  • 因为 POST 方法的请求信息是放置在请求数据中的,所以它的请求信息是没有长度限制的。

  • POST 方法会产生两个 TCP 数据包,浏览器会先将请求头发送给服务器,待服务器响应100 continue,浏览器再发送请求数据,服务器响应200 ok(返回数据)。这么看起来 GET 请求的传输会比 POST 快上一些(因为GET 方法只发送一个 TCP 数据包),但是实际上在网络良好的情况下它们的传输速度基本相同。


六、默认欢迎界面

<!--    自定义默认欢迎资源文件    -->
    <welcome-file-list>
        <welcome-file>login.html</welcome-file>
        <!--
             <welcome-file>UAS</welcome-file>       servlet作为默认资源时,其斜线必须抹掉
        -->
    </welcome-file-list>

七、HttpServletRequest 接口

Map<String, String[]> parameterMap = request.getParameterMap();//获取Map
Enumeration<String> parameterNames = request.getParameterNames();//获取Map中的Key
String value = request.getParameter(String name);//获取对应键的值
String values[] = request.getParameterValues(String name);//根据key获取Map集合中的value

八、JavaBean

规范
/*
	一个JavaBean一般是有规范的:
		有无参数的构造方法;
		属性私有化;
		对外提供 Getter和 Setter方法;
		重写 toString();
		重写 hashCode() 和 equeal()方法;
		实现 java.io.serializable接口;
*/

九、内置对象Session与httpSession对象

Session对象

  1. Session对象是一个JSP内置对象,它在第一个JSP页面被装载时自动创建,完成会话期管理。从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要Session对象。
    Session对象的ID
  2. 当一个客户首次访问服务器上的一个JSP页面时,JSP引擎产生一个Session对象,同时分配一个String类型的ID号,JSP引擎同时将这换个ID号发送到客户端,存放在Cookie中,这样Session对象,直到客户关闭浏览器后,服务器端该客户的Session对象才取消,并且和客户的会话对应关系消失。当客户重新打开浏览器再连接到该服务器时,服务器为该客户再创建一个新的Session对象。

Session对象的常用方法
● public String getId():获取Session对象编号。
● public void setAttribute(String key,Object obj):将参数Object指定的对象obj添加到Session对象中,并为添加的对象指定一个索引关键字。
● public Object getAttribute(String key):获取Session对象中含有关键字的对象。
● public Boolean isNew():判断是否是一个新的客户。

  1. HttpSession 服务端的技术
    服务器会为每一个用户创建一个独立的HttpSession

  2. HttpSession原理
    当用户第一次访问Servlet时,服务器端会给用户创建一个独立的Session
    并且生成一个SessionID,这个SessionID在响应浏览器的时候会被装进cookie中,从而被保存到浏览器中
    当用户再一次访问Servlet时,请求中会携带着cookie中的SessionID去访问
    服务器会根据这个SessionID去查看是否有对应的Session对象
    有就拿出来使用;没有就创建一个Session(相当于用户第一次访问)

域的范围:
Context域 > Session域 > Request域
Session域 只要会话不结束就会存在 但是Session有默认的存活时间(30分钟)


一、内置对象

(1)概念
Session对象是一个JSP内置对象,它在第一个JSP页面被装载时自动创建,完成会话期管理。从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要Session对象。
(2)Session对象的ID
当一个客户首次访问服务器上的一个JSP页面时,JSP引擎产生一个Session对象,同时分配一个String类型的ID号,JSP引擎同时将这换个ID号发送到客户端,存放在Cookie中,这样Session对象,直到客户关闭浏览器后,服务器端该客户的Session对象才取消,并且和客户的会话对应关系消失。当客户重新打开浏览器再连接到该服务器时,服务器为该客户再创建一个新的Session对象。
(3)Session对象的常用方法
● public String getId():获取Session对象编号。
● public void setAttribute(String key,Object obj):将参数Object指定的对象obj添加到Session对象中,并为添加的对象指定一个索引关键字。
● public Object getAttribute(String key):获取Session对象中含有关键字的对象。
● public Boolean isNew():判断是否是一个新的客户。

二、httpsession

(1)概念
HttpSession 是服务器端的技术,服务器会为每一个用户创建一个独立的Session。 属于回话的之一。

(2)原理
当用户第一次访问Servlet时,服务器端会给用户创建一个独立的Session
并且生成一个SessionID,这个SessionID在响应浏览器的时候会被装进cookie中,从而被保存到浏览器中
当用户再一次访问Servlet时,请求中会携带着cookie中的SessionID去访问
服务器会根据这个SessionID去查看是否有对应的Session对象
有就拿出来使用;没有就创建一个Session(相当于用户第一次访问)

(3)HttpSession生命周期
什么时候创建HttpSession
1).对于JSP:
  是否浏览器访问服务端的任何一个JSP或Servlet,服务器都会立即创建一个HttpSession对象呢? 不一定。
  ①.若当前的JSP或(Servlet)是客户端访问的当前WEB应用的第一个资源,且JSP的page指定的session属性为false,则服务器就不会为JSP创建一个HttpSession对象;
  ②.若当前JSP不是客户端访问的当前WEB应用的第一个资源,且其他页面已经创建一个HttpSession对象,则服务器也不会为当前JSP创建一个新的HttpSession对象,而会把和当前会话关联的那个HttpSession对象返回给当前的JSP页面。

2).page指令的session="false"到底表示什么意思:当前JSP页面禁用session隐含变量!但可以使用其他的显式的对象

3).对于Servlet而言:
  若Servlet是客户端访问的第一个WEB应用的资源,则只有调用了request.getSession()或request.getSession(true) 才会创建HttpSession对象

4). 在Servlet中如何获取HttpSession对象?
  request.getSession(boolean create):create为false,若没有和当前JSP页面关联的HttpSession对象,则返回null;
  若有返回true create为true一定返回一个HTTPSession对象。若没有和昂前JSP页面关联的HttpSession对象,则服务器创建一个新的HttpSession对象返回,若有,则直接返回关联。
  request.getSession()等同于request.getSession(true)

什么时候销毁HttpSession对象:
1).直接调用HttpSession的invalidate()方法:使HttpSession失效
2).服务器卸载了当前Web应用。
3).超出HttpSession的过期时间。


十、@WebServlet注解

@WebServlet 注解的属性

@WebServlet 用于将一个类声明为 Servlet,该注解会在部署时被容器处理,容器根据其具体的属性配置将相应的类部署为 Servlet。该注解具有下表给出的一些常用属性。

属性名类型标签描述是否必需
nameString指定 Servlet 的 name 属性。 如果没有显式指定,则取值为该 Servlet 的完全限定名,即包名+类名。
valueString[ ]该属性等价于 urlPatterns 属性,两者不能同时指定。 如果同时指定,通常是忽略 value 的取值。
urlPatternsString[ ]指定一组 Servlet 的 URL 匹配模式。
loadOnStartupint指定 Servlet 的加载顺序。
initParamsWebInitParam[ ]指定一组 Servlet 初始化参数。
asyncSupportedboolean声明 Servlet 是否支持异步操作模式。
descriptionString指定该 Servlet 的描述信息。
displayNameString指定该 Servlet 的显示名。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值