当前位置:文档之家› servlet教程

servlet教程

servlet教程
servlet教程

Servlet教程

一、Servlet简介

Servlet是对支持Java的服务器的一般扩充。它最常见的用途是扩展Web 服务器,提供非常安全的、可移植的、易于使用的CGI替代品。它是一种动态加载的模块,为来自Web服务器的请求提供服务。它完全运行在Java虚拟机上。由于它在服务器端运行,因此它不依赖于浏览器的兼容性。

servlet容器:

负责处理客户请求、把请求传送给servlet并把结果返回给客户。不同程序的容器实际实现可能有所变化,但容器与servlet之间的接口是由servlet API 定义好的,这个接口定义了servlet容器在servlet上要调用的方法及传递给servlet的对象类。

servlet的生命周期:

1、servlet容器创建servlet的一个实例

2、容器调用该实例的init()方法

3、如果容器对该servlet有请求,则调用此实例的service()方法

4、容器在销毁本实例前调用它的destroy()方法

5、销毁并标记该实例以供作为垃圾收集

一旦请求了一个servlet,就没有办法阻止容器执行一个完整的生命周期。容器在servlet首次被调用时创建它的一个实例,并保持该实例在内存中,让它对所有的请求进行处理。容器可以决定在任何时候把这个实例从内存中移走。在典型的模型中,容器为每个servlet创建一个单独的实例,容器并不会每接到一个请求就创建一个新线程,而是使用一个线程池来动态的将线程分配给到来的请求,但是这从servlet的观点来看,效果和为每个请求创建一个新线程的效果相同。

servlet API

servlet接口:

public interface Servlet

它的生命周期由javax.servlet.servlet接口定义。当你在写servlet的时候必须直接或间接的实现这个接口。一般趋向于间接实现:通过从

javax.servlet.GenericServlet或javax.servlet.http.HttpServlet派生。在实现servlet接口时必须实现它的五个方法:

init():

public void init(ServletConfig config) throws ServletException

一旦对servlet实例化后,容器就调用此方法。容器把一个ServletConfig 对象传统给此方法,这样servlet的实例就可以把与容器相关的配置数据保存起来供以后使用。如果此方法没有正常结束就会抛出一个ServletException。一旦抛出该异常,servlet就不再执行,而随后对它的调用会导致容器对它重新载入并再次运行此方法。接口规定对任何servlet实例,此方法只能被调用一次,在任何请求传递给servlet之前,此方法可以在不抛出异常的情况下运行完毕。

service():

public void service(ServletRequest req,ServletResponse res) throw s ServletException,IOException

只有成功初始化后此方法才能被调用处理用户请求。前一个参数提供访问初始请求数据的方法和字段,后一个提供servlet构造响应的方法。

destroy():

public void destroy()

容器可以在任何时候终止servlet服务。容器调用此方法前必须给service()线程足够时间来结束执行,因此接口规定当service()正在执行时destroy()不被执行。

getServletConfig():

public ServletConfig getServletConfig()

在servlet初始化时,容器传递进来一个ServletConfig对象并保存在servlet实例中,该对象允许访问两项内容:初始化参数和ServletContext对象,前者通常由容器在文件中指定,允许在运行时向sevrlet传递有关调度信息,后者为servlet提供有关容器的信息。此方法可以让servlet在任何时候获得该对象及配置信息。

getServletInfo():

public String getServletInfo()

此方法返回一个String对象,该对象包含servlet的信息,例如开发者、创建日期、描述信息等。该方法也可用于容器。

GenericServlet类

Public abstract class GenericServlet implants Servlet,ServletConf ig,Serializable

此类提供了servlet接口的基本实现部分,其service()方法被申明为abstract,因此需要被派生。init(ServletConfig conf)方法把servletConfig 对象存储在一个private transient(私有临时)实例变量里,getServletConfig()方法返回指向本对象的指针,如果你重载此方法,将不能使用getServletConfig来获得ServletConfig对象,如果确实想重载,记住要包含对super.config的调用。

2.1版的API提供一个重载的没有参数的init()方法。现在在

init(ServletConfig)方法结束时有一个对init()的调用,尽管目前它是空的。

2.1版API里面,此类实现了ServletConfig接口,这使得开发者不用获得ServletConfig对象情况下直接调用ServletConfig的方法,这些方法是:getInitParameter(),getInitParameterNames(),getServletContext。此类还包含两个写日志的方法,它们实际上调用的是ServletContext上的对应方法。log(String msg)方法将servlet的名称和msg参数写到容器的日志中,

log(String msg,Throwable cause)除了包含servlet外还包含一个异常。

HttpServlet类

该类扩展了GenericServlet类并对servlet接口提供了与HTTP更相关的实现。

service():

protected void service(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException

public void service(HttpServletRequest req,HttpServletResponse res)th rows ServletException,IOException

该方法作为HTTP请求的分发器,这个方法在任何时候都不能被重载。当请求到来时,service()方法决定请求的类型

(GET,POST,HEAD,OPTIONS,DELETE,PUT,TRACE),并把请求分发给相应的处理方法

(doGet(),doPost(),doHead(),doOptions(),doDelete(),doPut(),doTrace())每个do方法具有和第一个service()相同的形式。为了响应特定类型的HTTP请求,我们必须重载相应的do方法。如果servlet收到一个HTTP请求而你没有重载相应的do方法,它就返回一个说明此方法对本资源不可用的标准HTTP错误。

getLatModified():

protected long getLastModified(HttpServletRequest req)

该方法返回以毫秒为单位的的自GMT时间1970年1月1日0时0分0秒依赖的最近一次修改servlet的时间,缺省是返回一个负数表示时间未知。当处理GET请求时,调用此方法可以知道servlet的最近修改时间,服务器就可决定是否把结果从缓存中去掉。

HttpServletRequest接口

public interface HttpServletRequest extends ServletRequest

所有实现此接口的对象(例如从servlet容器传递的HTTP请求对象)都能让servlet通过自己的方法访问所有请求的数据。下面是一些用来获取表单数据的基本方法。

getParameter()

public String getParameter(String key)

此方法试图将根据查询串中的关键字定位对应的参数并返回其值。如果有多个值则返回列表中的第一个值。如果请求信息中没有指定参数,则返回null。

getParameterValues():

public String[] getParameterValues(String key)

如果一个参数可以返回多个值,比如复选框集合,则可以用此方法获得对应参数的所有值。如果请求信息中没有指定参数,则返回null。

GetParameterNames():

Public Enumeration getParameterNames()

此方法返回一个Enumeration对象,包含对应请求的所有参数名字列表。

HttpServletResponse接口

public interface HttpServletResponse extends servletResponse

servlet容器提供一个实现该接口的对象并通过service()方法将它传递给servlet。通过此对象及其方法,servlet可以修改响应头并返回结果。

setContentType():

public void setContentType(String type)

在给调用者发回响应前,必须用此方法来设置HTTP响应的MIME类型。可以是任何有效的MIME类型,当给浏览器返回HTML是就是”text/html”类型。

getWriter():

public PrintWriter getWriter()throws IOException

此方法将返回PrintWriter对象,把servlet的结果作为文本返回给调用者。PrintWriter对象自动把Java内部的UniCode编码字符转换成正确的编码以使客户端能够阅读。

getOutputStream():

public ServletOutputStream getOutputStream() throws IOException 此方法返回ServletOutputStream对象,它是java.io.OutputStream的一个子类。此对象向客户发送二进制数据。

setHeader():

public void setHeader(String name,String value)

此方法用来设置送回给客户的HTTP响应头。有一些快捷的方法用来改变某些常用的响应头,但有时也需要直接调用此方法。

编译条件

需要从https://www.doczj.com/doc/961024012.html,/products/servlet/ 获得一份JSDK的拷贝,并把servlet.jar移动到JDK安装目录下的/jre/lib/ext目录下。如果是

JDK1.1,则移动到/lib下,并在CLASSPATH中加入servlet.jar的绝对路径。

运行条件

需要

Apache Jserv,Jrun Servlet Exec,Java Web Server,Weblogic,WebSphere,Tom cat,Resin等servlet服务器端程序。

简单范例

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class HelloWorld extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse res ponse)

throws IOException, ServletException

