基础

当Servlet引擎收到一个请求,它将请求所有的细节汇编到一个HttpServletRequest对象。细节包括请求头部、URI、查询字符串和任意发送的参数等等。类似地,它初始化一个处理响应头部和响应输出流的HttpServletResponse对象,然后调用Servlet的service()方法(如果servlet是一个JSP,则为_jspService()方法),向其传递两个对象的引用。

ServletRequest对象被Servlet引擎创建.充做客户端和请求信息的包容器。它包含远程系统的标识、请求参数和与请求相关的任意输人流。类似地,ServletResponse对象向Servlet提供与其返回到初始请求器的结果进行进信的方式。它包含打开一个输出流的方法和指定内容类型和长度的方法。

只有通过注册名来访问Servlet才能取到在web.xml中设置的Servlet初始化参数,在浏览直接使用servlet/….+Servlet类名来访问Servlet是取不到的。

在发送任何文档内容到客户机之前,应该设置状态代码。必须在PrintWriter实际返回任何内容之前设置响应头。

Servlet必须实现Servlet接口,大多数Servlet通过继承GenericServlet或者HttpServlet来实现这个接口。GenericServlet的子类必须实现service()方法;HttpServlet的service()方法负责所有的doXxx()方法的调用。HttpServlet的子类只需要实现doXxx()方法。

避免使用SingelThreadModel接口。大多数使用SingelThreadModel的Servlet都可以采用同步方法或扩展资源池来更好的实现。

POST数据只能被读一次。如果POST数据已经被getReader()或者getInputStream()方法读过了,则这些信息不能被再次读取。

URL映射

说明

明确映射

不包括通配符  例如:/hello.html

路径前缀映射

