0
点赞
收藏
分享

微信扫一扫

HTTP&Servlet基础

Greatiga 2022-02-08 阅读 50

HTTP&Servlet基础

HTTP

即超文本传输协议,定义了客户端与服务器通信时,发送与接收信息的格式。

HTTP特点

1.基于TCP/IP协议
2.默认端口为80
3.基于请求响应模型:一次请求对应一次响应
4.无状态的:每次请求都是相互独立的,不能进行交互

请求消息格式

请求行
格式:请求方式 请求url 请求协议/版本
其中请求方式有GET和POST请求两种。当为GET请求时请求参数在请求行的请求url后,请求的url有长度限制。当为POST请求时,请求参数在请求体中请求的url没有长度限制。
请求头
格式:请求头名称 : 请求头值
常见的请求头有User-Agent和Referer。User-Agent会告知服务器使用的浏览器版本信息,可以在服务器端获取该头的信息,解决浏览器的兼容性问题。Referer可以告诉服务器当前请求从哪里来,可以防止盗链和用于统计工作。
请求空行
为一个空行,起到分割请全体和请求头信息的作用。
请求体(正文)
封装POST请求的请求参数。

响应消息格式

响应行
组成: 协议/版本 响应状态码 状态码描述
响应状态码:服务器用三位数字告诉客户端浏览器本次请求和响应的一个状态。
1xx:服务器接收到客户端的消息但是没有接收完,等待一段时间发送1xx状态码
2xx:成功 代表:200
3xx:重定向 代表:302(重定向), 304(访问缓存)
4xx:客户端错误
代表:
404:请求路径没有对应的资源
405:请求方式没有对应的do方法
5xx:服务器端错误:代表505(服务器出现异常 如: 1 / 0)
响应头
格式: 头名称 : 值
常见的响应头
Content-Type:服务器告诉客户端本次响应体的格式以及编码
Content-disposition:服务器告诉客户端以什么格式打开响应数据,其中in-line为默认值,表示以当前页面下打开,attachment表示以附件格式打开响应体,用于文件下载。
响应空行
为一个空行,起到分割响应体和响应头信息的作用。
响应体
服务器传输给客户端的资源数据

Servlet

Servlet即Server applet,是指运行在服务器上的小程序。在JAVA中Servlet是一个接口定义了java类被浏览器访问(Tomcat识别)的规则。

Servlet的执行原理

1.当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问servlet的资源路径(找到资源的主机 通过端口找到服务器 通过虚拟目录找到项目)
2. 查找web.xml文件,是否有对应的标签的内容
3.如果有,则找对应的<servlet.class>全类名
4.tomcat会创建其对象调用方法(通过类的反射机制)

Servlrt的生命周期

1.当Servlet被创建时会执行init方法,来进行初始化Servlet且执行一次。
默认情况下,第一次访问时,Servlet被创建但也可以通过配置,来指定Servlet的创建时机
第一次被访问时创建 的值为负值时,默认值为-1
服务器启动时创建 的值为正值时,或者为0
每个Servlet只创建一次对象,servlet是单例的
多个用户同时访问时,可能存在线程安全问题
解决:尽量不要在Servlet中定义成员变量,即使有成员变量时,也不要进行修改成员变量。
2.通过执行service方法来提供服务,该方法可以执行多次。每次访问Servlet时,service方法都会被调用一次。
3.执行destroy方法来销毁servlet对象,该方法只会在销毁前执行一次。

Servlrt的体系结构

1.Servlet:是最基础的接口,只定义了最基础的方法
2.GenericServlet继承了Servlet接口,是一个抽象类。抽象了service方法,对其他方法空现
3.HttpServlet继承了GenericServlet,它是对HTTP协议的一种封装,实现了八种请求方式(在servic方法中),使得操作变得更加简单,只需要复相应的doPost/doGet方法即可。

Request&Response

Request&Response是Servlet中service方法的两个参数类型,通过这两个参数的方法调用来完成一些服务。

Request

