解析Servlet重点知识转发与重定向,get请求与post请求,以及http协议的了解

1,356 阅读10分钟

一、什么是servlet

web服务器.png

servlet是基于Jakarta技术的 Web组件,由容器管理,可生成动态内容。与其他基于Jakarta 技术的组件一样,servlet是独立于平台的Java类,它们被编译为与平台无关的字节码,这些字节码可以动态加载到支持Jakarta 技术的Web服务器中并由其运行。容器,有时晓称为servlet引擎,是提供servlet功能的 Web服务器扩展。Servlet通过servlet容器实现的请求/响应范式与Web客户端交互。

概念:

  • Servlet : server Apple 的简称,是服务器端的程序(代码、功能实现),可交互式的处理客户端发送到服务端的请求,并完成操作响应
  • 动态网页技术
  • javaWeb程序开发的基础,JavaEE规范(一套java接口)的一个组成部分

作用:

  • 接受客服端请求,完成操作
  • 动态生成网页(页面数据可变)
  • 将包含操作结果的动态网页响应给客户

开发一个自己的Servlet

之前也写了一些教程,但是根据自己的摸索,发现了一个边界的创建方法,没有那么麻烦,但是对idea版本有要求,有些版本的操作不一样,这里说说我的idea进行Servlet 的操作

new -> file -> project 然后进行下面的选择

只需要这一步,就可以把servlet 90%的配置都完成,然后就是一些小配置

完成这两步,恭喜你,Servlet配置就完成啦!下面式运行结果

ENDEND

idea安装与绿化

好像有些版本的idea不能这样子操作,如果需要该版本的idea,请私聊我,免费分享+ 永久绿化jar包!这里就不挂连接了!

二、什么是servlet 容器

servlet容器是Web服务器或应用程序服务器的一部分,它提供发送请求和响应的网络服务、解码基于MIME的请求以及格式化基于MIME的响应。servlet容器还通过其生命周期包含和管理servlet。

三、什么是http协议

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,是一个基于请求与响应模式的、无状态的、应用层的协议,运行于TCP协议(三次握手,四次挥手)基础之上。

http协议的特点

支持客户端(浏览器)/服务器模式。 简单快速:客户端只向服务器发送请求方法和路径,服务器即可响应数据,因而通信速度很快。请求方法常用的有GET、POST等。 灵活:HTTP允许传输任意类型的数据,传输的数据类型由content-Type标识。 无连接:无连接指的是每次TCP连接只处理一个或多个请求,服务器处理完客户的请求后,即断开连接。采用这种方式可以节省传输时间。

  • HTTP1.0版本是一个请求响应之后,直接就断开了。称为短连接。
  • HTTP1.1版本不是响应后直接就断开了,而是等几秒钟,这几秒钟之内有新的请求,那么还是通过之前的连接通道来收发消息,如果过了这几秒钟用户没有发送新的请求,就会断开连接。称为长连接。无状态:HTTP协议是无状态协议。
  • 无状态是指协议对于事务处理没有记忆能力。l

http协议通信流程

客户与服务器建立连接(三次握手)。

客户向服务器发送请求。

服务器接受请求,并根据请求返回相应的文件作为应答。客户与服务器关闭连接(四次挥手)。

http请求报文

当浏览器向web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息(请求报文),HTTP请求信息由4部分组成: 1、请求行 请求方法/地址URL协议/版本

2、请求头(Request Header) 3、空行 4、请求正文

http响应报文

HTTP响应报文与HTTP请求报文相似,HTTP响应也由4个部分组成:

1、状态行 2、响应头(Response Header)3、空行 4、响应正文

响应报文常见的状态码

状态代码状态描述说明
200OK客户端请求成功
302Found临时重定向
403Forbidden服务器接受请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因
404Not Found请求的资源不存在,例如URL错误
500Internal Server Error服务器发生不可预期的错误,导致无法完成客服端的请求

(熟悉:http特点、请求报文和响应报文、状态码)

四、 Servlet 细解

Servlet 除了实现Servlet接口,还可以通过继承GenericServlet或者 HttpServlet类,完成编写

  1. 实现Servlet接口必须重写5个方法

1.init(ServletConfig config) 2.ServletConfig getServletConfig0 3.service(ServletRequest req,ServletResponse res)

4.String getServletlnfo() 5.destroy()

  1. GenericServlet抽象类

GenericServlet使编写Servlet变得更容易。它提供生命周期方法init和destroy的简单实现,要编写一般的Servlet,只需重写抽象service方法即可。

  1. HttpServlet类(推荐使用)

HttpServlet是继承Genericservlet的基础上进一步的扩展(extends GenericServlet)。 提供将要被子类化以创建适用于Web站点的HTTP servlet 的抽象类。HttpServlet的子类至少必须重写一个方法,该方法通常是以下这些方法之—: doGet,如果servlet支持HTTP GET请求

doPost,用于HTTP POST 请求 doPut,用于HTTP PUT请求 doDelete,用于HTTP DELETE请求\

请求原理: 客户端响应过来的请求由HttpServlet进行判断是get还是post请求,再进入doPost或者doGet