{

response.setContentType("text/html");

PrintWriter out = response.getWriter();

out.println("");

out.println("");

out.println("");

out.println("Hello World!");

out.println("");

out.println("");

out.println("

Hello World!

");

out.println("");

out.println("");

}

}

servlet的性能和效率

一个servlet仅被初始化一次而执行多次,因此极小的低效性也会随着时间的增加而产生很很大的影响。在代码中需要考虑String对象的使用,如果产生HTML响应需要用到很多字符串时,不应该为每一个字符串生成一个String对象,因为这会产生大量的String和StringBuffer对象,造成大量的对象构造消耗和垃圾收集负担,解决的办法是一行一行的把所有需要写入的直接写入PrintWriter中,或者创建一个StringBuffer对象,并使用append()方法将文本加入。

及时回送

有时,程序需要花费很长时间执行,在这种情况下应该回送给客户端一些信息,而不是长时间显示白屏,这可以在执行到一定程度就回送一些东西,可以使用PrintWriter的flush()方法强制将现有的内容回送给浏览器。

Servlet会话

由于Web服务器使用的协议HTTP是一种无状态的协议,因此要维护单个客户机一系列请求的当前状态就需要使用其它的附加手段,在以前,一般的方法是使用:l.隐藏的表格字段:在浏览器中,这种类型的字段是不可见的,然而,它在请求中被传送,服务器端程序可以读取它的值。它的优点是实现容易,且大多浏览器都支持;缺点是字段必须按照特定的顺序建立,客户端可以通过查看源代码得到其值,在浏览器中单击“后退”按钮会丢失加到当前页中的附加字段,同时也限制了用户动态的生成文档。

l.Cookie:是一些关键的数据片断,由服务器建立并由客户机的浏览器存放。浏览器维护一个它自己的Cookie表,这使得它可以作为一种会话跟踪的解决方案。使用Cookie的好处是它比在URL或表单中储存数据更直观。它的缺点是它可以用于在比一次短会话更长时间内跟踪用户,甚至可以用来跟踪某个用户向站点发送的每一个请求,因此有人担心自己的隐私问题而关闭了Cookie,一些老的浏览器也不支持cookie。Servlet API提供一个Cookie类支持cookie,使用HttpServletResponse.addCookie()和HttpServletResponse.getCookies()方

法添加和读取cookie。

l.URL重写:修改请求的url,使之包含会话ID。这种方法的缺点是:对于大量的数据,URL会变得很长而失去控制;在某些环境下,URL的字符串长度有一定的限制;数据保密问题,你可能不想让旁边的人或者可以使用同一个计算机的看到你的会话数据。Servlet提供HttpServletRequest类可以获得参数。

Servlet API有自己内置的会话跟踪支持,使用HttpSession对象既可。它的setAttribute()方法绑定一对名字/值数据,把它存到当前会话中,如果会话中已经存在该名字责替换它,语法为:

public void setAttribute(String name,Object value)。getAttribute()

方法读取存储在会话中的对象,语法为:

public Object getAttribute(String name)。getAttributeNames()方法返回存储在会话中的所有名字,语法为:

public String[] getAttributeNames()。最后一个方法是

removeAttribute()方法,它从会话中删除指定的信息,语法为:

public void removeAttribute(String name)。HttpSession对象可以使用HttpServletRequest对象request的getSession(true)方法获得。参数为true意味着如果不存在该对象则创建一个。

二、servlet规范定义的Servlet 生命周期

servlet有良好的生存期的定义,包括如何加载、实例化、初始化、处理客户端请求以及如何被移除。这个生存期由javax.servlet.Servlet接口的

init,service和destroy方法表达。

1、加载和实例化

容器负责加载和实例化一个servlet。实例化和加载可以发生在引擎启动的时候,也可以推迟到容器需要该servlet为客户请求服务的时候。

首先容器必须先定位servlet类,在必要的情况下,容器使用通常的Java类加载工具加载该servlet,可能是从本机文件系统,也可以是从远程文件系统甚至其它的网络服务。容器加载servlet类以后,它会实例化该类的一个实例。需要注意的是可能会实例化多个实例,例如一个servlet类因为有不同的初始参数而有多个定义,或者servlet实现SingleThreadModel而导致容器为之生成一个实例池。

2、初始化

servlet加载并实例化后,容器必须在它能够处理客户端请求前初始化它。初始化的过程主要是读取永久的配置信息,昂贵资源(例如JDBC连接)以及其它仅仅需要执行一次的任务。通过调用它的init方法并给它传递唯一的一个(每个servlet定义一个)ServletConfig对象完成这个过程。给它传递的这个配置对象允许servlet访问容器的配置信息中的名称-值对(name-value)初始化参数。这个配置对象同时给servlet提供了访问实现了ServletContext接口的具

体对象的方法,该对象描述了servlet的运行环境。

2.1初始化的错误处理

在初始化期间,servlet实例可能通过抛出UnavailableException 或

者 ServletException异常表明它不能进行有效服务。如果一个servlet抛出一个这样的异常,它将不会被置入有效服务并且应该被容器立即释放。在此情况下destroy方法不会被调用因为初始化没有成功完成。在失败的实例被释放后,容器可能在任何时候实例化一个新的实例,对这个规则的唯一例外是如果失败的servlet抛出的异常是UnavailableException并且该异常指出了最小的无效时间,那么容器就会至少等待该时间指明的时限才会重新试图创建一个新的实例。

2.2、工具因素

当工具(注:根据笔者的理解,这个工具可能是应用服务器的某些检查工具,通常是验证应用的合法性和完整性)加载和内省(introspect)一个web应用时,它可能加载和内省该应用中的类,这个行为将触发那些类的静态初始方法被执行,因此,开发者不能假定只要当servlet的init方法被调用后它才处于活动容器运行状态(active container runtime)。作为一个例子,这意味着servlet 不能在它的静态(类)初始化方法被调用时试图建立数据库连接或者连接EJB

容器。

3、处理请求

在servlet被适当地初始化后,容器就可以使用它去处理请求了。每一个请求由ServletRequest类型的对象代表,而servlet使用ServletResponse回应该请求。这些对象被作为service方法的参数传递给servlet。在HTTP请求的情况下,容器必须提供代表请求和回应的HttpServletRequest和HttpServletResponse的具体实现。需要注意的是容器可能会创建一个servlet 实例并将之放入等待服务的状态,但是这个实例在它的生存期中可能根本没有处理过任何请求。

3.1、多线程问题

容器可能同时将多个客户端的请求发送给一个实例的service方法,这也就意味着开发者必须确保编写的servlet可以处理并发问题。如果开发者想防止这

种缺省的行为,那么他可以让他编写的servlet实现SingleThreadModel。实现这个类可以保证一次只会有一个线程在执行service方法并且一次性执行完。容器可以通过将请求排队或者维护一个servlet实例池满足这一点。如果servlet 是分布式应用的一部分,那么,那么容器可能在该应用分布的每个JVM中都维护一个实例池。如果开发者使用synchronized关键字定义service方法(或者是doGet和doPost),容器将排队处理请求,这是由底层的java运行时系统要求的。我们强烈推荐开发者不要同步service方法或者HTTPServlet的诸如doGet和doPost这样的服务方法。

3.2、处理请求中的异常

servlet在对请求进行服务的时候有可能抛出ServletException或者UnavailableException异常。ServletException表明在处理请求的过程中发生了错误容器应该使用合适的方法清除该请求。UnavailableException表明servlet不能对请求进行处理,可能是暂时的,也可能是永久的。如果UnavailableException指明是永久性的,那么容器必须将servlet从服务中移除,调用它的destroy方法并释放它的实例。如果指明是暂时的,那么容器可以选择在异常信息里面指明的这个暂时无法服务的时间段里面不向它发送任何请求。在这个时间段里面被被拒绝的请求必须使用SERVICE_UNAVAILABLE (503)返回状态进行响应并且应该携带稍后重试(Retry-After)的响应头表明不能服务只是暂时的。容器也可以选择不对暂时性和永久性的不可用进行区分而全部当作永久性的并移除抛出异常的servlet。

3.3线程安全

开发者应该注意容器实现的请求和响应对象(注:即容器实现的HttpServletRequest和HttpServletResponese)没有被保证是线程安全的,这就意味着他们只能在请求处理线程的范围内被使用,这些对象不能被其它执行线程所引用,因为引用的行为是不确定的。

