Java Servlet Programme 读书笔记

Web应用程序的历史

CGI是第一项用来创建动态内容的技术. CGI会为每个请求新建一个进程运行CGI程序, 为每个请求建立一个进程, 限制了同一个server能够同时处理请求的能力.

Servlet如何处理request?

FastCGI为每个FastCGI程序建立了一个单独持久的进程, 减少了建立新进程的需要.

FastCGI不支持一些流行的webServer, 并且难以并发处理同一个浏览器的不同请求, 书中并没有解释的很清楚, 估计是性能上难以处理.

其它途径

ASP只能运行在特定的web服务器上.

Javaservlet

一个servlet是服务器的扩展, 一个java类能够被动态的加载来扩展服务器的功能. Servletweb服务器进程的不同线程处理, 由于servlet能够运行在web服务器内部, 所以能够和服务器交互工作, 而不象CGI脚本, 不能够和server互动, 如果servlet能和server互动的话, 它能够获得server的什么功能?

Servlets的好处:

可移植性

效率

一旦一个servlet被加载, 就作为一个单独的对象实例保存在server的内存中,  server用简单, 轻量级的方法调用处理请求, CGI要用

, 兼容性, 安全性,

交互性

servlet能够利用服务器传输文件路径, 登陆, 验证, MIME类型匹配.

扩展性, 灵活性.

 

第二章 HTTP Servlet基础

Http是一个简单, 无状态的协议. 一个客户端发出请求, 服务器响应, 请求的第一个内容是Http Command(method)告诉服务器它想要执行的动作类型, 还指定了请求文档的地址, 和使用HTTP协议的版本号.

GET /intro.html HTTP /1.0

传送完请求后, 客户端能够发送可选择的头信息告诉服务器额外关于请求的信息, 它并不直接属于请求, 但是能够在服务器生成响应的时候被用到.

User-Agent: Mozilla/4..0 (compatible; MSIE 4.0; Window 95)

Accept: image/gif, image/jpeg, text/*, */*

在客户端发送完请求后, 服务器处理请求并且返回响应. 指定返回HTTP协议的版本号, 状态码, 和状态码的描述.

在状态行后, 服务器传送响应头, 服务器运行的软件和服务器响应内容的类型.

GETPOST

Get方法被设计用来获得信息, post方法用来公布信息, get方法尽管被设计用来读信息, 能够包含一部分信息, 这部分信息作为一系列字符加在请求URL, 因为GET请求不应该传送大量的信息, 所以有些服务器限制URL和查询字符的长度为240个字符.

Post方法用了另外一种技术向服务器传递信息, 一个POST请求将它所有没有限制的数据,  直接作为HTTP请求主体的一部分传给socket连接.所以POST方法不能被bookmarked or emailed, 什么意思, 不知道, GET方法能够轻易的被bookmarked, 没有看懂.

其它方法

Head 当客户端仅仅只想看返回信息的头部, 用来决定文档的大小, 修改的时间

PUT(DELETE) 直接把文档放到服务器上, 这两个方法不被普遍的支持.

Trace用来调试, 返回客户端请求的内容

Options用来和服务器确认什么方法被支持或是对服务器上一个特定的资源什么功能是适用的.

The Servlet API

所有的servlet都必须实现javax.servlet.Servlet接口, 大部分Servlet实现javax.servlet.GenericServletjavax.servlet.http.HttpServlet一个协议无关的Servlet应该实现GenericServlet, HTTP Servlet应该子类化HttpServlet, HttpServlet是实现了Http功能的GenericServlet的字类.

每次当服务器分发了一个请求给Servlet, 会调用servletservice()方法.

Http servlet不能够处理doHead(), doTrace(), doOptions()方法, 这些方法已经被默认的继承了.

// TODO 有一部分没有看

JavaServer Pages

Jsp可以用四个预设的变量

Request HttpServletRequest, Response HttpServletResponse, out PrintWriter, in BufferedReader

// TODO 有一部分没有看

 

第三章 Servlet 生命周期

  1. 建立并且初始化servlet

  2. 处理一个或多个来自客户端的请求

  3. 销毁servlet并且garbage回收

Servlet的重载

大部分服务器在类变动后会自动重载Servlet, ClassLoader被设计用来载入类一次, 为了多次的载入servlet, servlet用了客户类加载器从默认的目录加载Servlet, servlet_root/servlets, 甚至指定的目录不需要出现在服务器的类路径上.

当服务器向servlet分发请求时, 首先检查在磁盘上的servlet, 如果变化了, 服务器放弃旧的类版本, 建立一个新的类加载实例来加载新的版本. 旧版本仍然在内存里, 其他类仍然会引用这个类.

