学习笔记 --Servlet 技术

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

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

    3187 引用 • 8213 回帖
  • Servlet
    21 引用 • 29 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • CodeMirror
    1 引用 • 2 回帖 • 131 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 764 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    286 引用 • 248 回帖 • 62 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖
  • Spark

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

    74 引用 • 46 回帖 • 553 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    153 引用 • 3783 回帖 • 1 关注
  • 禅道

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

    6 引用 • 15 回帖 • 116 关注
  • GitHub

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

    209 引用 • 2031 回帖
  • 音乐

    你听到信仰的声音了么?

    60 引用 • 511 回帖
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    334 引用 • 323 回帖 • 2 关注
  • VirtualBox

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

    10 引用 • 2 回帖 • 6 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖
  • danl
    133 关注
  • 七牛云

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

    27 引用 • 225 回帖 • 168 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 3 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    77 引用 • 430 回帖
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1434 引用 • 10054 回帖 • 489 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 4 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖 • 1 关注
  • JSON

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

    52 引用 • 190 回帖 • 1 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    53 引用 • 40 回帖
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 624 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖 • 2 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    149 引用 • 257 回帖
  • Gzip

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

    9 引用 • 12 回帖 • 134 关注
  • 导航

    各种网址链接、内容导航。

    40 引用 • 173 回帖 • 1 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    568 引用 • 3532 回帖