4、服务结束

容器没有被要求将一个加载的servlet保存多长时间,因此一个servlet实例可能只在容器中存活了几毫秒,当然也可能是其它更长的任意时间(但是肯定

会短于容器的生存期)

当容器决定将之移除时(原因可能是保存内存资源或者自己被关闭),那么它必须允许servlet释放它正在使用的任何资源并保存任何永久状态(这个过程通过调用destroy方法达到)。容器在能够调用destroy方法前,它必须允许那些正在service方法中执行的线程执行完或者在服务器定义的一段时间内执行(这个时间段在容器调用destroy之前)。一旦destroy方法被调用,容器就不会再向该实例发送任何请求。如果容器需要再使用该servlet,它必须创建新的实例。destroy方法完成后,容器必须释放servlet实例以便它能够被垃圾回收。

三、serlvet为什么只需要实现doGet和doPost

Serlvet接口只定义了一个服务方法就是service,而HttpServlet类实现了该方法并且要求调用下列的方法之一:

doGet:处理GET请求

doPost:处理POST请求

doPut:处理PUT请求

doDelete:处理DELETE请求

doHead:处理HEAD请求

doOptions:处理OPTIONS请求

doTrace:处理TRACE请求

通常情况下,在开发基于HTTP的servlet时,开发者只需要关心doGet和doPost方法,其它的方法需要开发者非常的熟悉HTTP编程,因此这些方法被认为是高级方法。

而通常情况下,我们实现的servlet都是从HttpServlet扩展而来。

doPut和doDelete方法允许开发者支持HTTP/1.1的对应特性;

doHead是一个已经实现的方法,它将执行doGet但是仅仅向客户端返回

doGet应该向客户端返回的头部的内容;

doOptions方法自动的返回servlet所直接支持的HTTP方法信息;

doTrace方法返回TRACE请求中的所有头部信息。

对于那些仅仅支持HTTP/1.0的容器而言,只有doGet, doHead 和 doPost

方法被使用,因为HTTP/1.0协议没有定义PUT, DELETE, OPTIONS,或者TRACE 请求。

另外,HttpServlet定义了getLastModified方法以支持有条件的(conditional)get操作。有条件的get操作是指使用GET方式请求资源并且在头部指定只有在资源内容在指定时间后被修改的情况下服务器才有必要回应请求并发送请求的内容。对于那些实现doGet方法并且在不同请求之间内容相同的servlet而言,它应该实现这个方法以提高网络资源的利用率。

另外要提及的是,按照规范的要求,servlet容器至少要实现HTTP/1.0协议规范,推荐实现HTTP/1.1规范,在此基础上可以实现其它的基于请求回应模式(based request response model)的协议(例如HTTPS)。

四、servlet实例的个数及因此引发的问题

在缺省情况下,一个容器中只为每个servlet定义生成一个servlet类实例。在servlet实现SingleThreadModel接口的情况下,容器可以生成多个实例以应付沉重的请求,也可以将请求排队发送给同一个实例(对于一个高性能的容器,也可能是这两种方式的结合,因为实例的个数是有限制的,因此在线程安全方式下一个实例会有多个请求排队等待服务同时容器中多个实例可以对请求进行服务)。对于为可分布式(distributable)应用开发的servlet而言,在每个JVM 中对每个SERVLET定义都会有一个实例,如果在这样的应用中servlet也实现了SingleThreadModel接口,那么在每个JVM中每个servlet定义也可能有多个实例。

使用SingleThreadModel接口可以保证一个线程一次性执行完给定实例的service方法,需要注意的是这个保证只能应用于servlet实例,那些可以被多个servlet实例访问的对象(例如HttpSession实例)依然对多个servlet有效,即使他们实现了SingleThreadModel。

根据规范中的这些说明,我们在实现自己的serlvet时需要考虑多线程的问题,一般而言,不要在servlet中定义可变的成员,只能定义一些常量(使用final定义,如果没有使用,应该注意在程序中不应该修改其值),笔者见过一个定义很差的servlet:

public class SomeHttpServlet extends HttpServlet {

HttpSession session;

...

}

这样的servlet在使用中一定会出现问题,所有的用户都会共用一个session(这样很节约系统资源,不是吗?:)),因此一个用户请求的信息突然跑到另一个用户的ie窗口豪不奇怪。

而且,即使你的servlet实现了SingleThreadModel接口也不要定义可变的成员,因为该成员的信息会保留下来,而这对于其它的用户而言在绝大部分情况下是毫无意义的。(你确定会有意义的情况例外,例如某种计数)另外需要说明的是上面说明中都是针对servlet定义而言的,而servlet定义定义不等价servlet类定义,即一个servlet类可能会有多个servlet定义,但是笔者还没有找到“servlet定义”的定义,规范中提到实例化一个servlet 时可能会有不同的初始参数,但是这个也不同于带参数的多个构造方法。一般情况下我们可以认为一个servlet类对应一个servlet定义。

五、servlet会话

HTTP协议是一种无状态的协议,而对于现在的web应用而言,我们往往需要记录从特定客户端的一系列请求间的联系。现在已经有很多会话跟踪的技术,但是对于程序员而言都不是很方便直接使用。servlet规范定义了一个简单的HttpSession接口以方便servlet容器进行会话跟踪而不需要开发者注意实现的细节。

一般而言,有两种最常用的会话跟踪机制,一种就是URL重写。在客户端不接受cookie的情况下可以使用URL重写进行会话跟踪。URL重写包括向URL路径添加一些容器可以解释的数据。规范要求会话ID必须编码在URL路径中,参数名称必须是jsessionid,例如:

https://www.doczj.com/doc/961024012.html,/catalog/index.html;jsessionid=1234 另一种就是现在最常用的cookie了,规范要求所有的servlet都必须支持cookie。容器向客户端发送一个cookie,客户端在后续的处于同一个会话的请求中向服务器返回该cookie。会话跟踪cookie的名字必须是JSESSIONID。

新出现的一种会话功能是SSL会话,SSL(Secure Sockets Layer,安全套接字层)是HTTPS协议使用的一种加密技术,内建了会话跟踪功能,servlet容器可以非常容易的使用这些数据建立会话跟踪。(但是HTTPS不是规范要求servlet必须支持的协议)

因为HTTP是一种基于请求响应的协议,因此会话只有在客户端加入它以后才被新建立。当会话跟踪信息被成功的返回给服务器以指示会话给建立时客户端才算加入了一个会话。如果客户端没有加入会话,那么下一次请求不会被认为是会话的一部分。如何客户端还不知道会话或者客户端选择不加入一个会话,那么会话被认为是新的。开发者必须自己设计自己的应用中的会话处理状态,在什么地方没有加入会话,什么地方不能加入会话以及什么地方不需要加入会话。

规范要求HttpSession在应用或者servlet上下文级别有效,诸如cookie 这样的建立会话的底层机制可以在上下文中共享,但是对于那些外露的对象,以及更重要的是对象的那些属性是不能在上下文中共享的。

对于会话的属性的绑定而言,任何对象都可以绑定到某个命名属性。被绑定的属性对象对于其它处于相同ServletContext并且处于同一个会话处理中的其它servlet也是可见的。

某些对象在被加入会话或者被从会话中移除时要求得到通知,这样的信息可以通过让该对象实现HttpSessionBindingListener接口得到。该接口定义了两个方法用以标记被绑定到会话或者从会话中被移除。

valueBound方法在对象通过getAttribute之前就被调用,而valueUnbound方法在对象已经不能通过getAttribute得到后才被调用。

由于HTTP是无状态协议,因此客户端不再活动时没有什么明显的信号,这也就意味着只有一种机制可以用于表明客户端不再活动:超时。会话的缺省的时限由servlet容器定义并且可以通过HttpSession的getMaxInactiveInterval 得到,开发者也可以通过使用setMaxInactiveInterval方法进行设置,这些方法返回的单位是秒,如果时限被设置为-1,那么意味着永远不会超时。

通过调用HttpSession的getLastAccessedTime方法,我们可以得到在当前请求之前的访问时间。当会话中的一个请求被servlet上下文处理时会话就被认为被访问了。

另外需要注意的就是一些很重要的会话的语义问题。

