学习笔记 --Servlet 技术

本贴最后更新于 3005 天前,其中的信息可能已经时异事殊

//Servlet 概述

一个 servlet 就是一个 java 类,并提供基于请求-响应模式的 web 服务。

//创建 Servlet

新建继承 HttpServlet 的类,覆盖 init(), destroy(), service(HttpServletRequest req, HttpServletResponse res), doGet(HttpServletRequest req, HttpServletResponse res)方法

//配置 Servlet

在 web.xml 中 servlet 项加入项,如:

data1

value1

data2

value2

TestServlet

com.netease.server.example.web.controller.TestServlet

代码中相应方法:

ServletConfig config = this.getServletConfig(); String v1 = config.getInitParameter("data1");

全局配置:

在 servlet 项外加入项,如:

globalData1

123

代码中相应方法:

ServletContext context = this.getServletContext(); String globalV1 = context.getInitParameter("globalData1");

ServletMapping 匹配规则:

支持模糊匹配

精确路径匹配(完全匹配)---> 最长路径匹配(最长前缀匹配)---> 扩展名匹配 ---> default servlet 或放弃

更改 servlet 默认启动时间:

在元素中增加元素,负数为第一次请求时启动该 servlet,大于等于 0 则在 servlet 容器启动时启动 servlet,数字越小,优先级越高,如:

0

配置错误页面:

404 /404.html

配置欢迎页面:

元素,可包含多个元素,顺序加载

MIME 类型映射

定义扩展文件名映射类型,包含两个子元素:和

//Servelt 共享动态属性

一个 servlet 代码中:

ServletContext context = this.getServletContext(); context.setAttribute("attribute1", "123");

另一个 servlet 代码中:

String globalV1 = (String)context.getAttribute("attribute1");

//Servlet 读取外部资源配置文件信息

三种方法:

1. getResource

代码如:

ServletContext context = this.getServletContext(); URL url = context.getResource("/WEB-INF/log4j.properties"); InputStream in = url.openStream(); String propertyValue = GeneralUtil.getPropery("log4j.rootCategory", in);

2. getResourceAsStream

代码如:

InputStream in2 = context.getResourceAsStream("/WEB-INF/log4j.properties"); String p2 = GeneralUtil.getPropery("log4j.rootCategory", in2);

3. getRealPath

代码如:

String path = context.getRealPath("/WEB-INF/log4j.properties"); File file = new File(path); InputStream in3 = new FileInputStream(file); String p3 = GeneralUtil.getPropery("log4j.rootCategory", in3);

//HttpServletRequest 实现类方法:

1. 获得客户机信息

getRequestURL 方法返回客户端发出请求时的完整 URL。

getRequestURI 方法返回请求行中的资源名部分。

getQueryString 方法返回请求行中的参数部分。

getRemoteAddr 方法返回发出请求的客户机的 IP 地址

getRemoteHost 方法返回发出请求的客户机的完整主机名

getRemotePort 方法返回客户机所使用的网络端口号

getLocalAddr 方法返回 WEB 服务器的 IP 地址。

getLocalName 方法返回 WEB 服务器的主机名

getMethod 得到客户机请求方式

getServerPath()获取请求的文件的路径

2. 获得客户机请求头

getHeader(string name)方法

getHeaders(String name)方法

getHeaderNames 方法

3. 获得客户机请求参数(客户端提交的数据)

getParameter(name)方法 获取请求中的参数,该参数是由 name 指定的

getParameterValues(String name)方法 获取指定名称参数的所有值数组。它适用于一个参数名对应多个值的情况。如页面表单中的复选框,多选列表提交的值。

getParameterNames 方法 返回一个包含请求消息中的所有参数名的 Enumeration 对象。通过遍历这个 Enumeration 对象,就可以获取请求消息中所有的参数名。

getCharacterEncoding() 返回请求的字符编码方式

getAttributeNames()返回当前请求的所有属性的名字集合赋值:setAttribute()

getAttribute(String name) 返回 name 指定的属性值

getsession()返回和客户端相关的 session,如果没有给客户端分配 session,则返回 null

getParameterMap():返回一个保存了请求消息中的所有参数名和值的 Map 对象。Map 对象的 key 是字符串类型的参数名,value 是这个参数所对应的 Object 类型的值数组

addHeader(String name,String value) 将指定的名字和值加入到响应的头信息中

//HttpServletResponse 实现类方法:

encodeURL(String url) 编码指定的 URL

sendError(int sc) 使用指定状态码发送一个错误到客户端

setDateHeader(String name,long date) 将给出的名字和日期设置响应的头部

setHeader(String name,String value) 将给出的名字和值设置响应的头部

setStatus(int sc) 给当前响应设置状态码

setContentType(String ContentType) 设置响应的 MIME 类型 ,页面的设置文本类型,获取或设置输出流的 HTTP MIME 类型。输出流的 HTTP MIME 类型。默认值为“text/html”

getOutputStream() 字节输出流对象

getWriter() 字符的输出流对象

//Cookie 和 Session

关于 Cookie

cookie 数量限制:20 个,每个大小限制:4kb