初始化和销毁

init方法在 (Server启动时/ 第一次请求servlet, service()方法调用之前/ 服务器管理员的请求)调用.

Destory方法在servlet被卸载的时候被调用.

每个servletinit方法必须首先调用super.init方法. 调用此方法以后, GenericServlet能够调用ServletConfig对象.

Single-Thread Model

Single-Thread Model 没有方法和变量, 仅仅提供一个标志位用来改变生命周期.

任何继承SingleThreadModelservlet都是线程安全的不需要同步类变量.

 

第四章 获得信息

初始化参数

每个注册的servlet名字都有指定的初始化参数, 通常使用init方法设置初始化参数或是servlet的默认值

servlet通过getInitParameter方法得到初始化参数

public String ServletConfig.getInitPararmeter(String name)

getInitParameterNames方法能够得到所有servlet的初始化参数

public String ServletRequest.getServerName();

public int ServletRequest.getServerPort();

getServerName()能够获得服务器的名字, getServerPort()能够得到服务器的端口

public String ServletContext.getServerInfo();

public Object ServletContext.getAttribute(String name);

getServerInfo能够返回服务器软件的名字和版本号

getAttribute返回服务器属性的值

没有一个平台无关的方法获得server_root, 一部分server会将server root目录放到server.root的系统属性中

客户端

对于每个请求, servlet能够找到客户端机器以及用户

public String ServletRequest.getRemoteAddr();

public String ServletRequest.getRemoteHost();

pubilc Sring HttpServerRequest.geAuthType(); 返回验证的类型 BASIC/DIGEST

请求对象

每个请求参数都以名称/值的形式为servlet提供额外的信息.

Public String ServletRequest.getParameter(String name) //得到一个值

Public String[] ServletRequest.getParameterValues(String name) // 得到多个值

Public Enumeration ServletRequest.getParameter() // 得到参数的名字

Public String ServletRequest.getQueryString() //得到查询字符串

路径信息

public String HttpServletRequest.getPathInfo() //返回额外的相对路径信息

public String HttpServletRequest.getPathTranslated() //返回系统真正的文件路径信息

没有看懂路径信息以及各个方法的意义.

决定请求什么

Public static StringBuffer HttpUtils.getRequestURL(HttpServletRequest req) // 返回请求的URL

Public String HttpServletRequest.getRequestURI() //返回请求的URI

URLURI的区别

URIURL主机和端口后面的部分.

Public String HttpServletRequest.getServletPath() 返回被调用的servlet如果没有servlet则返回null

怎样发出请求

scheme  Internet资源类型

host www页所在的服务器域名

port 端口号

path 指明服务器上某资源的位置.

public String ServletRequest.getScheme() 返回发出请求的scheme

public String ServletRequest.getProtocol() 返回协议类型和版本号

public String HttpServletRequest.getMethod() 返回方法名

请求头

public BufferedReader ServletRequest.getReader() throws IOException;

如果已经调完getInputStream()后调用getReader()会抛出IllegalStateException

public ServletInputStream ServletRequest.getInputStream() throws IOException

public String ServletRequest.getContentType(); 返回内容类型

public int ServletRequest.getContentLength(); 返回内容的长度

public Object ServletRequest.getAttribute(String name) 能够设置和得到客户化的对象

 

第五章 发送HTML信息

响应的结构

Http Servlet能够返回状态码, Http头信息, 响应体,

一个普通的servletHttp servlet简单很多, 它仅仅只返回响应体给客户端, Http Servletapi 将一个简单的响应体分成更加细致的结构.协议能够影响servlet调用方法的顺序, Http协议先发送状态码和头信息再发送响应体, 应该小心在返回响应体之前设置状态码和头信息. 但是为什么在response中不需要设置状态码和头信息呢?

持久化的连接能够被用来优化servlet返回客户端的内容, 当一个客户端, 请求服务器端的一个文档, 首先建立一个socket连接, 通过这个连接客户端发出请求并且收到服务器的响应, 客户端通过发送空行表示请求结束, 服务器端关闭socket连接来结束响应

如果收到的页面包含<im>客户端需要从服务器得到更多的资源, 客户端会用另一个连接, 一个更好的办法是用相同的连接获得更多的页面, 称为持久化的连接, 客户端通过Content-Length知道请求文件的真正大小.

设置HTTP

 

第七章 跟踪Session

为解决Session的无状态, 客户端需要提供一个独一无二的标示.

一种解决的方法是验证用户

session id 放入窗体的隐含域中

URL覆写

Cookies

Cookie是服务器发送给浏览器能够过会从浏览器读回的一些信息

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

阅读更多
个人分类: jsp
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