基础

当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. ForkJoin简单示例

    import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import jav ...

  2. 判断是否为PC

    function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = ["Android", " ...

  3. HTTP Error 500.30 - ANCM In-Process Start Failure

    环境 windown 10 IIS 10 net core 2.2 vs2019 背景 在vs2019使用net core 2.2发布到IIS 10上(见在 ASP.NET Core 中使用多个环境) ...

  4. Halo(十三)

    Spring Boot Actuator 请求跟踪 Spring Boot Actuator 的关键特性是在应用程序里提供众多 Web 接口, 通过它们了解应用程序运行时的内部状况,且能监控和度量 S ...

  5. list的过滤操作

    假设 l = ['abc', 'mn', 'aq', 'liuming'] 我要过滤出以a开头的元素,方法有以下两种 方法1: l = ['abc', 'mn', 'aq', 'liuming'] l ...

  6. MyBank后感

    MyBank系统主要的构成部分有:银行账户的初始化,开户,存款,取款,转账,查询余额,修改密码这些操作. =============================================== ...

  7. delphi 程序嵌入桌面效果的实现

    function Tform1.CreateRegion(wMask:TBitmap;wColor:TColor;hControl:THandle): HRGN; var dc, dc_c: HDC; ...

  8. LOJ 2980 「THUSCH 2017」大魔法师——线段树

    题目:https://loj.ac/problem/2980 线段树维护矩阵. 然后是 30 分.似乎是被卡常了?…… #include<cstdio> #include<cstri ...

  9. 'Error Domain=NSURLErrorDomain Code=-999' AFNetworking请求报错

    早上请求app请求登录接口发现了下面的错误信息: Error Domain=NSURLErrorDomain Code=-999 "已取消" UserInfo={NSErrorFa ...

  10. Intel CPUs

    http://en.wikipedia.org/wiki/Intel_cpus List of Intel Atom microprocessors List of Intel Xeon microp ...