JSP&Servlet学习笔记(上)

Posted 二木成林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP&Servlet学习笔记(上)相关的知识,希望对你有一定的参考价值。

目录

 

1. Web相关概念

1.1 软件架构

1.2 资源分类

1.3 网络通信三要素

2. Tomcat

2.1 web服务器软件概念

2.2 常见的java相关的web服务器软件

2.3 Tomcat

2.3.1 Tomcat的下载、安装与卸载

2.3.2 Tomcat的启动

2.3.3 Tomcat的关闭

2.3.4 Tomcat的配置

2.3.5 将Tomcat集成到IDEA中

3.Servlet入门

3.1 Servlet概念

3.2 快速入门

3.3 Servlet执行原理

3.4 Servlet的生命周期

3.5 Servlet3.0

3.6 Servlet的体系结构

3.7 Servlet相关配置

3.8 IDEA与Tomcat的相关配置

4. HTTP

4.1 概念

4.2 请求消息数据格式

4.2.1 请求行

4.2.2 请求头

4.2.3 请求空行

4.2.4 请求体(正文)

4.3 响应消息数据格式

4.3.1 响应行

4.3.2 响应头

4.3.3 响应空行

4.3.4 响应体

5. Servlet的Request对象

5.1 request对象和request对象的原理

5.2 Request对象的继承体系结构

5.3 Request对象的功能

5.3.1 获取请求消息数据

5.4 Request对象的其他功能

5.4.1 获取请求参数的通用方式

5.4.2 请求转发

5.4.3 共享数据

5.4.4 获取ServletContext

5.5 案例:用户登录

5.5.1 用户登录案例需求

5.5.2 代码开发实现

5.5.3 资源路径写法

6. Servlet的Response对象

6.1 Response对象的功能

6.1.1 设置响应行

6.1.2 设置响应头

6.1.3 设置响应体

6.2 Response对象的功能的应用

6.2.1 重定向

6.2.2 服务器输出字符串数据到浏览器

6.2.3 服务器输出字节数据到浏览器

6.2.4 实现验证码

6.3 ServletContext对象

6.3.1 概念

6.3.2 获取该对象的方法

6.3.3 功能

6.4 案例之文件下载

6.4.1 文件下载需求

6.4.2 分析

6.4.3 代码实现

7. 会话技术

7.1 概述

7.2 Cookie

7.2.1 概念

7.2.2 快速入门

7.2.3 实现原理

7.2.4 cookie细节

7.2.5 Cookie的特点和作用

7.2.6 案例-记住上一次访问时间

7.3 Session

7.3.1 概念

7.3.2 快速入门

7.3.3 原理

7.3.4 细节

7.3.5 session特点


注:JSP&Servlet学习笔记(下)

1. Web相关概念

1.1 软件架构

常见软件架构分为以下两类:

  • C/S:客户端/服务器端
  • B/S:浏览器/服务器端

1.2 资源分类

web资源分为静态资源和动态资源两种。

静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源。静态资源可以直接被浏览器解析。如: html,css,javascript.......

动态资源:每个用户访问相同资源后,得到的结果可能不一样。称为动态资源。动态资源被访问后,需要先转换为静态资源,在返回给浏览器。如:servlet/jsp,php,asp....

1.3 网络通信三要素

  • IP:电子设备(计算机)在网络中的唯一标识。
  • 端口:应用程序在计算机中的唯一标识。 0~65536
  • 传输协议:规定了数据传输的规则。常用基础协议:
    • tcp:安全协议,三次握手。 速度稍慢。
    • udp:不安全协议。 速度快。

 


 

2. Tomcat

2.1 web服务器软件概念

服务器:安装了服务器软件的计算机。

服务器软件:接收用户的请求,处理请求,做出响应的软件。

web服务器软件:接收用户的请求,处理请求,做出响应。在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目。

2.2 常见的java相关的web服务器软件

  • webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
  • webSphere:IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
  • JBOSS:JBOSS公司的,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
  • Tomcat:Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范servlet/jsp。开源的,免费的。

