20201030+袁鑫

学习日志

知识总结

Servlet

Servlet是用来处理客户端请求、响应给浏览器 的动态资源。但servlet的实质就是java代码,通过java的API动态的向客户端输出内容(HTML)。

抽象方法
  • void init(ServletConfig var1) :初始化 servlet ,由servlet容器调用,以指示servlet正在 将servlet放入服务中。servlet容器在实例化servlet后仅调用init方法一次。在servlet可以接收任何 请求之前,init方法必须成功完成。
  • ServletConfig getServletConfig() :返回一个ServletConfig对象,其中包含该servlet的初始化和启动参数
  • void service(ServletRequest req, ServletResponse res) :由servlet容器调用,以允许 servlet响应请求。此方法仅在servlet的init()方法成功完成后调用。
  • String getServletInfo() :以纯文本的方式返回关于servlet的信息,如作者、版本和版权
  • void destroy() :servlet销毁时调用

实现Servlet 接口,创建类

创建一个 servlet 三个步骤:

  1. 创建一个class实现servlet接口
  2. 实现方法
  3. 创建的类在 web.xml 文件中做配置(将请求路径和java程序的对应关系建立起来)
Servlet2.5 与Servlet3.0 区别

Servlet3.0相较于Servlet2.5: 新增了一些注解,简化的javaweb代码开发,可以省略 web.xml 配置,支持异步处理(多线程技术)支持可插性特性(书写的代码编译后生成的class文件可以直接部署到其他项目的,自动加载执行)

Servlet3.0 中

创建 servlet ,在 @WebServlet 注解中添加 urlPatterns = "/hello" ,hello作为请求路径

servlet生命周期

  1. 浏览器通过 URL 请求 tomcat 服务器
  2. tomcat 服务器将 URL 解析后找到相应的项目,并查找是否有 urlPatterns = "对应路径" 的 servlet 存在
  3. 查找到 servlet 后创建对象,调用 init 方法初始化 servlet
  4. tomcat 创建 request 、response 对象,并调用 service方法。执行成后,修改 response 并返回
  5. tomcat 将 response 解析成 http响应格式的数据,返回给浏览器
  6. 浏览器解析,显示数据
  7. 如果 tomcat 停止,调用 destory() 方法,销毁 servlet

Servlet体系

在 servlet 接口规范下,官方推荐使用继承的方式,继承 javax.servlet.GenericServlet 或者 javax.servlet.http.HttpServlet 来实现接口,

虽然, GenericServlet 已经简化了 servlet 开发,但是我们平时开发程序需要按照一种互联网传输 数据的协议来开发程序—— http 协议,因此,sun公司又专门提供了 HttpServlet ,来适配这种协议 下的开发。

HttpServlet 是一个抽象类,同时也是 GenericServlet 的子类,它增强了 GenericServlet 一些功 能。继承 HttpServlet ,需要重写 doGet 、 doPost 等方法中一个即可,根据 Http 不同的请求, 需要实现相应的方法。

注意:

  • Servlet对象是由服务器创建
  • request与response对象也是由tomcat服务器创建
  • request对象封装了浏览器过来的所有请求信息,response对象代表了服务器的响应信息

request

http 请求一共分为三个部分:请求行,请求头,请求体。

http协议get请求方式和http协议post请求方式

image-20201030212733856

请求头
Referer: http://localhost:8080/demo/1.html
上一次请求的地址
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36
当前用户的系统和浏览器版本。

request对象的基本概念

HttpServletRequest

HttpServletRequest 对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的 所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。

javax.servlet.http.HttpServletReuqest 不是相关请求的顶级接口,它继承自父接口 ServletRequest

通过 Request 对象进行的常用操作:

  • 获取客户端信息
  • 获取请求头信息
  • 获取请求参数
  • 利用请求域传递对象

request获取请求行信息

请求行的组成元素(通过request获取请求行数据)

在http协议中我已经看到了http协议中请求行的内容——分为请求方式、请求路径、协议版本。在 HttpServletRequest 概述中我们知道浏览器与请求相关的数据封装在 request 中,因此,接下来我 们学习如何使用request对象获取请求行的数据。

常用方法
  • String getMethod() 获取请求方式的类型
  • String getRequestURI() 获取请求行中的资源名部分
  • StringBuffer getRequestURL() 获取客户端发出请求完整URL
  • String getProtocol() 获取当前协议的名称和版本
  • String getRemoteAddr() 获取IP地址
  • int getLocalPort() 获取端口
URL和URI的区别

URL是发出请求的完整路径 包含端口号及端口号之前的路径

URI只包含端口号之后的路径

request获取请求头信息

常用方法
  • String getHeader(String name) 以String 的形式返回指定请求头的值
  • Enumeration getHeaderNames() 返回此请求包含的所有头名称的枚举
盗链

跳过下载前的跳转验证,直接获取下载地址发出下载请求。

解决方式:

  1. 使用 request 对象的 getHeader 方法获取 referer 请求头信息
  2. 通过 referer 判断请求的来源地址,判断是否与当前项目统一。

获取请求参数

常用方法
  1. String getParameter(String name) 根据表单的name属性 获取对应的值
  2. String[] getParameterValues(String name) 获取name相同的所有value 例如复选框。
  3. Map getParameterMap() 参数名作为key,参数值作为value,封装到map中。

乱码解决

void setCharacterEncoding(String env) //设置请求体的编码
//处理请求乱码
request.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charaset=UTF-8");
resp.setCharacterEncoding("UTF-8");
//处理响应乱码

作用域

就是可以在一次请求中的多个servlet之间进行数据 共享.

常用方法
  • void setAttribute(String name, Object o) 设置属性到域中
  • Object getAttribute(String name) 从域中获取属性值
  • void removeAttribute(String name) 从域中移除属性
请求转发

什么是请求转发?请求转发就是对请求进行转发。

常用方法
  • RequestDispatcher getRequestDispatcher(String path) 获取请求转发器(request对象方法)
  • void forward(ServletRequest request, ServletResponse response) 将请求转发到另一 个资源(servlet)上( RequestDispatcher 对象的方法)

心得:

今天的学习还比较轻松,自己基本上都掌握了,今天状态还可以,感觉渐渐的有学习的感觉,学习起来又有劲了。

评论

this is is footer