多线程问题:多个请求线程可能会同时访问同一个会话,开发者有责任以适当的方式同步访问会话中的资源。

分布式环境:对于被标记为可分布的应用而言,同一会话中的所有请求只能被单一的VM处理。同时,放入HttpSession中的所有对象都必须实现Serializable接口,否则容器可能会抛出IllegalArgumentException(在jboss_tomcat下没有抛出这个异常,但是如果在关闭服务器时还有未完成的会话,那么服务器在试图存储会话时会出现串行化异常,在重新启动的时候会试图回复会话,也会出现异常)。这个限制意味着开发者不会遇到非可分布容器中的那些并发问题。另外容器提供者可以通过将一个会话对象以及它的内容从分布式系统的一个活动节点移动到系统的其它不同节点的能力来保证可伸缩性。

客户端的语义:基于cookie或者SSL证书通常是被web浏览器控制并且不联系到特定浏览器窗口的事实,从客户端应用的所有窗口发送到容器的请求都可能是同一个会话。为了达到最大的可移植性,开发者不能总假设特定客户端的所有窗口的请求都处于同一个会话中。

六、Bean和Servlet的企业应用

J2EE是一个企业应用程序的开发平台,包括了对EJB、Servlet、

JavaServer Page、JNDI、XML等的支持。在这个平台上可以开发瘦客户端的多层体系结构的企业应用程序。

Enterprise JavaBean技术是J2EE的主要基础。EJB技术对在分布式的计算环境中执行应用逻辑提供了一个可伸缩的框架结构。J2EE通过将EJB组件结构和其它的企业技术相结合,解决了在Java平台上进行开发和配置服务端应用程序的无缝结合。

要使用J2EE开发您的企业应用,您必须要在您的机器上安装一个Web服务器,还要支持XML。为了在浏览器中运行Java 2的API,还要给您的浏览器安装一个支持Java2的插件。

下面就介绍怎样用J2EE SDK写一个包括了HTML页面,Servlet和

Session Bean的一个简单的瘦客户端的多层体系结构的企业应用程序。听起来是不是心动了呢?下面就开始吧。

还要提醒一点的就是:在编程的时候,适当的增加catch子句是一个很好编程风格。如果例子代码抛出了一个正确的异常,代码就被 try/catch这样的程序结构包围。Catch子句应该中应该加入处理异常的代码,千万不要留成空白。至少,应该加入语句:e.printStackTrace()来在控制台显示异常信息。

J2EE SDK是一个J2EE平台上用于演示、教育等用途的非商业的东东。可以从javasoft的网站上免费下载。很适合用来学习。如果你没有出国权限,还可以从国内各高校的FTP服务器上去下载,速度比较快,但可能版本不是最新的。瘦客户端的多层体系结构的应用程序的例子:

本例子通过一个HTML页面的输入来调用一个Servlet,Servlet再用Java 的名字目录服务接口(JNDI)APIs来寻找一个会话Session Bean,用这个Session Bean来执行一个计算。当Servlet得到了计算的结果的之后,Servlet 把计算结果返回给HTML页面的用户。

之所以说这是一个瘦客户端的应用程序,是因为Servlet本身并没有执行任何的应用逻辑。这个简单的计算是由一个Session Bean在J2EE的应用服务器上执行的。客户没有参与过程的任何操作,所有的计算都是由Session Bean完成的。

所谓的多层体系结果实际上是由三或者四层组成的。我们的例子实际上是四层的一个结构。三层的体系结构是在标准的两层的客户/服务器结构基础上,将一个多线程的应用服务器加到了非浏览器的客户端和后台数据库之间。而四层的体系结构是通过Servlet和JavaServer Pages技术将客户端的应用程序由浏览器和HTML页面来取代。这个例子我们暂时只用其中的三层,在下一个例子中。我们再去访问数据库。这样,就扩展到四层了。再以后,我们会涉及到JavaServer Pages技术和XML技术。

J2EE软件的安装:

为了使我们的例子能够运行起来,首先要下载一个

Java2 SDK Enterprise Edition(J2EE)的1.2.1的版本和一个J2SE

(Java 2 Standard Edition)的1.2以上的版本。在Windows 2000系统中,假设我们把J2EE和J2SE都装到了C:/J2EE目录下。安装详细目录如下:

J2EE:C:/J2EE/j2sdkee1.2.1

J2SE:C:/J2EE/jdk1.2.2

Path和ClassPath的设置:

下载的东西包括了J2EE的应用服务器、Cloudscape数据库、使用了加密套接字协议层的Web服务器、开发和配置的工具、企业级的Java APIs。其Path 和ClassPath的设置如下:

Path的设置:在Windows系统中,需要把Path的目录包含下面两个目录:

C:/J2EE/j2sdkee1.2.1/bin

C:/J2EE/jdk1.2.2/bin

Classpath的设置:在Windows系统中,需要把Classpath参数包含下面的文件:C:/J2EE/j2sdkee.1.2.1/lib/j2ee.jar

另外,还要配置环境变量:

J2EE_HOME=C:/J2EE/j2sdkee1.2.1

JAVA_HOME=C:/J2EE/jdk1.2.2

这样,就可以执行C:/J2EE/j2sdkee1.2.1/bin目录下面的批处理命令了。仔细看看里面的批处理,你会发现不少的东西的。

J2EE应用程序组件:

J2EE程序员编写J2EE组件。J2EE组件是一个功能齐全的软件单元。将其它的应用程序组件组装到J2EE的应用程序和接口中。J2EE规范中定义如下的应用程序组件:

应用程序客户组件

Enterprise JavaBean组件

Servlet和JavaServer Pages组件(也叫做Web组件)

Applet

在本例子中,我们创建了一个J2EE的应用程序和两个J2EE的组件:一个Servlet和一个Session Bean。Servlet和HTML文件是捆绑在一个WAR

(WEB Archive)文件中。Session Bean的类和接口捆绑到了一个JAR文件中。然后再把WAR文件和JAR文件加到J2EE的应用程序,捆绑到一个EAR (Enterprise Archive)文件中。并验证测试产品环境的配置。

在这所有的步骤中。实际上执行了很多的不用的角色的功能。编写Session Bean和Servlet是开发工作。而创建一个J2EE的应用程序,将J2EE 组件组装到应用程序中是应用程序的组装工作。实际上,这些工作可以在不同的地方由不用的人员来做。

创建一个HTML页面:

这个页面名字为bonus.html。HTML代码如下:

代码中,让人感兴趣的是用别名来调用BonusServlet.class。因为在后面提到的应用程序的组装的时候,将它映射到了这个别名BonusServlet上

Bonus Calculation

Enter social security Number:

Enter Multiplier:

这个HTML文件有两个数据域,用户可以输入社会保险号和一个乘数。当用

户单击了Submit按纽。BonusServlet就得到了终端用户的数据。然后寻找Session Bean。将用户数据传递给Session Bean。Session Bean计算出奖金,把结果返回给Servlet。Servlet再通过另一个HTML页面将奖金结果返回给用户。创建Servlet:

例子假定BonusServlet.java文件是在C:/J2EE/Client-Code目录下面。在运行的时候,Servlet代码执行如下操作:

获得用户数据

查找Session Bean

将用户数据传递给Session Bean

在得到Session Bean的返回结果以后,创建一个HTML页面将结果返回给客户。

Servlet代码如下:

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import javax.naming.*;

import javax.rmi.PortableRemoteObject;

import Beans.*;

