学习笔记 --Servlet 技术

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

//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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8207 回帖 • 1 关注
  • Servlet
    21 引用 • 29 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 8 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 566 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    205 引用 • 357 回帖
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 626 关注
  • 星云链

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

    3 引用 • 16 回帖
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖 • 1 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    21 引用 • 140 回帖 • 30 关注
  • sts
    2 引用 • 2 回帖 • 152 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    138 引用 • 268 回帖 • 192 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 427 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 394 关注
  • 开源

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

    396 引用 • 3416 回帖
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 440 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1347 回帖 • 1 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 23 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 6 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    103 引用 • 126 回帖 • 446 关注
  • danl
    64 关注
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    370 引用 • 1215 回帖 • 582 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 23 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 596 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 547 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    75 引用 • 258 回帖 • 624 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    164 引用 • 407 回帖 • 524 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 5 关注