xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="
ThisisthedescriptionofmyJ2EEcomponent
ThisisthedisplaynameofmyJ2EEcomponent
HelloServlet
com.servlet.HelloServlet
HelloServlet
/servlet/HelloServlet
在浏览器里输入:
http:
//localhost:
818/beike/servlet/HelloServlet
运行结果如下图
由于Servlet是用Java编程语言编写的,它们可以访问整个JavaAPI集合。
这就使它们非常适合实现复杂的商业应用逻辑,特别是访问企业中其它位置的数据。
JavaDatabaseConnection(JDBC)API就是一个示例,它允许Java程序访问关系数据库。
一般我们不直接在Servelt里面写JDBC编程,而是通过连接池技术或者Hibernate技术来实现JDBC的连接,后面会有综合的例子。
由于没有与Servlet关联的图形,因此它不适合访问GUIJavaAPI(AWT/Swing)
可以多次调用一个Servlet来响应来自多个客户机的请求。
这是一种多线程的工作方式,该Servlet只有一个实例,多个用户通过多线程的访问,来响应给客户的。
因此,一个Servlet可以同时处理多个请求,并且可以使这些请求同步。
Servlet可以将请求转发到其它服务器和Servlet.
Servlet如何工作?
Servlet在J2EE的Web服务器(WebContainer)中运行。
而应用服务器是一种特殊的Web服务器;它们扩展了Web服务器的功能,还可以处理EnterpriseBeans和Web应用程序的请求。
Web服务器和应用服务器之间有明显的差异。
虽然两者都可以在同一台机器上运行,Web服务器运行的是Servlet代码。
服务器自己装入,执行和管理Servlet。
服务器使用Java字节码解释器来运行Java程序;这叫做Java虚拟机(JVM)。
大型的应用服务器会自带虚拟机,比如:
Weblogic。
而小型的Web服务器需要使用操作系统里安装好的虚拟机,比如:
tomcat。
Servlet的生命周期。
Servlet执行的步骤如下:
1,客户机将请求发送给服务器。
2,服务器从浏览器的地址栏获得请求的信息。
并根据Web.xml配置文件找到响应的Servet执行。
如果找不到,会报404错误。
3,如果是第一次请求,那么会实例化该Servlet,调用init()方法进行初始化,该方法在Servlet的生命周期里只执行一次。
然后分配线程进行响应。
如果不是第一次访问,那么会直接分配个线程进行客户的响应。
4,在Servlet响应之前,服务器会产生request,response对象,并且把客户请求的信息封装到request对象中,然后把这两个对象传递给Servlet的service()方法执行。
5,service()根据请求的方式来调用不同的方法执行。
比如get请求,service()方法会request,response对象传递给doGet()方法执行,把执行后的结果保存到response对象里面。
返回给客户。
6,服务器关闭后,会调用Servlet的destroy()方法进行销毁。
下面是Servetl执行的线程执行图:
Servlet与CGI程序的区别:
CGI(CommonGatewayInterface)公共网关接口程序也是用来创建响应请求的动态Web内容的。
但与CGI相比,Servlet还有自己的优势。
Servlet能够提供一个基于组件的,独立于平台的方法来创建Web应用,也没有一般CGI程序的性能限制。
Servlet具有以下几个特点:
◆可跨平台,跨不同Web服务器进行移植。
Servlet使你能够不用编写指定平台的API就能进行服务器端编程。
JavaServletAPI是标准Java的延伸。
◆具有持久性(Persistent)。
一个Servlet在装入内存之后,就一直驻留内存,这意味着它能够在请求之间维持系统资源—如数据库连接。
◆高效的(Efficient)。
当一个客户对某个Servlet发出多个请求时,服务器只创建并装入该Servlet一次。
每一次重复请求只不过完成商业逻辑处理。
CGI过程则对每个请求都装入一个过程,这会大大降低性能。
而且,JVM使用lightweightjavathread来处理对Servlet的请求,而不是像CGI那样使用一个weighty操作系统进程。
◆能够将表示(presentation)与商业逻辑(businesslogic)分离。
这样一来,将一个项目划分为各个独立部分来进行开发和维护变得容易得多了。
◆能够获取给定的HTTP的各种调用并且从Java语言本身的继续开发中获益。
JavaServletAPI
什么是JavaServletAPI?
JavaServetAPI是一组类,用于定义Web客户机和WebServlet之间的标准接口。
其实,API将请求封装成对象,这样服务器可以将它们传递到Servlet;响应也是这样的封装,因此服务器可以将它们传递回客户机。
JavaServletAPI有两个包。
Javax.servlet包含了支持普通协议无关的Servlet的类,javax.servlet.http包括了对HTTP协议的特别支持。
本课主要介绍HTTPServlet。
Web上使用的HTTPServlet
Servlet接口类是JavaServletAPI的重要抽象概念。
这个类定义了管理Servlet以及它与客户机通信的方法。
要编写在Web上使用的HTTPServlet,使用HttpServlet类:
◆HttpServletRequest对象代表发送到Servlet的客户机请求。
这个对象封装了从客户机到服务器的通信。
它可以包含关于客户机环境的信息和任何要从Servlet发送到客户机的数据。
◆HttpServletResponse对象代表从Servlet发回客户机的响应。
这通常是动态生成的响应,如HTML页面,并且它是用请求和Servlet访问的其它来源中的数据创建的。
处理HTTPServlet的关键方法
HttpServlet的子类必须至少覆盖一个方法。
通常,Servlet覆盖doGet或doPost方法。
GET请求是对Web页面的典型浏览器请求,它是在用户输入URL或使用链接时发出的。
POST请求是用户提交指定发出的HTML表单时生成的。
HTTPPOST方法允许客户机一次将无限长度的数据发送到Web服务器,并且可以在发出信息时使用。
同一个Servlet可以通过让doGet调用doPost,或者反向调用来处理GET和POST。
其它常用方法包括:
Servlet的service()方法
Servlet容器激活了Servlet的service()方法,传递HttpServletRequest和HttpServletResponse对象同HTTP请求和响应进行交互,service()方法从请求对象中得到必要的信息处理请求,然后使用响应对象的方法创建客户响应根据HTTP传输方法,service()方法把请求发送给另一个方法,GET请求发送给doGet()方法,POST请求发送给doPost()方法方法之间可以相互调用,如doPost()可以调用doGet()方法,大多数人直接调用doGet或doPost
doPut方法,用于HTTPPUT请求
doDelete方法,用于HTTPDELETE请求
init和destroy,用于管理为Servlet的使用期限而保留的资源。
getServletInfo,Servlet用来提供自身信息的方法。
其它相关接口的说明:
javax.servlet.ServletConfig接口:
当Servet第一次被装载时,为了向它传递服务设置信息,容器开发者必须实现该接口。
javax.servlet.ServletContext接口:
提供给Servlet一些访问它们所运行环境的方法,并允许记录一些重要的事件,由Servlet的编写者来决定记录什么样的数据。
下图是servletUML图
HTTP协议简介
大部分J2EEWeb客户端使用HTTP协议和J2EE服务器通讯。
HTTP协议定义了客户端可以发送给服务器的请求和服务器可以作为回答的响应。
每个请求包含一个URL,URL是一个字符串,标识了Web组件或者像HTML页面和图象文件这样的静态资源。
J2EE服务器将HTTP请求转化为一个HTTP请求(Request)对象,并把这个对象传递给URL标识的Web组件。
Web组件填充一个HTTP响应(Response)对象,服务器把这个对象转化为HTTP响应,并发送给客户端。
HTTP协议基本概念及其特点
HTTP(HyperTextTransferProtocol)是超文本传输协议的简称,是WWW上用于发布信息的主要协议。
也可以理解为:
在TCP/IP之上的Web的RPC(RemoteProcessCall远程过程调用)。
关于HTTP协议更详细的信息,请登陆www.w3.org访问。
HTTP定义了一个客户机/服务器结构的简单事务处理,这里的客户机/服务器也就是浏览器/Web服务器。
简单事务处理由以下几步组成:
客户与服务器建立连接
客户向服务器提交请求
如果请求被接受,那么服务器回送一个应答,应答中至少包括状态编码和该文件的内容。
客户或服务器断开连接。
HTTP的基本特点是:
简单。
服务器迅速作出浏览器的应答。
无状态。
一个请求到另一个请求不保留任何有关连接的信息。
灵活。
允许传送任意类型的数据对象。
无连接。
HTTP是一个无连接协议。
HTTP的缺点是每次连接HTTP只完成一次请求。
若服务器的一个HTML文件中有许多图象,每传一个图象都要单独建立一次连接。
一个HTTP请求包含请求方法(RequestMethod),请求URL,头字段(HeaderField)和请求体。
HTTP1.1定义了下面的请求方法:
GET:
获取由请求URL标识的资源。
HEAD:
返回由URL标识的头信息。
POST:
想Web服务器发送无限制长度的数据。
PUT:
存储一个资源到请求的URL。
DELETE:
删除由URL标识的资源。
OPTIONS:
返回服务器支持的HTTP方法。
TRACE:
返回TRACE请求附带的头字段。
一个HTTP响应包括响应码,头字段和响应体。
HTTP协议要求响应码和所有的头字段都在任何响应体之前返回。
下面是一些常用的状态码:
404:
指示请求的资源不可用。
401:
指示请求需要HTTP验证。
500:
指示在HTTP服务器内部发生错误,不能执行请求。
503:
指示HTTP服务器暂时性超载,不能处理当前请求。
HTTP请求报头--Resquest
HttpServletRequest对象封装了来自客户端的全部信息.Servlet容器得到一个请求的时候,建立了一个该类型的对象,并传递给Servlet获取参数方法.
publicStringgetParameter(Stringname)
publicEnumerationgetParameterNames()
publicString[]getParameterValues(Stringname)
获取内容信息
getCharacterEncoding()方法返回请求的名称和字符编码风格
用法:
request.getCharacterEncoding()
publicintgetContentLength()方法可返回以字节记数的内容长度,如果长度未知,则返回-1
用法:
request.getContentLength()
getContentType()方法返回请求内容的MIME类型,未知返回null
用法:
request.getContentType()
获取连接信息
getProtocol()方法获取传输协议及版本
用法:
request.getProtocol()(HTTP/1.1)
getRemoteAddr()方法返回因特网协议(IP)地址
用法:
request.getRemoteAddr()(122.40.18.09)
getRemoteHost()方法返回主机名
用法:
request.getRemoteHost()(122.40.18.09)
getScheme()方法返回模式名
用法:
request.getScheme()(http)
getServerName()方法返回服务器名
用法:
request.getServerName()(localhost)
getServerPort()方法返回服务器端口号
用法:
request.getServerPort()(80)
获取Cookie:
以下代码显示了全部可用的Cookie
Cookie[]cookies=request.getCookies();
intcookiesLen=cookies.length()
if(cookiesLen>0){
for(inti=0;i{
StringsName=cookies[i].getName();
StringsValue=cookies[i]=getValue();
}
}
获取用户请求信息
req.getAuthtype()方法返回认证模式
req.getMethod()方法返回HTTP方法
req.getPathInfo()方法返回路径信息
req.getPathTranslated()方法返回真实传输路径
req.getQueryString()方法返回请求索引串
req.getRequestURI()方法返回请求URI
req.getServletPath()方法返回Servlet路径
req.getAttributeNames()方法返回请求属性集
req.getAttribute(Stringname)方法返回属性name的信息
HTTP响应报头--Response
HttpServletResponse对象封装了同客户的全部通信,并提供了多种方法,能够访问和操作HTTP报头,属性等
常见的方法
setHeader()方法
addCookie()
sendError()
setContentType()
会话管理
由于HTTP是无状态协议,服务器无法识别来自相同客户端请求的顺序,因此需要采取专门的方法识别该类用户
1.隐藏的表单字段:
2.改写URL:
向地址栏内URL后追加信息
http:
//localhost/servlets/srvlt?
sql==1009&id=005
以上两个信息可以用request.getParameter(“id”)取出
持久Cookie:
Cookie类
♦建立Cookie
DatedtLogin=newDate();
CookiecoLt=newCookie(“loginTime”,dtLogin.toString());
response.addCookie(coLt);//发送给客户端的响应中包含该Cookie
♦访问Cookie,得到用户登录的最后时间
for(inti=0;isName=reqCookies[i].getName();
if(sName!
=null&&sName.equalsIgnoreCase(“loginTime”))
sValue=reqCookies[i].getValue();
}
3.会话跟踪API:
HttpSession接口
HttpSessionsession=request.getSession();
使用HttpSession的setAttribute()和getAttribute()方法把一个属性同会话联系起来
发送请求:
能够向另一个Servlet发送请求
ServletC