以/开头以*结尾  例如:/lite/*

扩展名映射

以*开头  例如:*.jsp

默认映射

/  如果没有其它的Servlet可以匹配URL,则使用该Servlet

共享信息

请求作用域是javax.servlet.http.HttpServletRequest的各个属性的一种抽象,从Servlet中的request参数代表该作用域;jsp中的request内置对象代表该作用域。

会话作用域是javax.servlet.http.HttpSession的各个属性的一种抽象,从Servlet中调用的request.getSession()方法得到该作用域;jsp中的session对象代表该作用域。

应用程序作用域是javax.servlet.ServletContext的各个属性的一种抽象,从Servlet中调用getServletConfig().getServletContext()方法得到该作用域(getServletConfig().有时候可以省略);Jsp中的application内置对象代表该作用域。

这三个类都提供了 setAttribute() ;getAttribute() ;removeAttribute() 方法。

会话追踪

cookie是Web服务器发送到浏览器的少量文本信息,该浏览器稍后再访问相同的站点或域时原样不动的返回这些信息。通过让服务器读取它以前发送到浏览器的信息,服务器可以向访问者提供许多方便。

设置cookie

Cookie  userCookie = new  Cookie("name", "huxiaogang");

userCookie.setMaxAge(60*60*24*365);   // 1年

response.addCookie(userCookie);

注意:Cookie的名和Cookie的值都不应该包含空格和以下的字符:

[

]

(

)

=

,

"

/

?

@

:

;

读取cookie

对HttpServletRequest调用getCookies()方法,将返回Cookie对象的一个数组,如果此请求未包含Cookie,则返回null。

Cookie[]  cookies = request.getCookies();

if(cookies == null){

......

}else{

Cookie  cookie;

for(int i = 0; i < cookies.length; i++){

cookie = cookies[i];

out.println(cookie.getName() + cookie.getValue());

}

}

会话跟踪机制

使用cookie

Servlet引擎管理着一个会话表,每一个会话使用一个唯一的字符串(会话关键字)来进行识别。要根据一个请求来建立一个新的会话,就要建立一个HttpSession对象和一个会话关键字并存储在会话表中。用响应信息将会话关键字发送给客户,客户在将其和进一步的请求一起发回,这样服务器就可以识别客户重新找到与客户关联的HttpSession对象了。

一旦服务器端准备开始跟踪会话,服务器端的Servlet会调用getSession(),这会导致在HTTP响应中包含一个会话Cookie:

HTTP/1.0  200  OK

Set-Cookie: SessionKey="12345";  Version="1"

会话关键字也会包含在窗口的ACTION  URL中,因为服务器不知道客户是否会接受这个Cookie。我们假设客户接受了Cookie并且正确登陆,那么客户发送的这个请求中会包含会话关键字两次:

POST  /servlet/Login$SessionKey=12345  HTTP/1.0

Cookie: $Version="1";  SessionKey="12345"

现在服务器知道客户接受了Cookie,服务器不会在URL中编码会话关键字了,也不会发送Set-Cookie头了。客户以后发送的请求中都回包含同一个会话关键字:

GET  /servlet/OtherServlet  HTTP/1.0

Cookie:  $Version="1" ;  SessionKey="12345"

当客户要退出会话,服务器调用HttpSession对象的invalideate()方法来删除这个会话后:

HTTP/1.0  200  OK

Set-Cookie:  SessionKey="";  Version="1";  Max-Age=0

那么客户再发出的请求中都不会再包含会话关键字,这样就成为了无状态的了。

如果会话超时,那么服务器端保存的会话对象会失效,即使客户依然像以前一样在请求中包含Cookie信息:

GET  /servlet/OtherFourServlet  HTTP/1.0

Cookie:  $Version="1" ;  SessionKey="12345"

该请求也不再作为会话的一部分来考虑了。依然成为无状态的了。

使用URL重写

客户机将额外的数据附加到标识该会话的每个URL之后,且服务器把该标识符与关于会话所存储的数据相关联。

String  originalURL = someURL;

String  encodedURL = response.encodeURL(originalURL);

out.println("<A  HREF = \""+endodedURL+"\">...</A>");

String  originalURL = someURL;

String  encodedURL = response.encodeRedirectURL(originalURL);

response.sendRedirect(encodedURL);

使用隐藏域

如果应用由一系列使用Submit按钮进行导航的Html窗体组成,会话ID可被存储为一隐藏域,并通过request.getParameter()进行检索。显然,只有窗体均为动态生成的时候,此方法才有效。如果要进行会话跟踪,窗体就必须由类似CGI、Servlet或Jsp服务器进程创建的动态生成的Web页面

线程概念

Web服务器本身就是使用线程的例子,一个简单的Web服务器操作如下:

1)创建一个ServerSocket,调用其accept()方法等待HTTP客户端请求。

2)取得accept()方法返回的客户端Socket对象,启动一个单独的线程处理其请求。

3)返回到步骤1,在上—请求正被其他线程处理的同时接受更多的请求。

(注:以上转载出处不明)

Servlet 的生命周期

(1) 加载和实例化
Servlet 容器装载和实例化一个 Servlet。创建出该 Servlet 类的一个实例。
(2) 初始化
在 Servlet 实例化完成之后,容器负责调用该 Servlet 实例的 init() 方法,在处理用户请求之前,来做一些额外的初始化工作。
(3) 处理请求
当 Servlet 容器接收到一个 Servlet 请求时,便运行与之对应的 Servlet 实例的 service() 方法,service() 方法再派遣运行与请求相对应的 
doXX(doGet,doPost) 方法来处理用户请求。
(4) 销毁
当 Servlet 容器决定将一个 Servlet 从服务器中移除时 ( 如 Servlet 文件被更新 ),便调用该 Servlet 实例的 destroy() 方法,在销毁该 Servlet 实例之前,
来做一些其他的工作。
其中,(1)(2)(4) 在 Servlet 的整个生命周期中只会被执行一次。

(转载JSP/Servlet 工作原理)http://www.blogjava.net/fancydeepin/archive/2013/09/30/fan_servlet.html

Servlet 实例

//HelloWorldServlet .java

 package com.lewis.servlet;

 import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException; import java.io.IOException;
import java.io.PrintWriter; public class HelloWorldServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { //取一个参数的值1
ServletConfig config = getServletConfig();
String value1 = config.getInitParameter("parameter1"); response.setContentType("text/html; charset=utf-8"); PrintWriter out = response.getWriter(); out.println("<html>");
out.println("<head>");
out.println("<title>SimpleServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<p>Hello, World!</p>");
out.println("<p>Hello, this is my first servlet!</p>");
out.println("<p>parameter: "+value1+"</p>");
out.println("</body>");
out.println("</html>");
}
}

备注:response.setContentType(MIME) (http://blog.sina.com.cn/s/blog_a03d702f010143tw.html)

//web.xml

 <?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<display-name>My Web Application</display-name>
<servlet>
<servlet-name>helloWorldServlet</servlet-name>
<servlet-class>com.lewis.servlet.HelloWorldServlet</servlet-class>
<init-param>
<param-name>parameter1</param-name>
<param-value>First Parameter Value</param-value>
</init-param><!-- -->
</servlet>
<servlet-mapping>
<servlet-name>helloWorldServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<description>
A application for test.
</description>
</web-app>

servlet 实践的更多相关文章

  1. Servlet实践--留言板-v1

    功能介绍: 由三个jsp页面组成,在doGet中根据请求URL中的请求参数不同,跳转到不同的页面: 页面1:显示整个留言板列表 页面2:创建留言页面(包括用户.主题.内容和上传文件) 页面3:在查看单 ...

  2. Servlet实践--HelloWorld

    Servlet规范是一套技术标准,包含与Web应用相关的一系列接口,而具体的Servlet容器负责提供标准的实现,如Tomcat. Servlet的实例对象由Servlet容器负责创建,Servlet ...

  3. paip.spring3 mvc servlet的配置以及使用最佳实践

    paip.spring3 mvc servlet的配置以及使用最佳实践 1. Web.xml 1 2. springMVC.xml 2 1. mvcAction .mvcAction 2 2. Res ...

  4. 云原生实践之 RSocket 从入门到落地:Servlet vs RSocket

    技术实践的作用在于:除了用于构建业务,也是为了验证某项技术或框架是否值得大规模推广. 本期开始,我们推出<RSocket 从入门到落地>系列文章,通过实例和对比来介绍RSocket.主要围 ...

  5. Java Servlet开发的轻量级MVC框架最佳实践

    在Servlet开发的工程实践中,为了减少过多的业务Servlet编写,会采用构建公共Servlet的方式,通过反射来搭建轻量级的MVC框架,从而加快应用开发. 关于Servlet开发的基础知识,请看 ...

  6. 最佳实践: 勿在 Servlet 中实现 SingleThreadModel

    摘要 请不要实现 SingleThreadModel 接口.这种实践将导致 Web 容器创建多个 servlet 实例:即为每个用户创建一个实例.对于任何大小的应用程序,这种实践都将导致严重的性能问题 ...

  7. Java Servlet DAO实践(二)

    Java Servlet DAO实践(二) DAO连接类 package com.seller.servlets.dao; import java.sql.*; public class DataBa ...

  8. 异步Servlet的理解与实践

    AsyncContext理解 Servlet 3.0(JSR315)定义了Servlet/Filter的异步特性规范. 怎么理解"异步Servlet/Filter"及其使用情景? ...

  9. Servlet和JSP学习指导与实践(三):JSP助阵

    前言: JSP(Java Server Page)虽然作为一门服务端的语言,但它并没有创新新的语言标准.有些人一接触jsp之后发现易学易懂.实际上,jsp的内部原理仍然是基于Servlet,它是Ser ...

随机推荐

  1. 为什么要用unittest

    '''为什么要使用单元测试框架?: 1.当用例很多的时候用来组织用例和执行用例 2.提供丰富的比较方法 3.提供丰富的日志''' import unittest import HTMLTestRunn ...

  2. 【转】SAP 各种记账凭证的更改&冲销

    一:更改 1,已经过帐的 FB02. 过完帐的允许更改的地方有限,只有凭证抬头文本,参照,分配,文本,原因代码等 2,预制凭证的更改. FBV2. 预制凭证可以更改的地方很多,只有凭证编码+公司代码+ ...

  3. webRTC脱坑笔记(一)— 初识webRTC

    webRTC概述 WebRTC--- `Web browsers with Real-Time Communications (RTC)` WebRTC是一个开源项目,可以在`Web`和本机应用程序中 ...

  4. hive中Sort By,Order By,Cluster By,Distribute By,Group By的区别

    order by:  hive中的order by 和传统sql中的order by 一样,对数据做全局排序,加上排序,会新启动一个job进行排序,会把所有数据放到同一个reduce中进行处理,不管数 ...

  5. freertos优秀博客收藏

    https://blog.csdn.net/zhzht19861011 朱工的专栏 专注/深入/分享 https://blog.csdn.net/xukai871105 xukai871105 专注于 ...

  6. OpenFOAM4.0安装教程

    Ubuntu 14.04以上版本支持pack安装. 1. add repository sudo add-apt-repository "http://dl.openfoam.org/ubu ...

  7. Android中插件开发篇总结和概述

    刚刚终于写完了插件开发的最后一篇文章,下面就来总结一下,关于Android中插件篇从去年的11月份就开始规划了,主要从三个方面去解读Android中插件开发原理.说白了,插件开发的原理就是:动态加载技 ...

  8. [NOIP2017]逛公园 题解

    我连D1T3都不会我联赛完蛋了 题目描述 策策同学特别喜欢逛公园.公园可以看成一张 N 个点 M 条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口, N 号点是公园的出口,每条边有一个非负 ...

  9. python中模块介绍

    一,模块概念 在计算机程序开发的过程当中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护.为了编码更加容易维护,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码 ...

  10. python练习题之计算字符串中所有字符得和

    第二题:计算字符串中所有数字的和1.字符串中只有小写字母和数字2.数字可能连续,也可能不连续3.连续数字要当做一个数处s='1234adg3g11's1 = "" for i in ...