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 三个步骤:
- 创建一个class实现servlet接口
- 实现方法
- 创建的类在 web.xml 文件中做配置(将请求路径和java程序的对应关系建立起来)
Servlet2.5 与Servlet3.0 区别
Servlet3.0相较于Servlet2.5: 新增了一些注解,简化的javaweb代码开发,可以省略 web.xml 配置,支持异步处理(多线程技术)支持可插性特性(书写的代码编译后生成的class文件可以直接部署到其他项目的,自动加载执行)
Servlet3.0 中
创建 servlet ,在 @WebServlet 注解中添加 urlPatterns = "/hello" ,hello作为请求路径
servlet生命周期
- 浏览器通过 URL 请求 tomcat 服务器
- tomcat 服务器将 URL 解析后找到相应的项目,并查找是否有 urlPatterns = "对应路径" 的 servlet 存在
- 查找到 servlet 后创建对象,调用 init 方法初始化 servlet
- tomcat 创建 request 、response 对象,并调用 service方法。执行成后,修改 response 并返回
- tomcat 将 response 解析成 http响应格式的数据,返回给浏览器
- 浏览器解析,显示数据
- 如果 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请求方式
请求头
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() 返回此请求包含的所有头名称的枚举
盗链
跳过下载前的跳转验证,直接获取下载地址发出下载请求。
解决方式:
- 使用 request 对象的 getHeader 方法获取 referer 请求头信息
- 通过 referer 判断请求的来源地址,判断是否与当前项目统一。
获取请求参数
常用方法
- String getParameter(String name) 根据表单的name属性 获取对应的值
- String[] getParameterValues(String name) 获取name相同的所有value 例如复选框。
- 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 对象的方法)
心得:
今天的学习还比较轻松,自己基本上都掌握了,今天状态还可以,感觉渐渐的有学习的感觉,学习起来又有劲了。
近期评论