而我们主要学习的就是tomcat。

JavaEE:是Java语言在企业级开发中使用的技术规范的总和,一共规定了13项大的规范。

2.3 Tomcat

2.3.1 Tomcat的下载、安装与卸载

tomcat的地址地址:http://tomcat.apache.org/

下载下来后将压缩包解压即可,就已经安装完成了。

(注意:安装目录(即存放Tomcat解压缩后的目录文件夹)不要有中文和空格。)

如果要卸载tomcat的话,直接删除安装路径就可以了。

2.3.2 Tomcat的启动

找到bin目录下的startup.bat,双击运行该文件即可。

会出现一个黑框,打印着日志

接着在浏览器输入http://localhost:8080即可访问了

在使用过程中可以遇到问题:

  • (1)黑窗口一闪而过
    • 原因:没有正确配置JAVA_HOME环境变量
    • 解决方案:正确配置JAVA_HOME环境变量,百度解决。
  • (2)启动报错端口被占用
    • 原因:80880端口被占用
    • 解决:关闭掉被占用的端口。有以下两种解决方案:
      • ①找到占用的端口号,并且找到对应的进程,杀死该进程。通过netstat -ano在DOS窗口找到8080被占用的端口。
      • ②修改自身的端口号,通过conf/server.xml配置文件

注:一般会将tomcat的默认端口号修改为80。80端口号是http协议的默认端口号。

2.3.3 Tomcat的关闭

关闭tomcat分为正常关闭和强制关闭。

  • 正常关闭:
    • 找到bin/shutdown.bat,双击运行即可。
    • 使用快捷键Ctrl+C
  • 强制关闭:
    • 点击启动窗口的×

2.3.4 Tomcat的配置

Tomcat的目录结构如下:

部署配置项目的方式有如下三种:

1. 直接将项目放到webapps目录下即可。

然后通过/Demo3_war这样的方式访问,其中/Demo3_war是项目的访问路径,也是该项目的根目录文件夹名称。

除了上面的,还可以简化部署,将项目打成一个war包,再将war包放置到webapps目录下,war包会自动解压。

2. 配置conf/server.xml文件(这种配置很不安全,可能弄坏整个tomcat的配置)

在<Host>标签中作如下配置:

其中D盘的hello目录下有如下文件作为测试:

在浏览器进行访问:

注:不推荐使用,不便于管理项目。

3. 在conf\\Catalina\\localhost创建任意名称的xml文件

重启tomcat,浏览器进行访问

下面介绍下Java动态项目的目录结构:

  • 项目的根目录
    • WEB-INF目录:
      • web.xml:web项目的核心配置文件
      • classes目录:放置字节码文件的目录
      • lib目录:放置依赖的jar包

2.3.5 将Tomcat集成到IDEA中

使用IDEA创建一个JavaEE项目,并部署项目。

点击“New”集成tomcat

集成成功

然后点击“Next”创建web项目

如下创建项目完成

点击绿色箭头运行,会自动打开浏览器

项目集成成功。

下面说下一些基本使用:

  • 热部署静态资源

即在web下创建一些如html文件,在html更新内容等,都不需要再重启tomcat,直接刷新浏览器就能访问了。

  • 配置虚拟路径

配置后,浏览器输入:http://localhost:8080/hello/才能访问

如果不配置,浏览器通过http://localhost:8080/就能访问

 


 

3.Servlet入门

3.1 Servlet概念

Servlet是运行在服务器端的小程序,servlet全称是server applet。

实际上Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。

我们(程序员)使用的时候,就是自定义一个类来实现Servlet接口,复写方法。

3.2 快速入门

步骤:

  • (1)使用IDEA创建JavaEE项目。
  • (2)自定义一个类,实现Servlet接口。
  • (3)实现接口中的抽象方法,主要是在service()方法中输出。
  • (4)在web.xml中配置Servlet

第一步:创建一个JavaEE项目

第二步:自定义一个类,实现Servlet接口

public class HelloServlet implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

第三步:实现接口中的抽象方法,主要是在service()方法中输出。