Cookie userNameCookie = new Cookie("userName", userName); //创建cookie userNameCookie.setMaxAge(10 * 60); //设置cookie有效时间 response.addCookie(userNameCookie); //在响应中加入cookie Cookie[] cookies = request.getCookies(); //从请求中获取cookie cookie.getValue(); //从cookie中获取值 cookie.getName(); //从cookie中获取名字

关于 Session

默认有效期 30 分钟,setMaxInactiveInterval 设置有效期,invalidate 使 session 失效

HttpSession session = request.getSession(); String name = (String) session.getAttribute("userName"); session.setMaxInactiveInterval(2 * 60); session.setAttribute("userName", userName); session.invalidate();

在部署描述符 web.xml 中配置有效期:

5

//请求转发与重定向

请求转发:

获取 RequestDispatcher:

方法 1:

RequestDispatcher rd = req.getRequestDispatcher("/forwardExample"); //可以是绝对路径或者相对路径

方法 2:

RequestDispatcher rd = this.getServletContext().getNameDispatcher("ServletForwardExample"); //转发到的 servlet 名称

或者

RequestDispatcher rd = this.getServletContext().getRequestDispatcher("/forwardExample"); //只能是绝对路径

转发:

rd.forward(req, resp);

请求重定向:

resp.sendRedirect("redirectExample"); //相对路径则访问本 web,绝对路径可以访问其他 web

//过滤器与监听器

启动顺序:ServletContext--->listener--->filter--->servlet

过滤器:

创建实现 Filter 接口的类作为过滤器,在 web.xml 中增加项和,可定义多个,可配置 FilterConfig,如下:

filterParam

111

TestFilter

com.netease.server.example.web.controller.filter.TestFilter

TestFilter

/hello/world/*

代码中:

String value = filterConfig.getInitParameter("filterParam");

在 doFilter 方法中可对 request 进行处理,如:

@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("filter doFilter method"); HttpServletRequest req = (HttpServletRequest) request; HttpSession session = req.getSession(); if (session.getAttribute("username") == null) { HttpServletResponse res = (HttpServletResponse) response; res.sendRedirect("../index.html"); } else { chain.doFilter(request, response); } }

监听器:

分类

1. 监听应用程序环境 ServletContext

ServletContextListener

ServletContextAttributeListener

2. 监听用户请求对象 ServletRequest

ServletRequestListener

ServletRequestAttributeListener

3. 监听用户会话对象 HttpSession

HttpSessionListener

HttpSessionAttributeListener

HttpSessionActivationListener

HttpSessionBindingListener

创建实现相关接口的类,如实现 HttpSessionAttributeListener,ServletContextListener, ServletRequestListener 接口的类

在 web.xml 中增加项:

com.netease.server.example.web.controller.listener.TestListener

//Servlet 并发处理

特征:单实例,多线程,线程不安全

变量的线程安全:

--参数变量本地化

--使用同步块 synchronized

属性的线程安全:

--SerletContext 线程不安全

--HttpSession 理论上线程安全

--ServletRequest 线程安全

避免在 Servlet 中创建线程

多个 Servlet 访问外部对象加锁

在代码中加入

synchronized (this) {

...

}

//JSP

动态网页技术标准

简化的 servlet

JSP = Html + Java + JSP tag

JSP 处理流程:

客户端---> 发送 JSP 请求--->JSP 文件---> 转换为 Servlet 文件---> 编译为 class 文件---> 执行并载入 servlet 实例---> 返回响应到客户端

JSP 基本语法:

1. 静态内容

模板数据

2. 指令

page 指令

--定义页面的依赖属性,比如脚本语言、error 页面、缓存需求等

include 指令

--包含其他文件

taglib 指令

--引入标签库的定义

3. 注释

<%-- 注释 --%>

4. 表达式

<%= 表达式 %>

如下:

Today's date: <%= (new java.util.Date()).toLocaleString() %>

5. 声明

<%! declaration; [declaration; ] + ... %>

如:<%! int a, b, c; %>

6. 脚本

<% 代码片段 %>

如下:

<% out.println("Your IP address is : " + request.getRemoteAddr()); %>

JSP 内置对象

request HttpServletRequest 类的实例

response HttpServletResponse 类的实例

out PrintWriter 类的实例,用于把结果输出至网页上

session HttpSession 类的实例

applicaiton ServletContext 类的实例,与应用上下文有关

config ServletConfig 类的实例

page 类似于 Java 中的 this 关键字

pageContext PageContext 类的实例,提供对 JSP 页面的所有对象以及所有命名空间的访问

Exception Exception 类的对象,代表发生错误的 JSP 页面对应的异常对象

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8217 回帖
  • Servlet
    22 引用 • 29 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 53 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    187 引用 • 832 回帖
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 2 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    118 引用 • 54 回帖 • 5 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    7 引用 • 69 回帖 • 5 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 533 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖
  • danl
    179 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    7 引用 • 28 回帖
  • 印象笔记
    3 引用 • 16 回帖 • 2 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 232 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    209 引用 • 2040 回帖
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 3 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 679 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 82 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖 • 1 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    63 引用 • 289 回帖
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 37 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    415 引用 • 3594 回帖
  • sts
    2 引用 • 2 回帖 • 243 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    29 引用 • 230 回帖 • 122 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 184 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    500 引用 • 1396 回帖 • 251 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    77 引用 • 37 回帖
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    24 引用 • 246 回帖