HTTP协议通信
HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:
1、 建立TCP连接
在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更低层协议的连接。因此,首先要建立TCP连接,一般TCP连接的端口号是80
2、 浏览器向Web服务器发送请求命令
一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令
例如:GET /sample/hello.html HTTP/1.1
3、 浏览器发送请求头信息(Request Headers)
浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经接收了该头信息的发送。(浏览器客户端做的)
4、 Web服务器应答
客户机向服务器发出请求后,服务器会向客户机回送应答,
HTTP/1.1 200 OK
应答的第一部分是协议的版本号和应答状态码
5、 Web服务器发送应答头信息(Response Headers)
正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。(服务器端做的)
6、 Web服务器向浏览器发送数据
Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据 response.setContentType(“text/html;charset=utf-8”);
7、 Web服务器关闭TCP连接
一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码
Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽
请求和响应的数据格式
1.编写HTML文件使用get请求
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>请求和响应的数据格式</title>
</head>
<body>
<!--表单、表格-->
<form action="http://localhost:8080" method="get">
<input type="hidden" name="action" value="login">
<input type="hidden" name="username" value="root">
<input type="submit">
</form>
</body>
</html>
请求HTTP协议格式(Request)【客户端向服务器发送请求】
请求又分为两种GET请求和POST请求
区别:
1.GET请求一般是去请求获取数据,POST一般作为发送数据到后台使用
2.GET请求也可以传递到后天,但是它传递参数的方式是在浏览器地址栏中可见的
URL:http://localhost:8080/?action=login&username=root
所以get请求安全性较差,且参数长度也是受限制
GET请求
1.请求行数
1.1 请示方式是GET
1.2 请求的资源路径?+请求参数
1.3 请求状态: 200【成功】/404【失败】/500【报错】
1.4 版本【使用HTTP协议】 HTTP/1.1
1.5 传输数据大小【但是因各个浏览器不同而已】
ps:GET /a.html HTTP/1.1 200 这样也可以展示
2.请求头
PS:请求头中数据是以 【key:value】形式组成
Accept:告诉服务器,客户端可以接受的数据类型
Accept-Encoding: 告诉服务器,客户端可以接受的数据编码(或压缩格式)
Accept-Language: 告诉服务器,客户端可以接受的语言类型
最常用参数 zh_CN(中文) en_US(英文)
Connection: 告诉服务器请求连接如何处理
keep-alive 告诉服务器回传数据不要马上关闭,保持一小段连接
closed 马上关闭
Host: 表示请求服务器的IP和端口号
Referer: 表示请求发起时,浏览器地址中地址【从哪来】
User-Agent:浏览器信息
Upgrade-Insecure-Requests 无视,浏览器自动添加
cookie:Cookie是由服务器端生成,发送给浏览器(User-Agent,告诉浏览器设置一个Cookie),浏览器会自动将cookie以【key:value】保存在某个目录下的文本文件中,下次请求同一页网站时也会自动发送Cookie给服务器,即添加在请求头的部分(前提是浏览器设置启动Cookie)
ps:Cookie就是一个小型的文件(浏览取cookie的存储是有显示),用来存储信息
3.浏览地址栏中的GET请求URL
POST请求
1.将HTML页面修改为post请求
2.请求行
1.1.请求方式 post
2.2.请求资源路径,但是需要注意参数是隐藏
-
3版本【使用HTTP协议】 HTTP/1.1
-
4传输数据大小【但是因各个浏览器不同而已】
ps:POST /a.html HTTP/1.1 200 这样也可以展示
3.请求头
Accept:告诉服务器,客户端可以接受的数据类型
Accept-Encoding: 告诉服务器,客户端可以接受的数据编码(或压缩格式)
Accept-Language: 告诉服务器,客户端可以接受的语言类型
最常用参数 zh_CN(中文) en_US(英文)
Connection: 告诉服务器请求连接如何处理
keep-alive 告诉服务器回传数据不要马上关闭,保持一小段连接
closed 马上关闭
Content-Language: 表示数据的长度(action=login&username=root)
Content-Type: 表示发送数据类型
application/x-www-from-urlencoded
表示提交的数据格式是表单,表单中数据是action=login&username=root ,然后对其进行URL编码
multipart/form-data
以多段数据提交到服务器(多用于文件上传)
Host: 表示请求服务器的IP和端口号
Origin: 服务器的名称,并不包含任何路径信息
Referer: 表示请求发起时,浏览器地址中地址【从哪来】
User-Agent:浏览器信息
Upgrade-Insecure-Requests 无视,浏览器自动添加
cookie:Cookie是由服务器端生成,发送给浏览器(User-Agent,告诉浏览器设置一个Cookie),浏览器会自动将cookie以【key:value】保存在某个目录下的文本文件中,下次请求同一页网站时也会自动发送Cookie给服务器,即添加在请求头的部分(前提是浏览器设置启动Cookie)
ps:Cookie就是一个小型的文件(浏览取cookie的存储是有显示),用来存储信息
ps:请求成功之后会出现一个其他属性
cache-control 表示如何控制缓存
4.浏览器地址栏
Get和Post总结
GET请求在那些位置使用:
【from表单 、 a标签 、 link标签、Script标签、img标签、iframe标签、在浏览器地址栏中输入地址回车】
POST请求在那些位置使用
【from表单(提供一些隐私数据)】
GET请求属于是明文(数据会出现浏览器地址栏中),隐私和安全性较差
POST请求属于暗文(会将数据拼接在请求体中【Request boby】),不会再地址栏中显示相对GET请求安全
GET请求会手数据长度限制而POST请求没有数据长度限制
GET请求刷新浏览器的时候或回退没有任何影响,而POST会重新提交请求
GET请求可被缓存,POST不会被缓存
GET请求保留浏览器历史记录,POST不会
GET请求可以被收藏(书签),POST不会
GET请求值支持URL编码,POST请求不仅支持编码而且还支持二进制
响应的HTTP协议格式(Response)
1.响应行
1.响应状态码: 200【成功】/404【失败】/500【报错】
2.响应协议 : HTTP/1.1
2.响应头
以【key:value】键值对的形式进行数据
Connection: 告诉服务器请求连接如何处理
keep-alive 告诉服务器回传数据不要马上关闭,保持一小段连接
closed 马上关闭
Content-Language 使用的语言是什么zh-CN(中文)
Content-Lenght : 数据的长度
Content—Type:表示响应的数据类型和编码集【决定响应界面的的展示】
Date: 请求响应时间
keep-Alive:表示连接装填
timeout 表示连接超时(是以秒为单位)【20秒以内可以,超过20秒之后就是连接超时】
max 表示最大请求值【不用设置】
其他:
Server: 表示服务器信息
Transfer-Encoding: 用来改变报文形式
chunked: 数据以一系列分块的形式发送
compress: 采用了Lempel-ziv-welch压缩算法 【LZW】
deflate: 采用了zlib结构和deflate压缩算法
gzip: 采用了 Lempel-ziv coding压缩算法,以及32位CRC校验的编码方式
ps:在Linux系统中可以碰到
ps:响应之后,会回传给客户端一个数据,一般是在网页中可以看到
状态码
状态码是有3位数字组成,表示请求是否被理解或被满足
状态码解析【3位数的第一位即百位】
1XX:指示信息【表示请求已经接收,可以继续处理】
2XX:成功【表示请求已经被接收、理解、接受】
3XX:重定向【要完成请求必须更进一步进行操作】
4XX : 客户端错误【请求的语法错误或请求无法实现】
5XX:服务器错误【服务器未能实现合法请求】
PS:详细状态码可以查看状态码文档
MIME类型说明
MIME是HTTP协议中数据类型,MIME的英文全称【Multipurpose Internet Mail Exensions】 多工程Internet邮件扩充协议
文件 | MIME类型 |
---|---|
超文本标记语言文本 | .html、.htm text/html |
普通文本 | .txt 、 text/plain |
RTF文本 | .rtf 、application/rtf |
GIF图形 | .gif、image/gif |
JPEG图形 | .jpeg、.jpg、image/jpeg |
au 声音文件 | .au、audio/basic |
MIDI 音乐文件 | .mid、.midi、audio/midi、audio/x-midi |
RealAudio 音乐文件 | .ra、.ram 、audio/x-pn-realaudio |
MPEG文件 | .mpg、.mpeg、 video/mpeg |
AVI文件 | .avi 、video/x-msvideo |
GZIP文件 | .gz application/x-gzip |
TAR文件 | .tar application/x-tar |
Servlet
第一个Servlet程序
Servlet概念
1.JavaWeb程序开发基础,JavaEE规范(一套接口)的一个组成部分。多由服务器厂商提供实现
2.Servlet是JavaWeb三大组件之一。三大组件【Servlet程序(JSP动态网页技术)、Filter过滤、Listenter监听】
3.Servlet是服务器端的一段程序(代码、功能实现),可以交互式的处理客户端发送到服务器的请求,并完成完成响应操作
Servlet开发步骤
1.接收客户端请求,完成操作任务
2.动态生成网页【页面数据可变】
3.将包含结果的动态网页响应给客户端
开发步骤1:(了解)
1.搭建开发环境:会在Tomcat中创建目录结构,webapps目录下创建一个层级结构
1.1 创建第一层文件夹网站的名称【工程名称】
1.2 创建第二层文件夹(在第一层的内部)WEB-INF【核心内容】
1.3 创建第三层文件夹(在第二层的内部)
1.3.1 会创建classes文件夹【.class】
1.3.2 会创建lib文件夹【网站需要的所有jar包】
1.3.3 会创建一个xml文件,这个名字是固定的 web. xml【对程序的配置文件】
1.4 静态资源【html、css、js、image】会和WEB-INF文件夹平级
2.创建文本文件,手动实现 javax.servlet.Servelt接口,并覆盖5个方法
init【初始化servlet】 ServletConfig【获取servlet配置信息】 service【处理请求数据即业务逻辑(提供)】
getServletInfo【获取servlet基本信息】 destroy【销毁servlet】
3.对java文件进行编译,并将编译后.class文件放入到classes文件夹中
4.配置web.xml文件
5.手动启动tomcat运行程序
开发步骤2:(必须会)
1.在编译器中创建JavaWeb工程
2.在src文件夹创建servlet程序–》常见一个普通类
Servlet核心接口和类
Servlet接口
在ServletAPI中最重要的就是Servlet接口,所有Servlet都会直接或间接的与该接口产生联系。
就可以利用这个接口来实现我们Servlet
package com.qfedu.TestServlet;
import javax.servlet.*;
import java.io.IOException;
public class FirstServlet implements Servlet {
//Servlet初始化方法
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("初始化Servlet");
}
//获取Servlet配置
@Override
public ServletConfig getServletConfig() {
System.out.println("获取Servlet配置");
return null;
}
//服务【具体处理业务的逻辑】
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("服务方法service");
}
//获取servlet的基本信息
@Override
public String getServletInfo() {
System.out.println("获取servlet基本信息");
return null;
}
//销毁
@Override
public void destroy() {
System.out.println("销毁Servlet");
}
}
配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--servlet 标签给 tomcat配置 servlet程序使用-->
<servlet>
<!--servlet-name 表球按 servlet程序的别名【一般来说就是类名】-->
<servlet-name>FirstServlet</servlet-name>
<!--servlet-class 是 servlet程序的全名-->
<servlet-class>com.qfedu.TestServlet.FirstServlet</servlet-class>
</servlet>
<!--servlet-mapping标签给servlet程序配置访问地址-->
<servlet-mapping>
<!--servlet-name 标签的作用是告诉服务器,我们当前配置的地址给半个Servlet程序使用-->
<servlet-name>FirstServlet</servlet-name>
<!--url-pattern 标签配置访问地址
/ 斜杠在服务器解析的时候,表示地址为 http://ip:port/工程路径
就相当于在浏览地址栏中访问 http://ip:port/firstServlet路径时就可以访问到
我们编写Servlet程序了-->
<url-pattern>/firstServlet</url-pattern>
</servlet-mapping>
</web-app>
运行web程序
启动方式1:
启动方式2:
ps:
就会变成重启
中的server设置外也可以直接设置 四个属性分别为
项目层级结构:
IDEA中web的层级结构Eclipse中的层级结构有很大的不同,基础配置目录是相同的src和web目录,这里需要注意的是,IDEA开发JavaWEB项目时,不会将Servlet的.class文件添加到传你那个创建好的web目录中,而是在工程中创建一个文件夹
out文件夹里artifacts
开发时classes文件存放路径:out文件夹下production文件夹下,
有一些配置文件需要放到WEB-INF文件夹下例如lib目录
运行程序在浏览器中打开的界面
路径问题: web_wer_exploded这个路径是IDEA自动我们配置工程路径,也是IDEA中运行Servlet时的默认启动路径,我们可以在运行部署的位置进行设置
ps:
Name参数通常是修改的,一般是和工程名一个名字,主要的目的是区分如果有多个工程运行是哪一个
Application server 按需修改,如果需要测试不同的tomcat可以进行修改
on Updata action: 建议修改为常用选择
on frame deactivatino:建议修改为热部署即"update classess and resources"
HTTP port: 不建议修改tomcat默认端口号
ps:Application context: 建议修改工程路径一般为 “/项目名称”
程序运行之后的默认界面
在启动程序之后会出现一个空白页面,其实这个页面是直接存在在工程,在工程中web 目录下有一个index.jsp文件,这个文件就是启动工程时默认加载的界面,也就是Tomcat会将web目录下以index文件名文件作为“欢迎或首页”进行展示
PS:在实际开发中,因为不确定前端人员以什么名称作为"初始界面或欢迎界面",所以我们会在web.xml文件中进行一个配置,这个配置会加载这些文件作为"初始界面或欢迎界面"
通过这个标签设置,首页启动
<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>
如何将IDEA中开发web程序部署到Tomcat中
最终将生成war包拷贝到tomcat目录中的webapps目录中,然后启动tomcat服务器,tomcat会自动解压webapps目录的war包
如何服务器端的数据反馈给客户端
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
/**
* 这个方法只会数据或结果打印在控制台上
*/
// System.out.println("服务方法service");
/**
* 将当前数据写入到web界面中即服务器返回数据给客户端
* servletResponse 这个对象提供一个方法,getWriter方法
* 这个方法可以获取字符输出流对象,然后流中println反法可以将数据写入到页面中
* 通过servletResponse对象输出中文到页面中存在乱码
*/
servletResponse.setContentType("text/html;charset=UTF-8");
servletResponse.getWriter().println("服务器给客户端的返回数据!");
//servletResponse.getWriter().println("abcdefg!");
}
在实际开发中如果使用类继承于Servlet接口,可以发现其中的5个方法我们只使用一个,特别是init和destroy在实际开发中很少使用,所以为了方便开发JavaEE中提供一个抽象类GenericServlet
GenericServlet抽象类
GenericServlet这个抽象类可以让编写servlet变的更加容易,它提供init和destroy简单实现,我们要编写一般servlet的时候只需要重写service方法即可
package com.qfedu.TestServlet;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/second")
public class SecondeServlet extends GenericServlet {
//只需要完成一个service方法即可
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
servletResponse.setContentType("text/html;charset=UTF-8");
servletResponse.getWriter().println("我是第二种创建servlet方式");
}
}
ps:在官方API文档中,有这样一句话,这个类是一个与协议无关的Servlet
核心在于这个【与协议无关】,现在所有B/S架构都是依托于HTTP协议来完成,所以在实际开发99.9%都需要使用到HTTP协议,所有这个创建方式不太建议使用在实际开发中
HttpServlet类
这个类是继承GenericServlet类的继承上进一步扩展,而且在官方API中也推荐使用这个类
官方API的说明**【强烈建议使用这类】**提供将要被子类化以创建适用于 Web 站点的 HTTP servlet 的抽象类。HttpServlet
的子类至少必须重写一个方法,该方法通常是以下这些方法之一:
doGet
,如果 servlet 支持 HTTP GET 请求doPost
,用于 HTTP POST 请求doPut
,用于 HTTP PUT 请求doDelete
,用于 HTTP DELETE 请求init
和destroy
,用于管理 servlet 的生命周期内保存的资源getServletInfo
,servlet 使用它提供有关其自身的信息
package com.qfedu.TestServlet;
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("/thrid")
public class ThridServlet extends HttpServlet {
/*
继承HttpServlet这个类是实际在web开发中推荐使用
这类的核心方法我们只需要关系doGet和doPost
几乎不需要写service方法
service方法是用过标准的HTTP请求分发给每个HTTp请求类型以便进行处理
在这个类中以doGet和doPost进行了区分操作
*/
//doGet方法对应的就是Get请求
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().println("我是第三种创建Servlet方式");
}
//doPost方法对应的就是Post请求
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
总结:
思考:HttpServlet这个类中实现Service方法,这个方的内部实现调用this.Service方法为什么没有死递归反而可以正常执行
Servlet的两种配置方法
方式1:【通用配置】 web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--欢迎开始界面,不配置默认会加载以index为名字的文件-->
<welcome-file-list>
<!--其实界面的文件【html、htm、jsp】-->
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!--这配置可以忽略-->
<!--配置web应用的名称-->
<display-name>firstweb</display-name>
<!--web应用的描述-->
<description>Servlet JSP</description>
<!--配置网页网站出现的错误界面,一旦出现错误就出现对应界面-->
<error-page>
<!--错误代码,应对的是出现什么错误-->
<error-code>404</error-code>
<!--工程静态页面资源地址-->
<location>/error/404.html</location>
</error-page>
<!--无论出现什么错误,都出现同一个界面-->
<error-page>
<!--工程静态页面资源地址-->
<location>/error/404.html</location>
</error-page>
<!--Servlet配置-->
<servlet>
<!-- 给Servlet程序起一个名字【一般会使用类名】 这个标签要和Mapping中servlet-name对应-->
<servlet-name>FirstServlet</servlet-name>
<!-- Servlet程序的类【全限定名称--》包名+类名】-->
<servlet-class>com.qfedu.TestServlet.FirstServlet</servlet-class>
<!-- 这里可配置一个隐藏参数启动级别
load-on-startup 标签可以去顶servlet启动级别数字越小越先启动【必修是个整数】
如果该元素值为为负数或没有设置,则容器会当Servlet被请求的时候加载
如果这里出现了相同值,此时容器会自动决定谁先加载
-->
<load-on-startup>5</load-on-startup>
</servlet>
<!-- servlet程序访问地址配置-->
<servlet-mapping>
<!-- 告诉服务器当前配置地址是哪个servlet程序-->
<servlet-name>FirstServlet</servlet-name>
<!--配置访问地址
/ 代表服务器解析的时候,表示地址为==》【http://ip:port/工程名称】
/servlet 表示地址为==》 【http://ip:port/工程名称/servlet】
url-pattern定义匹配规则==》【同样适用于注解】
精确匹配 /具体的名称 只有url路径是具体名称时候才会触发Servlet
后缀匹配 *.XXX 只要是以XXX结尾的就匹配触发Servlet
通配符匹配 /* 匹配所有请求,包含服务器的所有资源==》多用于过滤器Filter
ps:精确匹配的优先级要高于通配符匹配
通配符匹配 / 匹配司所有请求,包含服务器所有的资源,但是不包括【.jsp】
-->
<url-pattern>/servlet</url-pattern>
</servlet-mapping>
</web-app>
方式2:注解【必须是Servlet3.0之后才可以使用】
当开发中有多个Servlet需要需要执行的时候,那么配置web.xml文件就会非常麻烦,所以在Servlet3.0版本之后,支持以注解的形式来完成对Servlet进行配置,大大简化了配置书写
ps:建议注解+web.xml配合使用
如果要配置Servlet程序使用注解,那么就需要使用一个注解类WebServlet
@WebServlet属性类表
属性名 | 类型 | 描述 |
---|---|---|
name | String | 指定Servlet的name属性值,等价于在web.xml文件中配置类的全限定名称 |
value | String[] | 该属性等价于url-pattern,指定访问路径,但是不建议两者同时使用 |
urlPatterns | String[] | 指定一组Servelt的URL匹配模式 |
loadOnStartup | int | 指定Servelt的加载顺序 |
intParams | WebInitParam[] | 指定一组servlet初始化参数 |
asyncSupported | boolean | 声明Servlet是否支持异步操作模式 |
description | String | 描述当前Servlet |
dispalyName | String | 描述Servlet显示名称 |
ps:
name这个属性可以不用配置直接忽略
value和UrlPatterns 二者只能选一不能同时使用,
value和urlPatterns数据类型都是数组,所有可以支持多个值,value相当于是精确匹配,urlPatterns是多匹配【用户或开发人员使用】
package com.qfedu.TestServlet;
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(name = "com.qfedu.TestServlet.FourServlet",value="/four")
//@WebServlet(name = "com.qfedu.TestServlet.FourServlet",value={"/f1","/f2","/four"})
//name属性是不需要书写
//@WebServlet(urlPatterns = {"/four","*.do"})
//配置最简便的精准匹配
@WebServlet("/four") // 等价于@WebServlet(value="/four")
public class FourServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
获取请求参数
servlet代码
package com.qfedu.TestServlet;
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("/login")
public class LoginServlet extends HttpServlet {
/**
* doGet请求【相当于网页使用get请求处理】
* @param req 页面请求数据【页面请求即request】
* @param resp 响应页面数据【页面响应即response】
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//当页面点击提交的时候,相当于是客户端向服务器发送请求【即发送数据】
// 所以需要使用request对象处理这些数据【相当于是获取出这些传递传递数据】
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("用户名时:"+username+"密码是:"+password);
}
}
html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录界面</title>
</head>
<body>
<h1>欢迎您</h1>
<div>
<!-- form表单中会存在这个一些属性,一个是action 另外一个是method
action属性在原始操作的时候如果以静态页面为例,我们只需要跳转静态页面就可以
需要将当前页面中数据传递到Servlet, action就需要跳转到servlet
如果条件到Servelt中有两种方式【绝对路径和相对路径】
此时action给路径和是servlet的action="/login"
http://localhost:8080/login?username=zhangsan&password=123456
loginPage页面访问
http://localhost:8080/web_war_exploded/LoginPage.html
如果在action后面直接使用servlet url路径,此时会少当前的工程名称
在action中需要指定Servlet的url 必须带有工程名称
即 action = "/工程名称"+"/Servlet的url精确匹配"-->
<form action="/web_war_exploded/login">
<label>姓名:</label><input type="text" name="username"><br/>
<label>密码:</label><input type="password" name="password"><br/>
<input type="submit" value="提交">
</form>
</div>
</body>
</html>
如何处理get和post请求分发
我们之所以使用httpServlet这类原因在于,就是因为和这个类提供doGet和doPost,他们分别对应get和post方法,如何区分分发?
package com.qfedu.TestServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
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("/login2")
public class LoginServlet_2 extends HttpServlet {
//提供分发中专站
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
//通过这个service方法处理当前请求分发
//需要将req和res进行强转,强转成HttpServletRequest和Response,这个类对象带有一个方法
//getMethod 获取请求方法,转换完成之后可以方便参数传递
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
//获取请求方式
String method = request.getMethod();
if("GET".equals(method)){
doGet(request,response);
}else if("POST".equals(method)){
doPost(request,response);
}
}
/**
* doGet请求【相当于网页使用get请求处理】
* @param req 页面请求数据【页面请求即request】
* @param resp 响应页面数据【页面响应即response】
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//当页面点击提交的时候,相当于是客户端向服务器发送请求【即发送数据】
// 所以需要使用request对象处理这些数据【相当于是获取出这些传递传递数据】
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("GET"+"用户名时:"+username+"密码是:"+password);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//当页面点击提交的时候,相当于是客户端向服务器发送请求【即发送数据】
// 所以需要使用request对象处理这些数据【相当于是获取出这些传递传递数据】
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("POST"+"用户名时:"+username+"密码是:"+password);
}
}
在这里继承HttpServlet这个类就是为了减少改法成本,我们处理除了这个连个方之外,基本上都会不会在使用其他的了,在实际开发中我们是不会区分什么请求,开中我们只关心数据如何获取,get请求和post请求的效果是对用户而言,对开发人员而言都是一样,get就是明文数据,post是暗文数据,能不能获取出来?能,所以我们开发中只会针对一个请求书写逻辑即
package com.qfedu.TestServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
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("/login3")
public class LoginServlet_3 extends HttpServlet {
/**
* doGet请求【相当于网页使用get请求处理】
* @param req 页面请求数据【页面请求即request】
* @param resp 响应页面数据【页面响应即response】
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//当页面点击提交的时候,相当于是客户端向服务器发送请求【即发送数据】
// 所以需要使用request对象处理这些数据【相当于是获取出这些传递传递数据】
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("用户名时:"+username+"密码是:"+password);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//调用doGet方法
doGet(req,resp);
}
}
消息 | 描述 |
---|---|
100 Continue | 服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。 |
101 Switching Protocols | 服务器转换协议:服务器将遵从客户的请求转换到另外一种协议。 |
消息 | 描述 |
---|---|
200 OK | 请求成功(其后是对GET和POST请求的应答文档。) |
201 Created | 请求被创建完成,同时新的资源被创建。 |
202 Accepted | 供处理的请求已被接受,但是处理未完成。 |
203 Non-authoritative Information | 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝。 |
204 No Content | 没有新文档。浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。 |
205 Reset Content | 没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。 |
206 Partial Content | 客户发送了一个带有Range头的GET请求,服务器完成了它。 |
消息 | 描述 |
---|---|
300 Multiple Choices | 多重选择。链接列表。用户可以选择某链接到达目的地。最多允许五个地址。 |
301 Moved Permanently | 所请求的页面已经转移至新的url。 |
302 Found | 所请求的页面已经临时转移至新的url。 |
303 See Other | 所请求的页面可在别的url下被找到。 |
304 Not Modified | 未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。 |
305 Use Proxy | 客户请求的文档应该通过Location头所指明的代理服务器提取。 |
306 Unused | 此代码被用于前一版本。目前已不再使用,但是代码依然被保留。 |
307 Temporary Redirect | 被请求的页面已经临时移至新的url。 |
消息 | 描述 |
---|---|
400 Bad Request | 服务器未能理解请求。 |
401 Unauthorized | 被请求的页面需要用户名和密码。 |
401.1 | 登录失败。 |
401.2 | 服务器配置导致登录失败。 |
401.3 | 由于 ACL 对资源的限制而未获得授权。 |
401.4 | 筛选器授权失败。 |
401.5 | ISAPI/CGI 应用程序授权失败。 |
401.7 | 访问被 Web 服务器上的 URL 授权策略拒绝。这个错误代码为 IIS 6.0 所专用。 |
402 Payment Required | 此代码尚无法使用。 |
403 Forbidden | 对被请求页面的访问被禁止。 |
403.1 | 执行访问被禁止。 |
403.2 | 读访问被禁止。 |
403.3 | 写访问被禁止。 |
403.4 | 要求 SSL。 |
403.5 | 要求 SSL 128。 |
403.6 | IP 地址被拒绝。 |
403.7 | 要求客户端证书。 |
403.8 | 站点访问被拒绝。 |
403.9 | 用户数过多。 |
403.10 | 配置无效。 |
403.11 | 密码更改。 |
403.12 | 拒绝访问映射表。 |
403.13 | 客户端证书被吊销。 |
403.14 | 拒绝目录列表。 |
403.15 | 超出客户端访问许可。 |
403.16 | 客户端证书不受信任或无效。 |
403.17 | 客户端证书已过期或尚未生效。 |
403.18 | 在当前的应用程序池中不能执行所请求的 URL。这个错误代码为 IIS 6.0 所专用。 |
403.19 | 不能为这个应用程序池中的客户端执行 CGI。这个错误代码为 IIS 6.0 所专用。 |
403.20 | Passport 登录失败。这个错误代码为 IIS 6.0 所专用。 |
404 Not Found | 服务器无法找到被请求的页面。 |
404.0 | (无)–没有找到文件或目录。 |
404.1 | 无法在所请求的端口上访问 Web 站点。 |
404.2 | Web 服务扩展锁定策略阻止本请求。 |
404.3 | MIME 映射策略阻止本请求。 |
405 Method Not Allowed | 请求中指定的方法不被允许。 |
406 Not Acceptable | 服务器生成的响应无法被客户端所接受。 |
407 Proxy Authentication Required | 用户必须首先使用代理服务器进行验证,这样请求才会被处理。 |
408 Request Timeout | 请求超出了服务器的等待时间。 |
409 Conflict | 由于冲突,请求无法被完成。 |
410 Gone | 被请求的页面不可用。 |
411 Length Required | “Content-Length” 未被定义。如果无此内容,服务器不会接受请求。 |
412 Precondition Failed | 请求中的前提条件被服务器评估为失败。 |
413 Request Entity Too Large | 由于所请求的实体的太大,服务器不会接受请求。 |
414 Request-url Too Long | 由于url太长,服务器不会接受请求。当post请求被转换为带有很长的查询信息的get请求时,就会发生这种情况。 |
415 Unsupported Media Type | 由于媒介类型不被支持,服务器不会接受请求。 |
416 Requested Range Not Satisfiable | 服务器不能满足客户在请求中指定的Range头。 |
417 Expectation Failed | 执行失败。 |
423 | 锁定的错误。 |
消息 | 描述 |
---|---|
500 Internal Server Error | 请求未完成。服务器遇到不可预知的情况。 |
500.12 | 应用程序正忙于在 Web 服务器上重新启动。 |
500.13 | Web 服务器太忙。 |
500.15 | 不允许直接请求 Global.asa。 |
500.16 | UNC 授权凭据不正确。这个错误代码为 IIS 6.0 所专用。 |
500.18 | URL 授权存储不能打开。这个错误代码为 IIS 6.0 所专用。 |
500.100 | 内部 ASP 错误。 |
501 Not Implemented | 请求未完成。服务器不支持所请求的功能。 |
502 Bad Gateway | 请求未完成。服务器从上游服务器收到一个无效的响应。 |
502.1 | CGI 应用程序超时。 · |
502.2 | CGI 应用程序出错。 |
503 Service Unavailable | 请求未完成。服务器临时过载或宕机。 |
504 Gateway Timeout | 网关超时。 |
505 HTTP Version Not Supported | 服务器不支持请求中指明的HTTP协议版本。 |