第四步:在web.xml中配置Servlet

    <!--配置Servlet -->
    <servlet>
        <servlet-name>helloServlet</servlet-name>
        <servlet-class>com.demo.servlet.HelloServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

第五步:测试

运行tomcat,浏览器输入:http://localhost:8080/hello控制台查看打印结果

发现service()方法被执行。

3.3 Servlet执行原理

执行原理如下图:

  • 1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
  • 2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。
  • 3. 如果有,则在找到对应的<servlet-class>全类名
  • 4. tomcat会将全类名所代表的字节码文件加载进内存,并且创建其对象
  • 5. 调用其方法,这里调用了service()方法。

3.4 Servlet的生命周期

如下图:

(1)被创建:执行init()方法,只执行一次。

①概述

Servlet什么时候被创建?即第一次被访问时,Servlet才会被创建。

即只有访问如上http://localhost:8080/hello才会执行init()方法和service()方法

但是,可以手动配置执行Servlet的创建时机。

②手动配置创建Servlet的时机

配置方法如下(在web.xml的<servlet>标签下配置):

  • 第一次访问时,创建Servlet,那么设置<load-on-startup>值为负数,默认值为-1.

下面的配置就会在第一次访问时创建Servlet,同不配置产生一样的效果。

  • 在服务器启动时,创建Servlet,那么设置<load-on-startup>值为0正整数

使用如下配置时,在启动服务器后就会执行init()方法,创建Servlet,控制台也会输出"init..."

③可能存在的线程安全问题

Servlet的init()方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的。

多个用户同时访问时,如果Servlet中定义了成员变量,则可能存在线程安全问题。

解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值。

(2)提供服务:执行service()方法,执行多次。

每次访问Servlet时,service()方法都会被调用一次。

即访问如上http://localhost:8080/hello都会执行service()方法,就可以看到控制台不断打印"service..."

(3)被销毁:执行destroy()方法,只执行一次。

  • 该destroy()方法是Servlet被销毁时才执行。
  • 什么时候Servlet被销毁呢?当服务器关闭时,Servlet被消耗。
  • 但注意,只有服务器正常关闭时,才会执行destroy方法。
  • destroy方法在Servlet被销毁之前执行,一般用于释放资源

除了上面三个关于servlet生命周期的方法之外,实现Servlet接口还有两个方法getServletConfig()和getServletInfo()。

  • getServletConfig()方法获取ServletConfig对象,即Servlet的配置对象
  • getServletInfo()方法获取servlet的一些信息,关于版本、作者的信息

3.5 Servlet3.0

(1)概述

Servlet3.0比较显著的好处是支持注解配置,即不需要配置web.xml文件了。

其他特性请参考:Servlet 3.0 新特性详解

(2)使用步骤

使用步骤如下:

  • 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
  • 定义一个类,实现Servlet接口
  • 复写方法
  • 在类上使用@WebServlet注解,进行配置

第一步:创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml

第二步:定义一个类,实现Servlet接口

public class HelloServlet implements Servlet {

}

第三步:复写方法

public class HelloServlet implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init...");
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) {
        System.out.println("service...");
    }

    @Override
    public void destroy() {
        System.out.println("destroy...");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public String getServletInfo() {
        return null;
    }
}

第四步:在类上使用@WebServlet注解,进行配置

其中该注解

@WebServlet(urlPatterns = "/hello")

// 可以简写为如下形式:
// @WebServlet("资源路径")
@WebServlet("/hello")

等价于

    <!--配置Servlet -->
    <servlet>
        <servlet-name>helloServlet</servlet-name>
        <servlet-class>com.demo.servlet.HelloServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

查看@WebServlet注解的源代码,如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
    String name() default "";//相当于<Servlet-name>

    String[] value() default {};//代表urlPatterns()属性配置

    String[] urlPatterns() default {};//相当于<url-pattern>

    int loadOnStartup() default -1;//相当于<load-on-startup>

    WebInitParam[] initParams() default {};

    boolean asyncSupported() default false;

    String smallIcon() default "";

    String largeIcon() default "";

    String description() default "";

    String displayName() default "";
}

