学习笔记 --Servlet 技术

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

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

    3200 引用 • 8216 回帖 • 1 关注
  • Servlet
    22 引用 • 29 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    37 引用 • 157 回帖
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 498 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 160 关注
  • Chrome

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

    63 引用 • 289 回帖
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    20 引用 • 7 回帖 • 2 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 29 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖 • 1 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 396 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 635 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    91 引用 • 59 回帖 • 3 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 113 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 60 关注
  • 996
    13 引用 • 200 回帖 • 6 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    36 引用 • 37 回帖 • 546 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 636 关注
  • sts
    2 引用 • 2 回帖 • 230 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    32 引用 • 108 回帖
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖 • 1 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    6 引用 • 15 回帖 • 12 关注
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 467 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 3 关注