JavaWeb开发知识总结(HTTP,Servlet)
1. HTTP协议
HTTP协议:HyperText Transfer Protocol,超文本传输协议,是用来规范浏览器和服务器间的数据传输.HTTP协议有1.0版本(每次响应后关闭连接)和1.1版本(每次响应后超过设置的等待时间关闭连接).
HTTP协议特点:
HTTP协议是基于请求和响应模型.有请求才有响应;响应和请求是成对存在的;
HTTP协议默认使用的80端口;
HTTP的请求部分组成:
请求行
- 请求方式:请求的方式有多种,一般常用的有GET和POST方式,默认的请求方式GET
- GET和POST的区别:
- [x] GET请求提交的参数会显示在地址栏(
请求的url?参数1=值1&参数2=值2...
),POST请求提交的参数不会显示在地址栏; - [x] GET请求提交的参数数据的大小有限制,而POST请求提交的参数没有大小的限制;
- [x] GET请求没有请求体,请求的参数跟在url后,POST请求有请求体,参数全部以键值对形式放在请求体中.
- 提交路径:html中的设置的提交路径(超链接/表单等的提交路径);
- 协议版本:使用的HTTP协议的版本(1.0或1.1).
- 请求方式:请求的方式有多种,一般常用的有GET和POST方式,默认的请求方式GET
请求头:请求头中的内容都是以键值对的形式存在,一般一个key对应一个value,同时也存在一个key对应多个value值,常用的有以下几个:
- User-Agent: 代表的是浏览器的类型,一般用于中文文件下载,不同的浏览对中文文件的编码方式不同,服务器获取到客户端的浏览器类型后,可以根据该类浏览器采用的中文文件编码方式对应的编码方法对文件进行编码,客户端接收后直接解码即可(IE浏览器采用URLEncoder编码,Firefox采用Base64编码).
- Referer:代表网页的来源,一般用于网页的防盗链接(可以限制只有本站点中的网址才能访问该站点中某些网页,不允许其他站点通过链接来访问).
- If-Modified-Since:通常与响应中的头Last-Modified一起使用查找本地缓存.
请求体:
POST请求方式提交的参数.
HTTP的响应部分组成:
响应行:
协议版本:HTTP协议的版本.
状态码:响应的描述值,常见的状态码及其含义
状态码描述:常见状态码及其描述
常见状态码 状态码描述 说明 200 OK 客户端请求成功 302 Found 重定向 304 See Other 查找本地缓存 404 Not Found 请求资源不存在 500 Internal Server Error 服务器内部错误 响应头:响应头中的内容都是以键值对的形式存在,一般一个key对应一个value,同时也存在一个key对应多个value值,常用的有以下几个:
- Last-Modified:与请求中的If-Modified-Since一起使用查找本地缓存;
- Content-Dispostion :文件下载的使用的一个头信息;
- Location:重定向的跳转的路径,和状态码302对应;
- Refresh:定时刷新/定时跳转,
"定时时间秒;url=跳转的路径"
.
响应体:针对于请求要响应到客户端浏览器显示的内容.
2. Servlet(2.5版本)
Servlet是使用Java语言进行动态网页开发的技术,其本质是一个运行在WEB服务器上的小的Java程序,用来接收和响应从客户端发送过来的请求,通常使用HTTP协议.
Servlet可以接受客户端的请求,同时可以对请求做出响应.Servlet接口是所有基于请求响应模型的顶层接口,该接口有一个实现类是GenericServlet抽象类,GenericServlet抽象类有一个子类HttpServlet抽象类.
2.1 Servlet使用
Servlet接口定义的方法:
public void init(ServletConfig config):servlet实例化时调用,用来对servlet进行初始化;
public void service(ServletRequest req, ServletResponse res):接受请求和做出响应的方法;
public void destroy():servlet的对象的销毁方法;
public ServletConfig getServletConfig():获取当前servlet对象的配置对象.
实现自定义Servlet类:
自定义类实现Servlet类,实现其中的service方法,在service方法中定义功能代码,然后再项目的web.xml文件中配置自定义servlet的访问路径,将项目发布到服务器并并运行,当有请求访问该servlet时,就会调用service中的方法.
// 定义类继承Servlet接口
package com.itheima.servlets.ServletDemo1;
public class ServletDemo1 implements Servlet{
// 重写Servlet的service方法
@Override
// 为用户处理请求和响应的方法.
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// 向客户端输出信息
res.getWriter().println("Hello Servlet...");
}
...
}
<!--web工程项目WEB-INF/web.xml文件中配置Servlet的访问路径-->
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>JavaWeb_day12_Tomcat_Servlet</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- Servlet的配置 -->
<servlet>
<!-- Servlet的名称 -->
<servlet-name>test1</servlet-name>
<!-- Servlet的类的带包路径名 -->
<servlet-class>com.itheima.servlets.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<!-- servlet的名称,和上面的保持一致 -->
<servlet-name>test1</servlet-name>
<!-- servlet的访问路径 -->
<url-pattern>/test1</url-pattern>
</servlet-mapping>
</web-app>
Servlet类的访问流程:
客户端在访问:http://localhost:8080/项目工程名/test1
,会向服务器发送请求,服务器在web.xml配置文件中查找配置:
2.2 Servlet对象的生命周期
# Servlet对象的生命周期:Servlet对象从创建到销毁的过程.
# Servlet对象创建:用户第一次访问该Servlet对象时实例化对象,实例化时会调用init方法进行初始化,对象只被创建一次,属于单例对象(当给servlet配置了<load-on-startup>优先级</load-on-startup>属性时,servlet对象是在服务器启动的时候就被创建);
# Servlet对象销毁:当项目从服务器移除或者关闭服务器时销毁Servlet对象.
# Servlet对象的生命周期过程:
# 当第一次请求该Servlet或服务器启动时服务器创建Servlet对象实例同时会调用init()方法进行初始化;对该servlet访问的任何一次请求,服务器都会创建一个新的线程去访问该Servlet中的service()方法,在service()方法中根据请求方式的不同会调用doXxx()方法[GET请求调用doGet()方法,POST请求调用doPost()方法];当项目被从服务器移除或者服务器关闭时,Servlet对象实例会被销毁,同时调用其destroy()方法.
2.3 Servlet的配置:
Servlet在web.xml配置文件中的配置:
Servlet对象的创建是在第一次访问该Servlet时创建(执行init方法),当在初始化方法init中的处理逻辑(如读取相关的资源文件)较为耗时时,服务器会在servlet初始化完成后才能给客户端进行响应,客户端需要等待较长的时间;为解决这个问题,在web.xml文件中可以配置在tomcat服务器启动时就将servlet对象创建好,将servlet的初始化提前到服务器启动的时候.
在web.xml文件的< servlet></ servlet>
标签内配置<load-on-startup>启动的优先级</load-on-startup>
,优先级是正整数,设置的整数越小被创建的优先级就越高,由于整数1被tomcat内部使用来设置404等网页的servlet对象使用,则一般不能使用1作为参数,配置案例如下:配置Servlet的创建优先级为2
<!--web.xml配置文件-->
<!-- Servlet的配置 -->
<servlet>
<!-- Servlet的名称 -->
<servlet-name>test1</servlet-name>
<!-- Servlet的类的带包路径名 -->
<servlet-class>com.itheima.servlets.ServletDemo1</servlet-class>
<!--Servlet类创建对象的时间,设置Servlet类实例化的优先级-->
<load-on-startup>2</load-on-startup>
</servlet>
Servlet的访问路径的配置:
Servlet的访问路径是在<url-pattern></url-pattern>
标签内配置,访问路径只是能找到该servlet的标示
,常用的配置方式有三种:
1. 完全路径匹配: 以/
开始, /目录名1/目录名2/.../Servlet访问名字
,中间的路径名相当于是虚路径,可以在项目目录结构中不存在,该方式相当于是绝对的匹配;
2. 目录路径匹配: 以/
开始,并以*
结束, /目录名1/.../*
,匹配指定名称下的所有的servlet的名称,相当于是模糊匹配;
3. 文件扩展名匹配:以*
开始,不能以/
开始, *.扩展名
,相当于是模糊匹配.
三种访问路径的访问的优先级(从高到低):
完全路径匹配 > 目录路径匹配 > 扩展名匹配
.案例如下:
web.xml文件中有如下的配置(省略servlet的配置项):
<!--名称为ServletDemo1的访问路径配置-->
<servlet-mapping>
<servlet-name>ServletDemo1</servlet-name>
<url-pattern>/ServletDemo1</url-pattern>
</servlet-mapping>
<!--名称为ServletDemo2的访问路径配置-->
<servlet-mapping>
<servlet-name>ServletDemo2</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!--名称为ServletDemo3的访问路径配置-->
<servlet-mapping>
<servlet-name>ServletDemo3</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
如果在浏览器中访问如下地址:
http://localhost:8080/项目名/ServletDemo1 :访问的是ServletDemo1
http://localhost:8080/项目名/aaa.do :访问的是ServletDemo2
2.4 项目开发程序访问资源的路径问题(推荐使用绝对路径)
绝对路径: 绝对路径是以/
开始的,不需要知道访问资源的相对路径,绝对路径分为客户端路径和服务器端路径,绝大数的路径都是客户端路径,服务端路径较为少见(request的转发属于是服务器路径).
1. 客户端路径:必须以/项目名
开始,如:/website/ServletDemo1
,客户端访问服务器的资源必须知道其在服务器中位置;
2. 服务器端路径:不能以/项目名
开始,访问时会默认加上,在服务器内部资源是相对定位的,不需要再加上项目名.
相对路径: 相对路径是以./
(代表以当前目录为基准)或../
(代表以上一级目录为基准)开始的,资源的定位必须有相对的位置关系,必须有资源相对定位的基准路径.