JSP&Servlet学习笔记(上)
Posted 二木成林
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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包
- WEB-INF目录:
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
- 1. 请求参数在请求行中,在url后。如localhost:8080/hello?username=zhangsan
- 2. 请求的url长度有限制的
- 3. 不太安全
- 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
- String getRequestURI() —— /demo/hello
- StringBuffer getRequestURL() —— http://localhost:8080/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学习笔记(上)的主要内容,如果未能解决你的问题,请参考以下文章
Head First Servlets & JSP 学习笔记 第五章 —— 作为Web应用