public class BonusServlet extends HttpServlet {

CalcHome homecalc;

public void init(ServletConfig config)throws ServletException{

//Look up home interface

try{

InitialContext ctx = new InitialContext();

Object objref = ctx.lookup("calcs");

homecalc =(CalcHome)PortableRemoteObject.narrow(objref,CalcHome.class );

} catch (Exception NamingException) {

NamingException.printStackTrace();

}

}

public void doGet (HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String socsec = null;

int multiplier = 0;

double calc = 0.0;

PrintWriter out;

response.setContentType("text/html");

String title = "EJB Example";

out = response.getWriter();

out.println("");</p><p>out.println(title);</p><p>out.println("");

try{

Calc theCalculation;

//Get Multiplier and Social Security Information String strMult =request.getParameter("MULTIPLIER"); Integer integerMult = new Integer(strMult); multiplier = integerMult.intValue();

socsec = request.getParameter("SOCSEC");

//Calculate bonus.10 AUGUST 28, 2000

double bonus = 100.00;

theCalculation = homecalc.create();

calc =theCalculation.calcBonus(multiplier, bonus); } catch(Exception CreateException){ CreateException.printStackTrace();

}

Tomcat完整教程

第一章 Tomcat概述 一、Tomcat简介 TOMCAT是APACHE JAKARTA软件组织的一个子项目,TOMCAT是一个JSP/SERVLET容器,它是在SUN公司的JSWDK(JAVA SERVER WEB DEVELOPMENT KIT)基础上发展起来的一个JSP和SERVLET规范的标准实现,使用TOMCAT可以体验JSP和SERVLET的最新规范。经过多年的发展,TOMCAT不仅是JSP和SERVLET规范的标准实现,而且具备了很多商业JAVA SERVLET容器的特性,并被一些企业用于商业用途。 1、Tomcat Tomcat在严格意义上并不是一个真正的应用服务器,它只是一个可以支持运行Serlvet/JSP 的Web容器,不过Tomcat也扩展了一些应用服务器的功能,如JNDI,数据库连接池,用户事务处理等等。Tomcat 是一种具有JSP环境的Servlet容器。Servlet容器是代替用户管理和调用Servlet的运行时外壳。 1.1 SERVLET容器 负责处理客户请求。当客户请求来到时,SERVLET容器获取请求,然后调用某个SERVLET,并把SERVLET的执行结果返回给客户。 当客户请求某个资源时,SERVLET容器使用SERVLETREQUEST对象把客户的请求信息封装起来,然后调用JAVA SERVLET API中定义的SERVLET的一些生命周期方法,完成SERVLET的执行,接着把SERVLET执行的要返回给客户的结果封装到SERVLETRESPONSE对象中,最后SERVLET容器把客户的请求发送给客户,完成为客户的一次服务过程。 1.2 TOMCAT的工作模式 1.2.1 独立的SERVLET容器 TOMCAT的默认工作模式,作为独立的SERVLET容器,是内置在WEB服务器中的一部分,是指使用基于JAVA的WEB服务器的情形。 其他两种方式是TOMCAT与其他服务器集成的方式: 1.2.2 进程内的SERVLET容器 SERVLET容器作为WEB服务器的插件和JAVA容器的实现。WEB服务器的插件在内部地址空间打

Java基础入门教程(适合所有初学者)

第1章 Java语言概述与面向对象思想 1 1.1 Java语言的发展 1 1.1.1 Java语言的产生 1 1.1.2 Java语言的发展 1 1.2 Java语言的特点 2 1.3 面向对象与面向过程的差异 3 1.3.1 面向过程思想回顾 4 1.3.2 面向对象思想介绍 4 1.4 面向对象程序设计中的主要概念和特征 4 1.4.1 主要概念 5 1.4.2 主要特征 5 *1.5 Java与C++的差异 5 1.6本章小结5 习题 5 第2章 Java语言开发环境 6 2.1 JDK 6 2.1.1 JDK的简介6 2.1.2 JDK的构成6 2.1.3 JDK的使用6 2.2 IDE 8 2.2.1 IDE简介8 2.2.2 JBuilder 9 2.2.3 Eclipse 9 2.2.4 相关资源9 2.3 Project管理9 2.3.1 Project的含义9 2.3.2 可行的Project组织模式9 2.3.3 主要开发工具的Project目录10 2.4 本章小结10 习题10 第1章 Java语言概述与面向对象思想 1.1 Java语言的发展 1.1.1 Java语言的产生以介绍面向对象编程的基本概念、基本理论为重点,结合Java语言的语法规则、编程特点和设计思想、强调容易发生错误和编程应注意的地方,使学生能对Java 技术有一个总体了解,通过本课程学习,使学生掌握Java语言的基础知识,理解和掌握面向对象程序设计的基本思想,熟练地使用Java语言进行程序的编写、编译以及调试工作 上世纪90年代初期,Sun公司在研究一种适用于未来的智能设备的编程语言,该语言要具有一些新的特性,以避免C++的一些不足。 该语言起初命名为Oak,来源于语言作者Gosling办公室窗外的一棵橡树(Oak)。后来在注册时候遇到了冲突,于是就从手中的热咖啡联想到了印度尼西亚一个盛产咖啡的岛屿,中文名叫爪哇,Java语言得名于此。 随着Internet的迅速发展,Web应用日益广泛,Java语言也得到了迅速发展。1994年,Gosling

第八章 Servlet技术习题

第八章 Servlet技术 一、选择题 1.下面对Servlet、Applet的那一项描述错误?()A)Servelt与Applet相对应 B)Applet运行在客户端浏览器 C)Servlet运行在Web服务器端 D)Servlet和Applet不可以动态从网络加载2.下面哪一项不在Servlet的工作过程中?()A)服务器将请求信息发送至Servlet B)客户端运行Applet C)Servlet生成响应内容并将其传给服务器 D)服务器将动态内容发送至客户端 3.下列哪一项不是Servlet中使用的方法?()A)doGet() B)doPost() C)service() D)close() 4.关于MVC架构的缺点,下列的叙述哪一项是不正确的?() A)提高了对开发人员的要求 B)代码复用率低C)增加了文件管理的难度 D)产生较多的文件5.下面哪一项对Servlet、JSP的描述错误?()

A)HTML、Java和脚本语言混合在一起的程序可读性较差,维护起来较困难。 B)JSP技术是在Servlet之后产生的,它以Servlet 为核心技术,是Servlet技术的一个成功应用。 C)当JSP页面被请求时,JSP页面会被JSP引擎翻译成Servelt字节码执行 D)一般用JSP来处理业务逻辑,用Servlet来实现页面显示。 6.下面哪一项对Servlet、JSP的描述错误?()A)Servlet可以同其他资源交互,例如文件、数据库 B)Servlet可以调用另一个或一系列Servlet E)服务器将动态内容发送至客户端 E)Servlet在表示层的实现上存在优势 7.下面哪一项对Servlet描述错误?()A)Servlet是一个特殊的Java类,它必须直接或间接实现Servlet接口 B)Servlet接口定义了Servelt的生命周期方法C)当多个客户请求一个Servlet时,服务器为每一个客户启动一个进程 D)Servlet客户线程调用service方法响应客户的请求

最全最经典spring_mvc教程

spring mvc学习教程(一)-入门实例 引言 1.MVC:Model-View-Control 框架性质的C层要完成的主要工作:封装web请求为一个数据对象、调用业务逻辑层来处理数据对象、返回处理数据结果及相应的视图给用户。 2.简要概述springmvc Spring C 层框架的核心是DispatcherServlet,它的作用是将请求分发给不同的后端处理器,也即使用了一种被称为Front Controller 的模式(后面对此模式有简要说明)。Spring 的C 层框架使用了后端控制器来、映射处理器和视图解析器来共同完成C 层框架的主要工作。并且spring 的C 层框架还真正地把业务层处理的数据结果和相应的视图拼成一个对象,即我们后面会经常用到的ModelAndView 对象。 一、入门实例 1. 搭建环境 在spring的官方API文档中,给出所有包的作用概述,现列举常用的包及相关作用: org.springframework.aop-3.0.5.RELEASE.jar:与Aop编程相关的包 org.springframework.beans-3.0.5.RELEASE.jar:提供了简捷操作bean的接口org.springframework.context-3.0.5.RELEASE.jar:构建在beans包基础上,用来处理资源文件及国际化。 org.springframework.core-3.0.5.RELEASE.jar:spring核心包 org.springframework.web-3.0.5.RELEASE.jar:web核心包,提供了web层接口org.springframework.web.servlet-3.0.5.RELEASE.jar:web 层的一个具体实包,DispatcherServlet也位于此包中。 后文全部在spring3.0 版本中进行,为了方便,建议在搭建环境中导入spring3.0 的所有jar 包(所有jar 包位于dist 目录下)。 2.编写HelloWorld实例 步骤一、建立名为springMVC_01_helloword,并导入上面列出的jar 包。 步骤二、编写web.xml配置文件,代码如下: spring

web技术应用基础应用复习

w e b技术应用基础应用 复习 文档编制序号:[KK8UY-LL9IO69-TTO6M3-MTOL89-FTT688]