常见的一些错误:

  1. HTTP Status404 资源找不到

  • 第一种:地址书写错误

  • 第二种:地址没有问题,把idea项目中的out目录删除,然后重新运行

  1. Servlet地址配置重复: both mapped to the url-pattern [/helloservlet] which is not permitted
  2. Servlet地址配置错误,比如: 里面没有写 /

web.xml配置信息说明:

url-pattern定义匹配规则,取值说明。

精确匹配 /具体的名称 只有url路径是具体的名称的时候才会触发Servlet

后缀匹配 *.XXX 只要是以xxx结尾的就匹配触发Servlet

通配符匹配 /* 匹配所有请求,包含服务器的所有资源

通配符匹配 / 匹配所有请求,包含服务器的所有资源,不包括.jsp

load-on-startup

1、元素标记容器是否应该在web应用程序启动的时候就加载这个servlet。

2、它的值必须是一个整数,表示servlet被加载的先后顺序。

3、如果该元素的值为负数或者没有设置.则容器会当Servlet被请求时再加载。

4、如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个servlet,值越小,servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载。

使用注解的方式(Servlet3.0后支持)

name: Serlvet名字(可选) value:配置url路径,可以配置多个 urlPatterns:配置url路径,和value作用一样,不能同时使用 loadonStartup:配置servlet的创建的时机,如果是0或者正数启动程序时创建,如果是负数,则访问时创建。数子越小优先级越高。

package com.zking.study;
​
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(urlPatterns = {"/bs","/bss"})
@WebServlet(value = {"/bs","/bss"},loadOnStartup = 0) 
​
public class BasicServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("这是get");
    }
​
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("这是post");
    }
}
​

五、Servlet重点知识与应用get、post请求方式、转发与重定向

4.1 get与Post区别以及原理图

在Servlet中用来处理客户端请求需要用的doGet或doPost方法的request对象(如图)

get与post 的区别

  • get请求:

get提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连

get方式明文传递,数据量小,不安全

效率高,浏览器默认请求方式为GET请求

对应的servlet的方法是doGet

  • post请求

post方法是把提交的数据放在HTTP包的Body中

密文传递数据,数据量大,安全

效率相对没有GET高

对应的servlet的方法是doPost

  • request主要方法
方法名说明
getParameter(String name)返回String类型,根据表单组件名称获取提交数据
void setCharacterEncoding(String charset)指定每个请求的字符编码
//        post方式响应回来的数据,一定要修改字符编码,不然会出现乱码

注意虽然我们写的 Servlet地址是/**但是在页面中访问的时候一定是访问你的html后缀的文件,不然就是一篇空白!

  • response对象

用于响应客户请求并向客户端输出信息

response主要方法

方法名称作用
setHeader(name.value)设置响应信息头
setContentType(String)设置响应文件类型、响应式的编码格式
setCharacterEnconding(String)设置服务端响应内容字符编码格式
getWriter()获取字符输出流

4.2 转发与重定向(重要)

转发:

作用在服务器端,将请求发给服务器上的其他资源,以共同完成一次请求的处理

语法

request.getREquestDispatcher("/目标url-pattern").forward(request,response);

数据传递:

使用forward跳转时,时再服务器内部跳转,地址栏不发生变化,属于同一次请求(请求次数为1次)

forward表示一次请求,是在服务器内部跳转,可以共享同一次request作用域中的数据

request作用域:拥有存储数据的空间,作用范围是一次请求有效(一次请求可以经过多次转发)。

可以将数据存入request后,在一次请求过程中的任何位置进行获取

  • 可传递任何数据(基本数据类型、对象、数组、集合等)
  • 存数据:request.setAttribute(key,value);
  • 以键值对形式存储在request作用域中。key为String类型,value为object类型·取数据:request.getAttribute(key);
  • 通过String类型的key访问Object类型的value

转发特点:

转发是服务器行为 转发是浏览器只做了一次访问请求转发浏览器地址不变 转发两次跳转之间传输的信息不会丢失,所以可以通过request进行数据的传递、转发只能将请求转发给同一个Web应用中的组件

原理图:

request请求原理.png

重定向:

重定向作用在客户端,客户端将请求发送给服务器后,服务器响应给客户端一个新的请求地址,客户端重新发送新请求。

语法:

response.sendRedirct("地址")

数据传递:

sendRedirect跳转时,地址栏改变,代表客户端重新发送的请求。属于两次请求 response没有作用域,两次request请求中的数据无法共享 传递数据:通过URI的拼接进行数据传递("/WebProject/b?username=tom");

获取数据:request.getParameter("username");

特点:

重定向是客户端行为。 重定向是浏览器做了至少两次的访问请求。重定向浏览器地址改变。 重定向两次跳转之间传输的信息会丢失(request范围)。 重定向可以指向任何的资源,包括当前应用程序中的其他资源、同一个站点上的其他应用程序中的资源、其他站点的资源。

原理图:

respose请求原理.png 转发与重定向总结

  1. 当两个Servlet需要传递数据时,选择forward转发。不建议使用sendRedirect进行传递
  2. 转发与重定向在一个servlet中只能选择一个,不能同时出现