3.6 Servlet的体系结构

为什么会说到Servlet体系结构呢?实现一个Servlet接口,但实际使用的只有service()方法,其他方法基本上用不到,还不能删除。

(1)Servlet

该类要实现五个方法,但常用的只有一个service()方法

@WebServlet(urlPatterns = "/hello")
public class HelloServlet implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

(2)GenericServlet

该类将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象。

因此将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可。

@WebServlet("/hello2")
public class HelloServlet2 extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }
}

(3)HttpServlet

这才是最常用的实现类,屏蔽了对请求方式的判断处理。

对http协议的一种封装,简化操作。

如图:

实现上查看HttpServlet的源代码的service()方法,正是对请求方法getMethod()的封装。

一般自定义类使用该类的步骤如下:

  • 定义类继承HttpServlet
  • 复写doGet/doPost方法
public class HelloServlet3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
    }
}

3.7 Servlet相关配置

(1)urlPartten:Servlet访问路径

由下图可以看出<url-partten>对应的是Servlet访问路径

使用注解后对应的就是urlPartten参数,该参数指向Servlet访问路径。

注意:

  • 一个Servlet可以定义多个访问路径 : @WebServlet({"/d4","/dd4","/ddd4"})
  • 路径定义规则:
    • /xxx:路径匹配。例如"/login"等
    • /xxx/xxx:多层路径,目录结构。/xxx/*表示匹配xxx目录下的任意Servlet。例如"/user/login"等。
    • *.do:扩展名匹配,不要加"/",否则会报错

3.8 IDEA与Tomcat的相关配置

1、IDEA会为每一个tomcat部署的项目单独建立一份配置文件

运行一个Servlet项目后,可以在控制台看到如下的输出日志:

注意Using CATALINA_BASE,复制它对应的路径,在本地资源管理器打开:

打开conf目录,里面就是配置文件

如server.xml配置文件中可以修改端口、虚拟目录等。

但我们同IDEA集成使用后,不需要再在这个配置文件中修改,只需要在IDE界面中修改就会同步到配置文件的修改中:

发现配置文件也同步修改了

如果要查看项目的所在目录,可以在/conf/Catalina/localhost下查看这个xml配置文件

打开查看,就是项目实际所在的目录

再将这个目录在资源管理器中打开,就是本项目

工作空间项目  和  tomcat部署的web项目

  • tomcat真正访问的是“tomcat部署的web项目”,"tomcat部署的web项目"对应着"工作空间项目" 的web目录下的所有资源
  • WEB-INF目录下的资源不能被浏览器直接访问。

 


 

4. HTTP

4.1 概念

HTTP全称是Hyper Text Transfer Protocol,即是超文本传输协议。

什么是传输协议?即定义了客户端和服务器端通信时,发送数据的格式。

特点:

  • 基于TCP/IP的高级协议
  • 默认端口号:80
  • 基于请求/响应模型的:一次请求对应一次响应
  • 无状态的:每次请求之间相互独立,不能交互数据

历史版本:

  • 1.0:每一次请求响应都会建立新的连接
  • 1.1:复用连接

4.2 请求消息数据格式

通过浏览器向Servlet发送一个请求,然后浏览器F12查看,可以看到请求头和响应头。

将GET请求头原始信息复制下来,如下:

GET /hello HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: Webstorm-bbf7ba1a=9f630819-8a4f-40ea-8164-7a71918ee9aa; Idea-d1852ee0=946448e7-234a-4caa-83bb-38b847d8fb58; JSESSIONID=ADE0A02EA8BCCC03020517D711FFF2A9
Upgrade-Insecure-Requests: 1

将POST请求头原始信息复制下来,如下:

POST /hello HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
Origin: http://localhost:8080
Connection: keep-alive
Referer: http://localhost:8080/postSubmit.jsp
Cookie: Webstorm-bbf7ba1a=9f630819-8a4f-40ea-8164-7a71918ee9aa; Idea-d1852ee0=946448e7-234a-4caa-83bb-38b847d8fb58; JSESSIONID=86AE0FB0BDD6142DDD4B6A3AD2438374
Upgrade-Insecure-Requests: 1

请求消息是客户端发送给服务器端的数据,请求消息的数据格式分为:

  • 请求行
  • 请求头
  • 请求空行
  • 请求体(正文)

4.2.1 请求行

请求行定义了请求方式、请求URL与请求协议/版本号相关信息。

GET /hello HTTP/1.1

关于请求方式,HTTP协议有7种请求方式,常用的有如下两种:

  • GET
  • POST
    • 1. 请求参数在请求体中
    • 2. 请求的url长度没有限制的
    • 3. 相对安全

4.2.2 请求头

请求头定义了客户端浏览器要告诉服务器的一些信息。

Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: Webstorm-bbf7ba1a=9f630819-8a4f-40ea-8164-7a71918ee9aa; Idea-d1852ee0=946448e7-234a-4caa-83bb-38b847d8fb58; JSESSIONID=ADE0A02EA8BCCC03020517D711FFF2A9
Upgrade-Insecure-Requests: 1

常见的请求头:

  • User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息,是浏览器版本信息
    • 作用:可以在服务器端获取该头的信息,解决浏览器的兼容性问题
  • Referer:告诉服务器,我(当前请求)从哪里来?例如: http://localhost/login.html
    • 作用:防盗链;统计工作。

4.2.3 请求空行

空行,就是用于分割POST请求的请求头,和请求体的。

4.2.4 请求体(正文)

GET方式是没有请求体的。

封装POST请求消息的请求参数的。

4.3 响应消息数据格式

将响应头数据信息复制下来,如下:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Length: 0
Date: Thu, 10 Dec 2020 02:20:53 GMT

有响应数据的情况下会有数据

响应消息是服务器端发送给客户端的数据,数据格式如下:

  • 响应行
  • 响应头
  • 响应空行
  • 响应体:传输的数据

4.3.1 响应行

HTTP/1.1 200 OK

响应行的组成:协议/版本 响应状态码 状态码描述

响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。

  • 状态码都是3位数字
  • 状态码的分类:
    • 1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
    • 2xx:成功。代表:200
    • 3xx:重定向。代表:302(重定向),304(访问缓存)
    • 4xx:客户端错误。代表如下:
      • 404(请求路径没有对应的资源)
      • 405:请求方式没有对应的doXxx方法
    • 5xx:服务器端错误。代表:500(服务器内部出现异常)

4.3.2 响应头

Server: Apache-Coyote/1.1
Content-Length: 0
Date: Thu, 10 Dec 2020 02:20:53 GMT

常见的响应头:

  • Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式。
  • Content-disposition:服务器告诉客户端以什么格式打开响应体数据。可选择的值有如下两种:
    • in-line:默认值,在当前页面内打开
    • attachment;filename=xxx:以附件形式打开响应体。文件下载

4.3.3 响应空行

4.3.4 响应体

响应传输的数据,有字符串也有二进制数据,都会由浏览器解析。

(建议:使用抓包工具查看请求信息与响应信息,学习更为直观)

 


 

5. Servlet的Request对象

5.1 request对象和request对象的原理

request和response对象是由服务器创建的。我们来使用它们。

request对象是来获取请求消息,response对象是来设置响应消息。

5.2 Request对象的继承体系结构

	ServletRequest		--	接口
		|	继承
	HttpServletRequest	-- 接口
		|	实现
	org.apache.catalina.connector.RequestFacade 类(tomcat编写的,可以在tomcat的源码中看到)

5.3 Request对象的功能

5.3.1 获取请求消息数据

5.3.1.1 获取请求行数据

即要获取如下数据:

GET /demo/hello?username=lisi HTTP/1.1

要获取以上请求行数据,Request对象提供了以下方法:

  • 1. 获取请求方式:GET
    • String getMethod()
  • 2. 获取虚拟目录:/demo
    • String getContextPath()
  • 3. 获取Servlet路径: /hello
    • String getServletPath()
  • 4. 获取get方式请求参数:username=lisi
    • String getQueryString()
  • 5. 获取请求URI:/demo/hello
  • 6. 获取协议及版本:HTTP/1.1
    • String getProtocol()
  • 7. 获取客户机的IP地址:127.0.0.1
    • String getRemoteAddr()

 代码实例如下:

@WebServlet("/hello")
public class HelloServlet1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 获取请求方式:GET
        String method = request.getMethod();
        System.out.println(method);
        System.out.println("-----------------------------------------");

        // 2. 获取虚拟目录:/demo
        String contextPath = request.getContextPath();
        System.out.println(contextPath);
        System.out.println("-----------------------------------------");

        // 3. 获取Servlet路径: /hello
        String servletPath = request.getServletPath();
        System.out.println(servletPath);
        System.out.println("-----------------------------------------");

        // 4. 获取get方式请求参数:username=lisi
        String queryString = request.getQueryString();
        System.out.println(queryString);
        System.out.println("-----------------------------------------");

        // 5. 获取请求URI:/demo/hello
        String requestURI = request.getRequestURI();
        System.out.println(requestURI);
        StringBuffer requestURL = request.getRequestURL();
        System.out.println(requestURL);
        System.out.println("-----------------------------------------");

        // 6. 获取协议及版本:HTTP/1.1
        String protocol = request.getProtocol();
        System.out.println(protocol);
        System.out.println("-----------------------------------------");

        // 7. 获取客户机的IP地址:127.0.0.1
        String remoteAddr = request.getRemoteAddr();
        System.out.println(remoteAddr);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
/**
 * 打印结果:
 * 
 * GET
 * -----------------------------------------
 * /demo
 * -----------------------------------------
 * /hello
 * -----------------------------------------
 * username=lisi
 * -----------------------------------------
 * /demo/hello
 * http://localhost:8080/demo/hello
 * -----------------------------------------
 * HTTP/1.1
 * -----------------------------------------
 * 127.0.0.1
 */