填空题 1.JSP把Java作为默认的脚本语言. 2.HTTP的中文含义是超文本传输协议,它的作用是用于传输超文本标记语言 编写的文件。 3.网站一般分为三层,分别是用户界面交互层,应用程序层,数据库层。 4.Servlet的生命周期可以分为4个阶段:载入,初始化,执行,删除(销 毁。 5.在JSP文件中使用〈!————〉对HTML文本进行注释,使用〈%———— %〉符号对JSP语句进行注释。 6.JSP页面在使用Jag标记来调用一个标签文件之前,必须使用Taglib指令 标记引入该Web服务目录下的标记库。 7.在JSP中当执行了查询结果保存在Resultset对象中。 8.在JSP中,连接数据库的方式通常有两种:一种是通过JDBC驱动程序连 接;另一种是通过JDBC-ODBC桥连接。 9.HTML是超文本标记语言,作用是WWW页面内容的格式进行说明。在HTML中 加入CSS的方法主要有嵌入式样式表,内联式样式表,外联式样式表。 10.Request对象的作用是表示客户端对网页的请求,并使用HTTP协议处理 客户端的请求,一个常用的方法是getParameter();其作用为设置作为响应生成内容的类型和字符编码。 11.Reponse对象的作用是处理jsp生成的响应发送给客户端: setContentType(),其作用为设置作为响应生成内部的类型和字符编码。 12.JSP中的五个常见内建对象是out: application: request:reponse:session 13.Servlet中的4个常用方法分别是init():doGet():doPost():destor() 14.在JSP页面中显示用户信息的两种方法是()和〈%= %〉 15.Servlet中实现页面跳转的两种方法是()和().forward() 16.JSP开发网站的两种模式分为Jsp+javabean和jsp+javabean+servlet 17.一个JSP页面可由5种元素组合而成,分别是普通的HTML.标记,JSP标 记,JAVA程序片,JAVA表达式和变量和方法的声明。

经典教程httpClient4

目录 HttpClient简介 (4) 1)百科名片: (4) 2)HttpClient 的范围 (4) 3)httpClient 特性 (4) HttpClient基本功能的使用 (6) a)环境准备 (6) b)几个主要类解释 (6) c)第一个程序 (6) d)如何传递参数 (8) e)模拟表单登录 (10) f)HttpClient连接SSL (12) 1)生成KeyStore (12) 2)配置tomcat服务器支持SSL (13) 3)用浏览器访问你的应用 (15) 4)用httpClient访问https (15)

HttpClient简介 1)百科名片: HTTP 协议可能是现在Internet 上使用得最多、最重要的协议了,越来越多的Java 应用程序需要直接通过HTTP 协议来访问网络资源。虽然在JDK 的java net包中已经提供了访问HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP 协议的客户端编程工具包,并且它支持HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如Apache Jakarta 上很著名的另外两个开源项目Cactus 和HTMLUnit 都使用了HttpClient。现在HttpClient最新版本为HttpClient 4.1. 2)HttpClient 的范围 ?基于HttpCore的客户端HTTP运输实现库 ?基于经典(阻塞)I/O ?内容无关 3)httpClient 特性 ?基于标准,纯净的java语言.实现了Http1.0和Http1.1 ?以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE). ?支持HTTPS协议. ?通过Http代理建立透明的连接. ?利用CONNECT 方法通过Http代理建立隧道的https连接. ?Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos 认证方案. ?插件式的自定义认证方案. ?便携可靠的套接字工厂使它更容易的使用第三方解决方案. ?连接管理器支持多线程应用.支持设置最大连接数,同时支持设置每个主机的最大连接数.发现并关闭过期的连接. ?Automatic Cookie handling for reading Set-Cookie: headers from the server and sending them back out in a Cookie: header when appropriate. ?插件式的自定义Cookie策略. ?Request output streams to avoid buffering any content body by streaming directly to the socket to the server.

Java_Servlet入门教程

教学活动首页 基本内容 第 7 章 Java Servlet 教学目的与要求:通过本章的学习让学生了解如何用 servlet 读写文件,用 servlet 访问数据库;理解servlet 工作原理,servlet共享变量的使用;掌握编译和安装 servlet,通过 JSP 页面调用 servlet,HttpServlet 类,掌握会话管理。 教学内容: 7.1 servlet 工作原理 7.2 编译和安装 servlet 7.3 通过 JSP 页面调用 servlet 7.4 servlet共享变量 7.5 HttpServlet 类 7.6 用 servlet 读写文件 7.7 用 servlet 访问数据库 7.8 会话管理 教学基本要求: 了解:用 servlet 读写文件,用 servlet 访问数据库 理解:servlet 工作原理,servlet共享变量 掌握:编译和安装 servlet,通过 JSP 页面调用 servlet,HttpServlet 类,会话管理 教学重点教学难点: servlet 工作原理,编译和安装 servlet,通过 JSP 页面调用 servlet,HttpServlet 类,会话管理 教学方法: 教学手段:多媒体教学和计算机程序演示 教学小结:(见教学进程) 作业与思考:见课后习题 课后记载:

教学进程 第7章 Java Servlet 我们已经知道,SUN公司以Java Servlet为基础,推出了Java Server Page。JSP提供了Java Servlet的几乎所有好处,当一个客户请求一个JSP页面时,JSP引擎根据JSP页面生成一个Java文件,即一个servlet。这一章,将对servlet做一个较详细的介绍,这不仅对于深刻理解JSP有一定的帮助,而且通过学习servlet,还能使我们选择使用 JSP+javabeans+servlet的模式来开发我们的Web应用程序。 我们已经知道,用JSP支持JavaBeans这一特点,可以有效的管理页面的静态部分和页面的动态部分。另外,我们也可以在一个JSP页面中调用一个servlet完成动态数据的处理,而让JSP页面本身处理静态的信息。因此,开发一个Web应用有两种模式可以选择: (1) JSP+javabeans (2) JSP+javabeans+servlet 7.1 Servlet工作原理 servlet由支持servlet的服务器:servlet引擎,负责管理运行。当多个客户请求一个servlet时,引擎为每个客户启动一个线程而不是启动一个进程,这些线程由servlet引擎服务器来管理,与传统的CGI为每个客户启动一个进程相比较,效率要高的多。 7.1.1 Servlet 的生命周期 学习过Java 语言的人对Java Applet(Java小应用程序)都很熟悉,一个Java Applet 是java.applet.Applet类的子类,该子类的对象由客户端的浏览器负责初始化和运行。servlet的运行机制和Applet类似,只不过它运行在服务器端。一个servlet是javax.servlet 包中HttpServlet类的子类,由支持servlet的服务器完成该子类的对象,即servlet的初始化。 Servlet的生命周期主要有下列三个过程组成: (1)初始化servlet。servlet第一次被请求加载时,服务器初始化这个servlet,即创建一个servlet对象,这对象调用init方法完成必要的初始化工作。 (2)诞生的servlet对象再调用service方法响应客户的请求。 (3)当服务器关闭时,调用destroy方法,消灭servlet对象。 init方法只被调用一次,即在servlet第一次被请求加载时调用该方法。当后续的客户请求servlet服务时,Web服务将启动一个新的线程,在该线程中,servlet调用service方法响应客户的请求,也就是说,每个客户的每次请求都导致service方法被调用执行。 7.1.2 init方法 该方法是HttpServlet类中的方法,我们可以在servlet中重写这个方法。 方法描述: public void init(ServletConfig config) throws ServletException servlet第一次被请求加载时,服务器初始化一个servlet,即创建一个servlet对象,这个对象调用init方法完成必要的初始化工作。该方法在执行时,servlet引擎会把一个

第八章 Servlet技术习题

