2-34 Servlet转发与重定向及HTTP状态码

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.请求资源路径,但是需要注意参数是隐藏

  1. 3版本【使用HTTP协议】 HTTP/1.1

  2. 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 请求
  • initdestroy,用于管理 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程序的类【全限定名称&#45;&#45;》包名+类名】-->
        <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属性类表

属性名类型描述
nameString指定Servlet的name属性值,等价于在web.xml文件中配置类的全限定名称
valueString[]该属性等价于url-pattern,指定访问路径,但是不建议两者同时使用
urlPatternsString[]指定一组Servelt的URL匹配模式
loadOnStartupint指定Servelt的加载顺序
intParamsWebInitParam[]指定一组servlet初始化参数
asyncSupportedboolean声明Servlet是否支持异步操作模式
descriptionString描述当前Servlet
dispalyNameString描述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.5ISAPI/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.6IP 地址被拒绝。
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.20Passport 登录失败。这个错误代码为 IIS 6.0 所专用。
404 Not Found服务器无法找到被请求的页面。
404.0(无)–没有找到文件或目录。
404.1无法在所请求的端口上访问 Web 站点。
404.2Web 服务扩展锁定策略阻止本请求。
404.3MIME 映射策略阻止本请求。
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.13Web 服务器太忙。
500.15不允许直接请求 Global.asa。
500.16UNC 授权凭据不正确。这个错误代码为 IIS 6.0 所专用。
500.18URL 授权存储不能打开。这个错误代码为 IIS 6.0 所专用。
500.100内部 ASP 错误。
501 Not Implemented请求未完成。服务器不支持所请求的功能。
502 Bad Gateway请求未完成。服务器从上游服务器收到一个无效的响应。
502.1CGI 应用程序超时。 ·
502.2CGI 应用程序出错。
503 Service Unavailable请求未完成。服务器临时过载或宕机。
504 Gateway Timeout网关超时。
505 HTTP Version Not Supported服务器不支持请求中指明的HTTP协议版本。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值