获取请求行信息
获取请求的方式: req.getMethod()
获取虚拟目录: req.getContextPath()
获取Servlet的请求路径: req.getServletPath()
获取get方式的请求参数: req.getQueryString()
获取请求URI(统一资源标识符): req.getRequestURI()
获取URL路径(统一资源定位符): req.getRequestURL()
获取协议及其版本: req.getProtocol()
获取用户的IP: req.getRemoteAddr()
获取请求头信息
用请求头的名称来获取请求头的值:String getHeader(String name)
获取所有的请求头名称IP:Enumeration getHeaderNames()
获取请求体信息
获取流对象
getReader() //获取字符输入流,只能操作字符数据
getInputStream(); 获取字节输入流,可以操作所以类型的数据
再从流对象中读取数据 readLine() != null
获取请求参数的通用方法
String getParameter(String var1);
根据参数名来获取参数值 Username = zhang && PassWord = 123
Enumeration getParameterNames();
返回所有参数名称
String[] getParameterValues(String var1);
根据参数名来获取参数值数组 hobby = xx && hobby = game
Map<String, String[]> getParameterMap();
获取所有参数的map集合
解决乱码问题
get方式:tomcat8已经解决
post方式:获取请求参数前设置编码 request.setCharacterEncoding(“utf-8”)
转发
请求转发forward:一种在服务器内部的资源跳转方式。
通过ServletRequest对象获取转发对象RequestDispatcher(getRequestDispatcher(String path)),使用RequestDispatcher对象来进行转发: forward(ServletRequest req, ServletResponse resp)
特点:
1.浏览器地址栏不发生变化
2.只能访问服务器内部资源
3.转发是一次请求
共享数据
1.域对象:一个有作用范围的对象,可以在该范围内共享数据
2.request域:代表一次请求的范围,一般用于请求转发多个共享数据
3.方法
1.void setAttribute(String name, Object obj) 存储数据
2.Object getAttribute(String name) 获取数据
3.void removeAttribute(String name) 移除数据
获取ServletContext对象
ServletContext getServletContext()

Response

设置响应消息
*设置响应行
格式:HTTP/1.1 200 ok
设置状态码:resp.setStatus(int x);
设置响应头 resp.setHeader(String name, String val)
设置响应体
1.获取输入流
字符输出流: PrintWriter getWriter()
字节输出流: ServletOutputStream getOutputStream()
2.使用输出流,将数据输入到客户端浏览器
重定向redirect
Response.sendRedirect("/path")
特点:
1.地址栏发生变化
2.重定向可以访问其他服务器的数据
3.重定向是两次请求
服务器输出字符数据到浏览器
获取字符输出流: PrintWriter writer = resp.getWriter();
输出数据:writer.write(“h1” + “聊天内容:” + words + “h1”)
注意乱码问题:获取流对象默认编码为ISO-8859-1所以在获取流对象时需要设置该流的默认编码并告诉浏览器响应体使用的编码 可以用response.setContentType(“text/html;charset=utf-8”)来解决
服务器输出字节数据到浏览器
获取字节输出流 response.getOutputStream();
输出数据 write(String.getBytes())
ServletContext对象
概念:代表整个web应用,可以和程序的容器(服务器)来通信
功能
获取MIME类型
格式 大类型/小类型 text/html image/jpeg
获取 String getMimeType(String file) 根据扩展名查找
域对象:共享数据
ServletContext域对象的范围是所有用户的所有请求
void setAttribute(String name, Object value)
String getAttribute(String name)
void removeAttribute(String name)
获取文件的真实路径
String getRealPath(String path)

Cookie&Session

Cookie

Cookie是客户端会话技术,可以将数据保存在客户端。来实现一次会话中多次请求间数据的共享。
Cookie的基本使用

  1. 创建Cookie对象,设置数据
    Cookie cookie = new Cookie(“key”, “value”);
  2. 发送Cookie到客户端,使用response对象
    response.addCookie(cookie);
  3. 获取客户端的所有Cookie,使用request
    Cookie[] cookies = request.getCookies();
  4. 使用Cookie
    cookie.getName();
    cookie.getValue();
    Cookie的原理
    当使用response.addCookie(cookie)存储cookie时,该方法会将cookie的键值对设置为响应头set-cookie的值,传递到浏览器进行存储。使用request.getCookies()获取cookie,其实是从请求头cookie中进行获取,请求头cookie的值存储了所有的cookie。
    使用细节
    默认情况下,cookie存储在浏览器中,当浏览器关闭,内存释放,则cookie被销毁。但setMaxAge(int n)方法可以设置cookie的存活时间。当为正数时,cookie被持久化到电脑硬盘,到时间后删除。当为0时,则被删除。负数为默认情况,则有浏览器保存,浏览器关闭就会消失。

Session

Session是服务端会话技术,可以将数据保存在服务端。来实现一次会话中多次请求间的数据共享。
基本使用
获取Session对象
HttpSession session = new request.getSession();
Session对象的功能
void setAttribute(String name, Object o);
Object getAttribute(String name)
void removeAttribute(String name);
实现原理
Session的 实现是基于Cookie的,通过Cookie使得request.getSession()在一次会话中,返回的session对象是同一个,来实现数据的共享。
使用细节
Session在服务器关闭时会钝化,将session数据持久化到硬盘上,再次启动服务器会将数据重新加载到session中去。
默认情况下,session会在30分钟后自动销毁,或者进行配置自动定义多长时间进行销毁。
调用session的invalidate()方法会自动销毁自己。

举报

相关推荐

0 条评论