第八章Servlet技术 一、选择题 1.下面对Servlet、Applet的那一项描述错误?() A)Servelt与Applet相对应 B)Applet运行在客户端浏览器 C)Servlet运行在Web服务器端 D)Servlet和Applet不可以动态从网络加载 2.下面哪一项不在Servlet的工作过程中?() A)服务器将请求信息发送至Servlet B)客户端运行Applet C)Servlet生成响应内容并将其传给服务器 D)服务器将动态内容发送至客户端 3.下列哪一项不是Servlet中使用的方法?() A)doGet() B)doPost() C)service() D)close() 4.关于MVC架构的缺点,下列的叙述哪一项是不正确的?() A)提高了对开发人员的要求B)代码复用率低 C)增加了文件管理的难度D)产生较多的文件 5.下面哪一项对Servlet、JSP的描述错误?() A)HTML、Java和脚本语言混合在一起的程序可读性较差,维护起来较困难。 B)JSP技术是在Servlet之后产生的,它以Servlet为核心技术,是Servlet技术的一个成功应用。 C)当JSP页面被请求时,JSP页面会被JSP引擎翻译成Servelt字节码执行 D)一般用JSP来处理业务逻辑,用Servlet来实现页面显示。 6.下面哪一项对Servlet、JSP的描述错误?() A)Servlet可以同其他资源交互,例如文件、数据库 B)Servlet可以调用另一个或一系列Servlet E)服务器将动态内容发送至客户端 E)Servlet在表示层的实现上存在优势 7.下面哪一项对Servlet描述错误?() A)Servlet是一个特殊的Java类,它必须直接或间接实现Servlet接口 B)Servlet接口定义了Servelt的生命周期方法 C)当多个客户请求一个Servlet时,服务器为每一个客户启动一个进程 D)Servlet客户线程调用service方法响应客户的请求 8.下面哪一项对Servlet描述错误?() A)Servlet是一个特殊的Java类,它必须直接或间接实现Servlet接口 B)Servlet接口定义了Servelt的生命周期方法 C)当多个客户请求一个Servlet时,服务器为每一个客户启动一个进程 D)Servlet客户线程调用service方法响应客户的请求 9.下面Servlet的哪个方法载入时执行,且只执行一次,负责对Servlet进行初始化。()A)service() B)init() C)doPost() D)destroy()

c#_操作webservice(经典入门教程)

Web Service 的基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件(服务),使用WSDL文件进行(说明),并通过(UDDI)进行注册。 XML:(Extensible Markup Language)扩展型可标记语言。面向短期的临时数据处理、面向万维网络,是Soap的基础。 Soap:(Simple Object Access Protocol)简单对象存取协议。是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP 调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。 WSDL:(Web Services Description Language) WSDL 文件是一个XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。 UDDI (Universal Description, Discovery, and Integration) 是一个主要针对Web服务供应商和使用者的新项目。在用户能够调用Web服务之前,必须确定这个服务内包含哪些商务方法,找到被调用的接口定义,还要在服务端来编制软件,UDDI是一种根据描述文档来引导系统查找相应服务的机制。UDDI利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息。它采用XML格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。 概念补充: http soap关系 http:是一个客户端和服务器端请求和应答的标准(TCP)。http协议其目的是为了提供一种发布和接收htttp页面的方法 一http协议的客户端与服务器的交互:由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。

Servlet入门(一)

Servlet入门(一) ——传智播客学习笔记 1.什么是动态网页 ●如果浏览器在不同时刻或不同条件下访问WEB服务器上的某个页面,浏览器所获得的页面内容可以发生变化,那么这个页面就称之为动页面。 ●要想让浏览器访问某一WEB页面时,能够查询出一些动态变化的实时信息,例如,某日某次列车的车票剩余状况,浏览器在不同时刻所得到的WEB页面的内容必须随着车票的剩余状况进行变化,这就必须采用动态网页来实现。 ●浏览器只关心如何显示和处理WEB服务器返回的内容,浏览器处理动态网页的方式与它处理静态网页的方式完全相同、并无差异。 ●WEB服务器发送的静态内容直接来自于文本或数据文件,而动态内容需要依靠一个程序来临时产生。 2.动态网页程序与引擎 ●动态网页内容的创建过程包含两个步骤: 首先使用某种编程语言编写出相应的动态网页程序; 然后由一个专门的WEB服务器程序模块来解释执行该动态网页程序。 ●在动态网页程序的代码中可以完成各种程序逻辑控制、获取客户端传递的数据、对数据库进行操作、创建输出内容等功能,WEB程序开发就是使用某种编程语言来编写完成上述功能的动态网页程序。 ●动态网页程序需要有一个专门的WEB服务器程序模块来解释执行,专门解释和执行某种动态网页程序的WEB服务器程序模块习惯上被称为引擎,譬如ASP引擎、Servlet引擎、JSP引擎等。 ●只有引擎会与浏览器直接进行信息交换,动态网页程序不直接与浏览器进行信息交换,动态网页程序只与引擎进行信息交换,由引擎将浏览器的信息传递给动态网页程序和将动态网页程序生产的结果回送给浏览器。 ●引擎提供的API有两个基本的作用:一些API用于将访问请求的相关信息传递给动态网页程序;另一些API将动态网页程序产生的结果传递给引擎。 ●客户端向WEB服务器请求的URL资源路径,不仅可以指向服务器的一个静态HTML文件,还可以指向服务器端的某种可被解释运行的运行文件。 ●如果客户端请求的URL后缀名符合某种引擎所处理的资源名的特征,WEB服务将把请求转交给相应的引擎去处理,然后由引擎去调用某个程序文件,并将程序动态产生的内容返回给客户端。 ●动态网页程序文件中的代码不仅可以创建出用于返回给浏览器的动态变化内容,还可以实现对数据库的插入、修改、删除和查询等操作,从而让网站可实现论坛交流、产品订购、问卷调查、甚至是企业的整个管理信息系统等功能。 ●目前有不少公司提供了动态网页的解决方案,称为服务器端的WEB编程技术,常见的技术有CGI、ISAPI、ASP、.NET、Servlet/JSP、PHP等,这些技术分别使用不同的编程语言。 3.Servlet技术简介 ●Servlet技术是Sun公司提供的一种实现动态网页的解决方案,它是基于Java编程语言的WEB服务器端编程技术。 ●Servlet技术也是JSP技术的基础。 ●一个Servlet程序就是一个实现了特殊接口的Java类,它由支持Servlet的WEB服务器调用和启动运行。一个Servlet程序负责处理它所对应的一个或一组URL地址的访问请求,并接受客户端发出的访问请求信息和产生响应内容。 ●Applet是用于浏览器的Java小程序,Servlet是用于WEB服务器端的Java小程序。 ●Servlet程序可以完成普通Java程序所能完成的大多数任务: 获取客户端通过HTML的FORM表单递交的数据和URL后面的参数信息 创建对客户端的响应消息内容 访问服务器端的文件系统 连接数据库并开发基于数据库的应用 调用其他的JA V A类。

JSP入门教程

1.JSP入门教程(一) 作者:SUN/网猫 欢迎使用JavaServer Pages(以下简称JSP)技术—制作动态内容网页的方法。 如果你希望学习这篇教程的话,我想你一定是这项技术的新手。你可能想成为一名利用JSP 技术开发网络应用程序的程序员或者网页设计师。本教程中包含了一系列JSP的技巧和一些简单的代码的写法,每一步都举了一组例子来讲述原理。 我建议你在学习本教程之前先去看一看FAQ,了解如果配置你的服务器好让他能支持并运行JSP。那样你就可以跳过前边的内容直接看你感兴趣的内容了。 OK,费话少说,Let’s go! 第一课:真正的开始 [dukebanner.html]

   
 

helloworld.jsp <%@ page info="a hello world example" %> Hello, World <%@ include file="dukebanner.html" %>
 

Hello, World!

页面说明: 在很多JSP文件中你都要写上这样的说明。在helloword.jsp中: <%@ page info="a hello world example" %> 傻瓜也看得出来,这句话没什么大用,只是简要的说明一下这段代码的作用。 你可以在JSP文件中的任何地方写这种代码,但是好的习惯是把他写在最前面,还有,因为他是JSP标签,记住一定要放在前面,呵 include说明:

“servlet技术”单元习题

