Servlet[转]

Servlet
HTTP 超文本 传输 协议

1 客户端 client 浏览器,手机OS,软件

2 服务器 server 提供数据的电脑

3 请求 request

4 响应 response

HTTP协议规定了request和response的格式:

Request

1 请求行 request-line

GET /index.jsp HTTP/1.1

请求方法 资源路径 HTTP版本

2请求头 request-head

解释:请求服务器时的附加信息,比如指定主机名,请求数据的长度,是否设置防盗链referer等

比如请求百度服务器:

Host:www.baidu.com

3请求体 request-body

请求服务器时是否需要向服务器发送数据。

GET请求无需请求体,POST需要请求体

Response

1 响应行

HTTP版本 状态码 描述

状态码:1开头 消息

2开头成功 比如200

3开头 重定向 比如302 重新请求另一个URL

4开头 客户端错误 比如404 not found

5开头 服务器错误 比如500 服务器错误

状态码 200 代表成功

2 响应头

响应数据的附加信息,犹如响应数据的属性。

3 响应体

服务器返回给客户端的数据,比如百度返回百度首页。

以DOS命令窗口为client请求百度首页:

1 启用telnet功能,目的是登录连接百度的web服务器 BWS

2 启动dos窗口,输入telnet www.baidu.com 80 然后回车

3 ctrl+] 启用telnet的屏显
Servlet[转]

4 继续打回车,进入telnet的编辑模式

5 录入

GET / HTTP1.1

HOST:WWW.BAIDU.COM

6 敲两次回车键,代表第一次请求录入结束,第二次发送请求

过程如下:

Servlet[转]

Servlet[转]

下面是浏览器上使用开发者工具捕获到的:供参考

请求头:

Accept:

text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8

Accept-Encoding:

gzip, deflate, br

Accept-Language:

zh-CN,zh;q=0.9

Cache-Control:

max-age=0

Connection:

keep-alive

Cookie:

PSTM=1531101024; BIDUPSID=08D30F43E835D4D6D2475238BF56D8CA; BD_UPN=12314353; BAIDUID=EA91866C5B58552F3089BDEFFBDBB67B:FG=1; ispeed_lsm=2; BDUSS=XdIZ0pkUm9MT1FSVmJSV21mOUh-b2d2M25qbm42R09vQ2RzfjlNTEFHNXB3cEJiQVFBQUFBJCQAAAAAAAAAAAEAAADSYHcktrm2uc3ezd7X38~CyKUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk1aVtpNWlbb; delPer=0; pgv_pvi=7894304768; BD_HOME=1; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; BD_CK_SAM=1; PSINO=1; H_PS_PSSID=1437_21087_19897_26350_26925_20927; sug=3; sugstore=1; ORIGIN=0; bdime=0

Host:

www.baidu.com

Upgrade-Insecure-Requests:

1

User-Agent:

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36

响应头:

Bdpagetype:

2

Bdqid:

0xc8a5c55c0000bbee

Cache-Control:

private

Connection:

Keep-Alive

Content-Encoding:

gzip

Content-Type:

text/html;charset=utf-8

Date:

Mon, 20 Aug 2018 01:53:40 GMT

Expires:

Mon, 20 Aug 2018 01:53:40 GMT

Server:

BWS/1.1

Set-Cookie:

BDSVRTM=258; path=/

Set-Cookie:

BD_HOME=1; path=/

Set-Cookie:

H_PS_PSSID=1437_26910_21087_19897_26350_26925_20927; path=/; domain=.baidu.com

Strict-Transport-Security:

max-age=172800

Transfer-Encoding:

chunked

X-Ua-Compatible:

IE=Edge,chrome=1

Servlet

接口 定义一些处理请求的方法。返回给客户端动态资源。我们使用都是创建一个继承于HTTPServlet类(实现了Servlet接口)的子类。

处理doGet,doPost方法。

MyServlet–》HttpServlet–>GenericServlet

Servlet 的生命周期

1 何时创建? 第一次请求时加载,并创建对象

2 何时消亡? destroy方法调用时,即服务器关闭时

1 Init()方法 初始化方法

2 service()方法 处理请求方式,对于客户端过来的请求无论是什么方式的请求,都会拦截,如果存在doGet,则不会调用。

其实service方法只在HttpSerlvet类都已经确定好,而我们创建的servlet类都是HttpSerlvet子类,那么我们无需再重写此方法。

3 destroy()方法 serlvet对象生命消亡的方法,在关闭服务器时调用。

Servlet3.0,使用注解的方式来表征servlet的一些数据。

如果是Servlet3之前,那么对于比如url mapping等数据需要展示在web.xml中。

Servlet3.0的方式(目前的方式):

创建servlet类时,会存在以下代码:

@WebServlet(

 urlPatterns = {

     "/MyServlet",

     "/laosun"

 },

 initParams = {

     @WebInitParam(name = "username", value = "laosun")

 })

Servlet3.0之前的方式:

1有关创建。老版本的servlet的创建依托于web.xml,其中配置servlet时,何时创建由

1

当然默认值是0,

如果load-on-startup的值是>=0的数,代表服务器启动时就会加载serlvet。如果值>0,值越小,加载的优先级越高。

如果是负数,代表第一次请求时加载。

以登录注册为例

Servlet 后台(server)专门处理client发送的请求。

处理:验证数据,或者跳转页面。

URL mappings URL映射

意思是通过URL请求servlet,servlet做相应的处理。

Serlvet的特点:

1 servlet就是一个java类,继承于HttpServlet

2 使用response对象对客户端做响应数据的返回,通过getWriter()方法

3 处理客户端向服务器发送的请求体

3.1以GET请求为例,请求体直接拼接在URL的?后,多个参数间用&隔开。

http://localhost:8080/LoginTest/LoginServlet?username=laosun&password=123

1 通过request.getParameter(“username”)方法获得客户端发送的请求体数据

2 为了防止乱码,request和response都要设置编码格式:

request.setCharacterEncoding(“utf-8”);

response.setCharacterEncoding(“utf-8”);

3.2 以post方式为例,使用jsp为依托,使用form表单

当点击登录按钮,跳转到serlvet,有servlet来处理请求。

post的url中是没有数据,也就是说没有?,所有的数据包装成了请求体,相对于GET请求,没有把用户名和密码裸露出来,安全。

Serlvet 映射 URL mappings

1 一个servlet对应多个URL

2 匹配?

2.1 精准匹配 /Servlet

2.2 模糊匹配 /*

2.3 后缀名匹配 *.do

优先级:精准>模糊>后缀名

/a/b/*/c 精准匹配

页面跳转:

1 内部转发 只做了一次请求

Request.getRequestDispatcher(path).forward(request,response);

2 重定向 做了两次请求

Response.sendRedirect(location);

区别:

  内部转发,只做了一次请求

  比如browser 第一次请求servlet,获得a.JSP,在servlet中执行类内部转发代码,就将b.jsp返回给browser,整个过程只进行一次请求(跳转到内部网页)

  重定向,做了两次请求

  比如browser 第一次请求servlet,获得a.JSP,在servlet中执行类内部转发代码,就将b.jsp返回给browser的是一个302的状态码,并且包含一个新的URL的location响应头,然后browser接收到location的响应头后发送第二次请求,整个过程进行两次次请求(跳转到外部的网页,比如:百度)

转自:https://blog.****.net/qq_38704184/article/details/81949784s