Web开发(Servlet)
创始人
2024-03-31 20:03:19
0

一、Web基础

如今我们访问网站都是基于Web这种Browser/Server模式,简称BS架构,它的特点是,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器,获取Web页面,并把Web页面展示给用户即可。

Web页面具有极强的交互性。由于Web页面是用HTML编写的,而HTML具备超强的表现力,并且,服务器端升级后,客户端无需任何部署就可以使用到新的版本,因此,BS架构升级非常容易。

HTTP协议

  • HTML是一种用来定义网页的文本,会HTML,就可以编写网页;

  • HTTP是在网络上传输HTML的协议,用于浏览器和服务器的通信。

  • HTTP协议是一个基于TCP协议之上的请求-响应协议。

对于Browser来说,请求页面的流程如下:

  • 与服务器建立TCP连接;
  • 发送HTTP请求;
  • 收取HTTP响应,然后把网页在浏览器中显示出来。 
GET / HTTP/1.1
Host: www.sina.com.cn
User-Agent: Mozilla/5.0 xxx
Accept: */*
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8

服务器的响应如下:

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 21932
Content-Encoding: gzip
Cache-Control: max-age=300
...网页数据...

服务器响应的状态码一般有如下几种

  • 200 OK:表示成功;
  • 301 Moved Permanently:表示该URL已经永久重定向;
  • 302 Found:表示该URL需要临时重定向;
  • 304 Not Modified:表示该资源没有修改,客户端可以使用本地缓存的版本;
  • 400 Bad Request:表示客户端发送了一个错误的请求,例如参数无效;
  • 401 Unauthorized:表示客户端因为身份未验证而不允许访问该URL;
  • 403 Forbidden:表示服务器因为权限问题拒绝了客户端的请求;
  • 404 Not Found:表示客户端请求了一个不存在的资源;
  • 500 Internal Server Error:表示服务器处理时内部出错,例如因为无法连接数据库;
  • 503 Service Unavailable:表示服务器此刻暂时无法处理请求。

二、Servlet

实现一个最简单的Servlet:(注解)

// WebServlet注解表示这是一个Servlet,并映射到地址/:
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("hello tomcat");//通过请求对象 获取请求参数  HttpServletRequest req      form   aString username = req.getParameter("username");String password = req.getParameter("password");System.out.println("password = " + password);System.out.println("username = " + username);//通过HttpServletRequest req   还有哪些信息可以获取?//  获取请求方式   get  post  delete  putString method = req.getMethod();System.out.println("method = " + method);// 请求地址的获取String servletPath = req.getServletPath();System.out.println("servletPath = " + servletPath);//项目的虚拟名称String contextPath = req.getContextPath();System.out.println("contextPath = " + contextPath);// 请求地址的全称   URL  统一资源定位符 http://localhost:8080/javaweb/helloStringBuffer requestURL = req.getRequestURL();System.out.println("requestURL = " + requestURL);//资源地址   /javaweb/helloString requestURI = req.getRequestURI();System.out.println("requestURI = " + requestURI);// 协议  HTTP/1.1String protocol = req.getProtocol();System.out.println("protocol = " + protocol);//  设置响应格式   html   jsonresp.setContentType("text/html;charset=utf-8");//  响应数据给前端浏览器  HttpServletResponse resp  通过响应对象  获取输出流 通过流将数据响应给前端浏览器PrintWriter writer = resp.getWriter();writer.write("

hello tomcat

"); //table 展示用户信息 id username password address 5条数据writer.close();} }

当然也可以使用配置文件的方法,我们只需要配置web.xml文件如下

helloServletcn.kgc.servlet.HelloServlethelloServlet/hello.do

Servlet处理请求过程

URL:http://localhost:8080/hello.do

step1:根据ip和端口号建立连接

step2:浏览器端通信模块打包数据

step3:发送数据到服务器

step4: 服务器通信模块解析数据

step5:容器创建request和response对象,然后将解析后的数据存放到request对象中

step6: 根据请求路径,寻找相关的servlet类创建对象,

step7:调用其service方法,将step5创建的对象作为参数传入

step8:获取service方法处理后的结果,并打包响应回浏览器

step9:浏览器的通信模块解析响应数据

step10:展示数据

Servlet HTTP 状态码

代码消息描述
100Continue只有请求的一部分已经被服务器接收,但只要它没有被拒绝,客户端应继续该请求。
101Switching Protocols服务器切换协议。
200OK请求成功。
201Created该请求是完整的,并创建一个新的资源。
202Accepted该请求被接受处理,但是该处理是不完整的。
300Multiple Choices链接列表。用户可以选择一个链接,进入到该位置。最多五个地址。
301Moved Permanently所请求的页面已经转移到一个新的 URL。
302Found所请求的页面已经临时转移到一个新的 URL。
303See Other所请求的页面可以在另一个不同的 URL 下被找到。
306Unused在以前的版本中使用该代码。现在已不再使用它,但代码仍被保留。
307Temporary Redirect所请求的页面已经临时转移到一个新的 URL。
400Bad Request服务器不理解请求。
401Unauthorized所请求的页面需要用户名和密码。
402Payment Required您还不能使用该代码。
403Forbidden禁止访问所请求的页面。
404Not Found服务器无法找到所请求的页面。.
405Method Not Allowed在请求中指定的方法是不允许的。
406Not Acceptable服务器只生成一个不被客户端接受的响应。
407Proxy Authentication Required在请求送达之前,您必须使用代理服务器的验证。
408Request Timeout请求需要的时间比服务器能够等待的时间长,超时。
409Conflict请求因为冲突无法完成。
410Gone所请求的页面不再可用。
411Length Required"Content-Length" 未定义。服务器无法处理客户端发送的不带 Content-Length 的请求信息。
412Precondition Failed请求中给出的先决条件被服务器评估为 false。
413Request Entity Too Large服务器不接受该请求,因为请求实体过大。
414Request-url Too Long服务器不接受该请求,因为 URL 太长。当您转换一个 "post" 请求为一个带有长的查询信息的 "get" 请求时发生。
415Unsupported Media Type服务器不接受该请求,因为媒体类型不被支持。
500Internal Server Error未完成的请求。服务器遇到了一个意外的情况
501Not Implemented未完成的请求。服务器不支持所需的功能。
502Bad Gateway未完成的请求。服务器从上游服务器收到无效响应。
503Service Unavailable未完成的请求。服务器暂时超载或死机。
504Gateway Timeout网关超时。
505HTTP Version Not Supported服务器不支持"HTTP协议"版本。

Servlet 生命周期

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:

(1)Servlet 初始化后调用 init () 方法。只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用

(2)Servlet 调用 service() 方法来处理客户端的请求。service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。

(3)Servlet 销毁前调用 destroy() 方法。destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。

(4)最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的

Servlet 客户端 HTTP 请求

HTTP协议

超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。

三个基本原则

1.基于请求响应模型

2.一次请求对应一次响应

3.请求必须是客户端发出,服务端只能被动的等待请求,然后做出回应

HTTP请求格式

1.请求行(请求方式 请求资源路径 协议和版本)

2.消息头

3.请求实体内容

如果请求的方式是get请求,那么请求的实体内容为空,只有请求方式是post请求时,实体内容才有数据

Servlet 服务器 HTTP 响应

1.状态行

2.响应头

3.响应实体内容

案列:模拟使用servlet实现用户的查询,并展示在前端页面,此处没有使用html页面和jsp页面。

import cn.kgc.javaweb.entity.User;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;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;@WebServlet("/table")  //  通过注解取代配置的方式  实现servlet的声明
public class TableServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 响应一个表格给前端浏览器  html   username  password  addressString username = req.getParameter("username");String password = req.getParameter("password");String address = req.getParameter("address");System.out.println("address = " + address);System.out.println("username = " + username);System.out.println("password = " + password);User user = new User();user.setUsername(username);user.setPassword(password);user.setAddress(address);// 将user对象封装到集合ArrayList users = new ArrayList<>();Collections.addAll(users, user,user,user,user);// 将获取的参数 响应成一个表格给前端浏览器  jsonresp.setContentType("text/html;charset=utf-8");PrintWriter writer = resp.getWriter();writer.write("");writer.write(" ");writer.write("");writer.write("");writer.write("");writer.write("");//  通过 查询数据库 将查询的结果响应给浏览器  Listusers.forEach(usr->{writer.write(" ");writer.write("");writer.write("");writer.write("");writer.write("");});writer.write("
用户名密码地址
"+usr.getUsername()+""+usr.getPassword()+""+usr.getAddress()+"
");// 关闭流 释放资源writer.close();} }

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...