“Servlet技术”单元习题 一、填空题 1.___________是Sun公司推出的一种在服务器端运行的小程序,它的实质就是一个类,是一个能够使用print 语句产生动态HTML 内容的Java 类。 2.编译Servlet 之前,将Servlet 所需要的___________包添加到classpath 中。3.Java API 提供了___________和___________包为编写Servlet提供了接口和类。 4.在编写Servlet 时要用到的javax.servlet.HttpServlet 类为___________的子类。 5.Javax.servlet.GenericServlet 类为______________________类的子类,并且实现了 javax.servlet.Servlet 接口、javax.servlet.ServletConfig 接口和javax.io.Serializable 接口。 6.在doGet方法的参数中通常要用到______________________接口和 _________________________________接口。 7.一般情况下要用到的javax.servlet.http.HttpServletRequest 接口继承于 ______________________接口,而javax.servlet.http.HttpServletResponse接口继承于______________________接口。 8.______________________接口定义了Servlet 必须实现的方法。 9.______________________类提供Servlet 接口的HTTP 特定实现。 10.______________________接口的主要作用是获得客户端的请求信息。11.______________________接口的主要作用是获得与服务器端的响应信息。12.______________________接口的主要作用是与相应的Servlet 容器通信。13.______________________接口的主要作用是用于在Servlet 初始化时向它传递信息。 14.Servlet接口的______________________方法在服务器装入Servlet时执行,在Servlet 的生命周期中仅仅执行一次。 15.当客户请求一个HttpServlet 对象时,该对象的_____________________方法就要被调用。 16.Servlet 接口的______________________方法是在服务器停止且卸载Servlet 时执行的,通常用来将统计数字保存在文件中或关闭数据库连接。17.Servlet接口的______________________方法返回一个ServletConfig 对象,该对象用来返回初始化参数和ServletContext。 18.Servlet接口的______________________方法的主要功能是获得有关Servlet 的信息, 如作者、版本、版权信息。 19.HttpServlet 类的______________________方法的主要功能是由Servlet 引擎调用处理 一个HTTP GET 请求。 20.HttpServlet 类的______________________方法的主要功能是由Servlet 引擎调用处理一个HTTPPOST 请求。

Struts2详细实例教程

Struts2(上) 一、经典的MVC模式 二、Struts1.x对MVC的实现 三、Struts1.x的主要组件和作用 组件作用 ActionServlet 中央控制器 Action 分控制器,调用JavaBean实现业务逻辑, Action可以分为Action、DispatchAction等不 同类型

ActionForm 封装参数,实现服务器验证,文件上传等Forward 转发到目的地,可以是JSP,也可以是另一个 Action Struts-config.xml 配置文件,配置有ActionForm,Action,Forward 等,通过XML解析,然后使用反射技术使用 该文件 Struts标签库和JSTL类似,和Struts-config.xml、 ActionForm、Action等对象可以紧密集成 四、Struts1.x 开发实例-登录程序 见案例。 五、Struts2(WebWork)的MVC Struts2的MVC架构 六、Struts2的主要组件 组件作用 FilterDispatcher 起中央控制器作用的过滤器 Action 处于Model层的Action,调用JavaBean实现 业务逻辑 struts.xml 核心配置文件,配置有Action、Result等result 和forward类似,转发的目的地,支持多种视 图技术。

七、Struts2的实例-登录 在MyEclipse环境中建立一个新的web工程,名称“Struts2Login”,存放路径“f:\Struts2Login”。 在Struts2.0.11版本中找到war包struts2-blank-2.0.11.war,解开该war包,在WEB-INF/lib 目录下复制出所有的jar包,这些jar包就是一个Struts2程序所需要的基础jar包,把它们复制到新建的web工程的WEB-INF/lib目录中。 在src目录下建立一个类,包名mypack,类名UserAction,其代码如下: package mypack; import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport { private String username; private String userpass; public String getUsername() { return username; } public void setUsername(String username) { https://www.doczj.com/doc/961024012.html,ername = username; } public String getUserpass() { return userpass; } public void setUserpass(String userpass) { https://www.doczj.com/doc/961024012.html,erpass = userpass; } @Override public String execute() throws Exception { if ("Mike".equals(username) && "123".equals(userpass) || "张三".equals(username) && "abc".equals(userpass)) return "success"; else return "error"; } } 在src目录下建立Struts2的配置文件struts.xml,内容如下:

Servlet技术概述

Servlet技术概述 Servlet是使用Java Servlet 应用程序设计接口(API)及相关类和方法的Java 程序。Java Servlet对于Web服务器,如同Java applet对于Web浏览器。Servlet被加载到Web服务器,并在Web服务器内执行。而applet加载到Web浏览器,并在Web浏览器内执行。Java Servlet API 定义了一个Servlet 和Java使能的服务器之间的一个标准接口,这使得Servlets具有跨服务器平台的特性。 Servlet通过创建一个框架来扩展服务器的能力,以提供在Web上进行请求和响应服务。当客户机发送请求至服务器时,服务器可以将请求信息发送给Servlet,并通过Servlet建立起服务器返回给客户机的响应。当启动Web服务器或客户机第一次请求服务时,可以自动加载Servlet程序。加载后,Servlet继续运行其它客户机发出的请求。Servlet涉及的范围很广,具体可完成如下功能: ●创建并返回一个包含基于请求的动态内容的JSP页面。 ●创建可嵌入到现有的HTML页面和JSP页面中的部分片段。与其他服务器资源(文件、 数据库、Applet、Java应用程序等)进行通信。 ●处理多个客户连接,接收多个客户的输入,并将结果发送到多个客户机上。 ●对特殊的处理采用MIME类型的过滤数据,例如图像转换。 ●将定制的处理提供给所有的服务器的标准例行程序。例如,Servlet可以设置如何认证 合法用户。 因此,Servlet技术在Java Web开发过程中,非常受欢迎。相比,Java Servlet 具有更高的效率,更容易使用等特点。 ●运行高效 在传统的CGI中,每个请求都要启动一个新的进程,如果CGI程序本身的执行时间较短,启动进程所需要的开销很可能反而超过实际执行时间。而在Servlet中,每个请求由一个轻量级的Java线程处理(而不是重量级的操作系统进程)。 ●使用方便 Servlet提供了大量的实用工具,如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等。 ●功能强大 在Servlet中,许多使用传统CGI程序很难完成的任务都可以轻松地完成。例如,Servlet能够直接和Web服务器交互,而普通的CGI程序不能。Servlet还能够在各个程序之间共享数据,使得数据库连接池之类的功能很容易实现。 ●具有良好的移植性 Servlet基于Java编写规范,Servlet API具有完善的标准。因此,Servlet无需任何实质上的改动即可移植到Apache、Microsoft IIS或者WebStar等服务器平台。几乎所有的主流服务器都直接或通过插件支持Servlet。

Servlet入门指南

Servlet入门指南 1.简介 Servlet是在Web服务器端加载并运行的Java应用程序,具体运行在Servlet引擎管理的JVM上,负责Servlet和用户的通信以及调用Servlet的方法。Servlet和用户的通信采用请求/响应模式,用于以动态响应客户机请求形式扩展Web服务器(Web Container)的功能。 Servlet是一个执行在服务器端的Java Class文件,载入前必须先将Servlet程序代码编译成.class文件,然后将此class文件放在servlet Engline 路径下。Servlet API使用javax.servlet和javax.servlet.http两个包的接口类。Servlet是开发服务器端应用程序的一个很好选择, Servlet与JSP结合使用,能提供更强大的服务器端功能。 Servlet的最大的缺点是不能有效地管理页面的逻辑部分和页面的输出部分,导致Servlet代码非常混乱,而用JSP和JavaBean/Servlet结合可以有效地管理页面的逻辑部分和页面的输出部分。当服务器上的一个JSP网页被第一次请求执行时,服务器上的JSP引擎首先将JSP页面文件转译成一个Java文件,再将这个Java文件编译成class字节码文件(即Servlet类),然后执行以响应客户的请求,当这个JSP页面再次被请求执行时,JSP引擎将直接执行这个字节码文件来响应客户,响应速度比第一次执行快很多。 两者可以互相调用,一般Servlet较多应用于业务逻辑(页面HTML输出不多或没有),而JSP偏重于数据展现,同一份数据可以用不同形式的视图来展现。 2. 基本引擎分类 ●大多数的J2EE服务器,如:BEA WebLogic,WebSphere Application, JBoss等。 ●具有内置Servlet容器的Web服务器,如:Tomcat。 ●使用Servlet引擎插件的产品,如JRun、 Apache Web服务器、Microsoft IIS等,这些产品都需要安装Web插件来集成Java运行时环境 3. Servlet 处理请求的过程 1.用户从客户机将HTTP请求发送给Web服务器。

相关主题
文本预览
相关文档 最新文档