在浏览器输入http://localhost:8080/demo/hello?username=lisi查看控制台打印结果

5.3.1.2 获取请求头数据

如果要获取这样的请求头数据:

Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0

可以有如下方法:

  • String getHeader(String name):通过请求头的名称获取请求头的值,name参数不区分大小写
  • Enumeration<String> getHeaderNames():获取所有的请求头名称

代码实例:可以通过判断user-agent来判断使用的浏览器从而解决浏览器的兼容问题。

@WebServlet("/hello2")
public class HelloServlet2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // String getHeader(String name):通过请求头的名称获取请求头的值,name参数不区分大小写
        String host = request.getHeader("Host");
        System.out.println(host);
        String userAgent = request.getHeader("user-agent");
        System.out.println(userAgent);

        System.out.println("-------------------------");

        // Enumeration<String> getHeaderNames():获取所有的请求头名称
        Enumeration<String> headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            System.out.println(headerNames.nextElement());
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
/**
 * 打印结果:
 * localhost:8080
 * Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
 * -------------------------
 * host
 * connection
 * upgrade-insecure-requests
 * user-agent
 * sec-fetch-dest
 * accept
 * sec-fetch-site
 * sec-fetch-mode
 * sec-fetch-user
 * accept-encoding
 * accept-language
 * cookie
 */

浏览器输入http://localhost:8080/demo/hello2然后在控制台查看打印结果

5.3.1.3 获取请求体数据

请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数。

因此得到请求体数据的步骤如下:

  • 1. 获取流对象
    • BufferedReader getReader():获取字符输入流,只能操作字符数据
    • ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
  • 2. 再从流对象中拿数据

因此在web下创建一个p

以上是关于JSP&Servlet学习笔记(上)的主要内容,如果未能解决你的问题,请参考以下文章

Servlets & JSP 学习笔记002

Head First Servlets & JSP 学习笔记 第五章 —— 作为Web应用

jsp/servlet学习笔记(核心编程)servlet部分

JSP九大内置对象与Servlet学习笔记[转]

JSP学习笔记-JSP语法

JSP 学习笔记