JSP与Servlet.docx

上传人:b****6 文档编号:3306601 上传时间:2022-11-21 格式:DOCX 页数:37 大小:35.41KB
下载 相关 举报
JSP与Servlet.docx_第1页
第1页 / 共37页
JSP与Servlet.docx_第2页
第2页 / 共37页
JSP与Servlet.docx_第3页
第3页 / 共37页
JSP与Servlet.docx_第4页
第4页 / 共37页
JSP与Servlet.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

JSP与Servlet.docx

《JSP与Servlet.docx》由会员分享,可在线阅读,更多相关《JSP与Servlet.docx(37页珍藏版)》请在冰豆网上搜索。

JSP与Servlet.docx

JSP与Servlet

JSP与Servlet

  综述:

JavaServlet是JSP技术的基础,而且大型的Web应用程序的开发需要JavaServlet和JSP配合才能完成。

现在许多Web服务器都支持Servlet,即使不直接支持Servlet的Web服务器,也可以通过附件的应用服务器和模块来支持Servlet,这得益于Java的跨平台特性。

另外,由于Servlet内部以线程方式提供提供服务,不必对于每个请求都启动一个进程,并且利用多线程机制可以同时为多个请求服务,因此Servlet的效率非常高。

  但它并不是没有缺点,和传统的CGI、ISAPI、NSAPI方式相同,JavaServlet也是利用输出HTML语句来实现动态网页的,如果用它来开发整个网站,动态部分和静态页面的整合过程将变得无法想象。

这就是SUN还要推出JSP的原因。

  如何正确理解servlet?

  servlet的基本概念

  一、Servlet的结构

  在具体掌握servlet之前,须对Java语言有所了解。

我们假设读者已经具备一定的Java基础。

在ServletAPI中最重要的是Servlet接口(interface),所有的servlets都必须实现该接口,途径有很多:

一是直接实现该接口,二是通过扩展类(class)来实现,如HttpServlet。

这个Servlet接口提供了servlet与客户端联系的方法。

Servlet编写者可以在他们开发servlet程序时提供更多一些或所有的这样方法。

  当一个servlet接收来自客户端的调用请求,它接收两个对象:

一个是ServletRequest,另外一个是ServletResponse。

这个ServletRequest类概括从客户端到服务器之间的联系,而ServletResponse类概括从servlet返回客户端的联系。

  ServletRequest接口可以获取到这样一些信息,如由客户端传送的阐述名称,客户端正在使用的协议,产生请求并且接收请求的服务器远端主机名。

它也提供获取数据流的ServletInputStream,这些数据是客户端引用中使用HTTPPOST和PUT方法递交的。

一个ServletRequest的子类可以让servlet获取更多的协议特性数据。

例如:

HttpServletRequest包含获取HTTP-specific头部信息的方法。

  ServletResponse接口给出相应客户端的servlet方法。

它允许servlet设置内容长度和回应的mime类型,并且提供输出流ServletOutputStream,通过编写者可以发回相应的数据。

ServletResponse子类可以给出更多protocol-specific内容的信息。

例如:

HttpServletResponse包含允许servlet操作HTTP-specific头部信息的方法。

  上面有关类和接口的描述,构成了一个基本的Servlet框架。

HTTPservlets有一些附加的可以提供session-trackingcapabilities的方法。

servlet编写者可以利用这些API,在有他人操作时维护servlet与客户端之间的状态。

作者:

包路跃出处:

Yesky责任编辑:

[2002-04-2316:

33]

JavaServlet是JSP技术的基础,而且大型的Web应用程序的开发需要JavaServlet和JSP配合才能完成......

  二、Servlet的接口

  我们编写的Servlet,一般从Javax包的HttpServlet类扩展而来,在HttpServlet中加入了一些附加的方法,这些方法可以被协助处理HTTP基本请求的HttpServlet类中的方法service自动地调用。

这些方法有:

  ·doGet用来处理HTTP的GET请求。

  这个GET操作仅仅允许客户从HTTPserver上取得(GET)资源。

重载此方法的用户自动允许支持方法HEAD。

这个GET操作被认为是安全的,没有任何的负面影响,对用户来说是很可靠的。

比如,大多数的正规查询都没有副作用。

打算改变存储数据的请求必须用其他的HTTP方法。

这些方法也必须是个安全的操作。

方法doGet的缺省实现将返回一个HTTP的BAD_REQUEST错误。

  方法doGet的格式:

  protectedvoiddoGet(HttpServletResquestrequest,HttpServletResponseresponse)

  throwsServletException,IOException;

  ·doPost用来处理HTTP的POST请求。

  这个POST操作包含了在必须通过此servlet执行的请求中的数据。

由于它不能立即取得资源,故对于那些涉及到安全性的用户来说,通过POST请求操作会有一些副作用。

  方法doPost的缺省实现将返回一个HTTP的BAD_REQUEST错误。

当编写servlet时,为了支持POST操作必须在子类HttpServlet中实现(implement)此方法。

  此方法的格式:

  protectedvoiddoPost(HttpServletResquestrequest,HttpServletResponseresponse)

  throwsServletException,IOException;

  ·doPut用来处理HTTP的PUT请求。

  此PUT操作模拟通过FTP发送一个文件。

对于那些涉及到安全性的用户来说,通过PUT请求操作也会有一些副作用。

  此方法的格式:

  protectedvoiddoPut(HttpServletResquestrequest,HttpServletResponseresponse)

  throwsServletException,IOException;

  ·doDelete用来处理HTTP的DELETE请求。

  此操作允许客户端请求一个从server移出的URL。

对于那些涉及到安全性的用户来说,通过DELETE请求操作会有一些副作用。

  方法doDelete的缺省实现将返回一个HTTP的BAD_REQUEST错误。

当编写servlet时,为了支持DELETE操作,必须在子类HttpServlet中实现(implement)此方法。

  此方法的格式:

  protectedvoiddoDelete(HttpServletResquestrequest,HttpServletResponseresponse)

  throwsServletException,IOException;

  ·doHead用来处理HTTP的HEAD请求。

  缺省地,它会在无条件的GET方法执行时运行,但是不返回任何数据到客户端。

只返回包含内容信息的长度的header。

由于用到GET操作,此方法应该是很安全的(没有副作用)也是可重复使用的。

此方法的缺省实现(implement)自动地处理了HTTPDE的HEAD操作并且不需要通过一个子类实现(implement)。

  此方法的格式:

  protectedvoiddoHead(HttpServletResquestrequest,HttpServletResponseresponse)

  throwsServletException,IOException;

  ·doOptions用来处理HTTP的OPTIONS请求。

  此操作自动地决定支持什么HTTP方法。

比如说,如果读者创建HttpServlet的子类并重载方法doGet,然后方法doOptions会返回下面的header:

  Allow:

GET,HEAD,TRACE,OPTIONS

  一般不需要重载方法doOptions。

  此方法的格式:

  protectedvoiddoOptions(HttpServletResquestrequest,HttpServletResponseresponse)

throwsServletException,IOException;

  ·doTrace用来处理HTTP的TRACE请求。

  此方法的缺省实现产生一个包含所有在trace请求中的header的信息的应答(response)。

在开发servlet时,多数情况下需要重载此方法。

  此方法的格式:

  protectedvoiddoTrace(HttpServletResquestrequest,HttpServletResponseresponse)

  throwsServletException,IOException;

  在开发以HTTP为基础的servlet中,Servlet开发者关心方法doGet和方法doPost即可。

作者:

包路跃出处:

Yesky责任编辑:

[2002-04-2316:

33]

JavaServlet是JSP技术的基础,而且大型的Web应用程序的开发需要JavaServlet和JSP配合才能完成......

  三、Servlet的生命周期

  如果读者写过Java的小应用程序(Applet),那Servlet对你来说就不会太难,也许更为简单。

因为Servlet不用考虑图形界面的应用。

与小应用程序一样,Servlet也有一个生命周期。

Servlet的生命周期是当服务器装载运行servlets:

接收来自客户端的多个请求并且返回数据给客户端,然后再删除移开servlets。

下面详细描述如下:

  1.初始化时期

  当一个服务器装载servlet时,它运行servlet的init()方法。

publicvoidinit(ServletConfigconfig)throwsServletException

{

super.init();//一些初始化的操作,如数据库的连接

}

  需要记住的是一定要在init()结束时调用super.init()。

init()方法不能反复调用,一旦调用就是重装载servlet。

直到服务器调用destroy方法卸载servlet后才能再调用。

  2.Servlet的执行时期

  在服务器装载初始化servlet后,servlet就能够处理客户端的请求,我们可以用service方法来实现。

每个客户端请求有它自己service方法:

这些方法接收客户端请求,并且发回相应的响应。

Servlets能同时运行多个service。

这是很重要的,这样,service方法可以按一个thread-safe样式编写。

如:

service方法更新servlet对象中的一个字段field,这个字段是可以同时存取的。

假如某个服务器不能同时并发运行service方法,也可以用SingleThreadModel接口。

这个接口保证不会有两个以上的线程(threads)并发运行。

在Servlet执行期间其最多的应用是处理客户端的请求并产生一个网页。

其代码如下:

PrintWriterout=response.getWriter();

out.println("<html>");

out.println("<head><title>"#Servlet</title></head>");

out.println("<body>");

out.println("HelloWorld");

out.println("</body></html>");

out.close();

3.Servlet结束时期

  Servlets一直运行到他们被服务器卸载。

在结束的时候需要收回在init()方法中使用的资源,在Servlet中是通过destory()方法来实现的。

publicvoiddestroy()

{

//回收在init()中启用的资源,如关闭数据库的连接等。

}

  JSP与servlet之间是怎样的关系?

  JSP主要关注于HTML(或者XML)与Java代码的结合,以及加入其中的JSP标记。

如果一个支持JSP的服务器遇到一个JSP页面,它首先查看该页面是否被编译成为一个servlet。

由此可见,JSP被编译成servlet,即被转变为纯Java,然后被装载入服务器执行。

当然,这一过程,根据不同的JSP引擎而略有不同。

  JSP和servlet在应用上有什么区别

  简单的说,SUN首先发展出SERVLET,其功能比较强劲,体系设计也很先进,只是,它输出HTML语句还是采用了老的CGI方式,是一句一句输出,所以,编写和修改HTML非常不方便。

  后来SUN推出了类似于ASP的嵌套型的JSP,把JSPTAG嵌套到HTML语句中,这样,就大大简化和方便了网页的设计和修改。

新型的网络语言如ASP,PHP都是嵌套型的。

  从网络三层结构的角度看,一个网络项目最少分三层:

datalayer,businesslayer,,presentationlayer。

当然也可以更复杂。

  SERVLET用来写businesslayer是很强大的,但是对于写presentationlayer就很不方便。

JSP则主要是为了方便写presentationlayer而设计的。

当然也可以写businesslayer。

写惯了ASP,PHP,CGI的朋友,经常会不自觉的把presentationlayer和businesslayer混在一起。

比如把数据库处理信息放到JSP中,其实,它应该放在businesslayer中。

  根据SUN自己的推荐,JSP中应该仅仅存放与presentationlayer有关的部分,也就是说,只放输出HTML网页的部份。

而所有的数据计算、数据分析、数据库联结处理,统统是属于businesslayer,应该放在JAVABEANS中。

通过JSP调用JAVABEANS,实现两层的整合。

  实际上,微软前不久推出的DNA技术,简单说,就是ASP+COM/DCOM技术。

与JSP+BEANS完全类似,所有的presentationlayer由ASP完成,所有的businesslayer由COM/DCOM完成。

通过调用,实现整合。

  为什么要采用这些组件技术呢?

因为单纯的ASP/JSP语言是非常低效率执行的,如果出现大量用户点击,纯SCRIPT语言很快就到达了他的功能上限,而组件技术就能大幅度提高功能上限,加快执行速度。

  另外一方面,纯SCRIPT语言将presentationlayer和businesslayer混在一起,造成修改不方便,并且代码不能重复利用。

如果想修改一个地方,经常会牵涉到十几页CODE,采用组件技术就只改组件就可以了。

  综上所述,SERVLET是一个不完善的产品,写businesslayer很好,写presentationlayer就很逊色许多了,并且两层混杂。

所以,推出JSP+BAEN,用JSP写presentationlayer,用BAEN写businesslayer。

SUN自己的意思也是将来用JSP替代SERVLET。

  所以,学了JSP,不会用JAVABEAN并进行整合,等于没学。

作者:

包路跃出处:

Yesky责任编辑:

[2002-04-2316:

33]

JavaServlet是JSP技术的基础,而且大型的Web应用程序的开发需要JavaServlet和JSP配合才能完成......

  如何调用servlet?

  要调用Servlet或Web应用程序,请使用下列任一种方法:

由URL调用、在<FORM>标记中调用、在<SERVLET>标记中调用、在ASP文件中调用。

  1.由URL调用Servlet

  这里有两种用Servlet的URL从浏览器中调用该Servlet的方法:

  

(1)指定Servlet名称:

当用WebSphere应用服务器管理器来将一个Servlet实例添加(注册)到服务器配置中时,必须指定"Servlet名称"参数的值。

例如,可以指定将hi作为HelloWorldServlet的Servlet名称。

要调用该Servlet,需打开http:

//your.server.name/servlet/hi。

也可以指定Servlet和类使用同一名称(HelloWorldServlet)。

在这种情况下,将由http:

//your.server.name/servlet/HelloWorldServlet来调用Servlet的实例。

  

(2)指定Servlet别名:

用WebSphere应用服务器管理器来配置Servlet别名,该别名是用于调用Servlet的快捷URL。

快捷URL中不包括Servlet名称。

  2.在<FORM>标记中指定Servlet

  可以在<FORM>标记中调用Servlet。

HTM格式使用户能在Web页面(即从浏览器)上输入数据,并向Servlet提交数据。

例如:

<FORMMETHOD="GET"ACTION="/servlet/myservlet">

<OL>

<INPUTTYPE="radio"NAME="broadcast"VALUE="am">AM<BR>

<INPUTTYPE="radio"NAME="broadcast"VALUE="fm">FM<BR>

</OL>

(用于放置文本输入区域的标记、按钮和其它的提示符。

</FORM>

  ACTION特性表明了用于调用Servlet的URL。

关于METHOD的特性,如果用户输入的信息是通过GET方法向Servlet提交的,则Servlet必须优先使用doGet()方法。

反之,如果用户输入的信息是通过POST方法向Servlet提交的,则Servlet必须优先使用doPost()方法。

使用GET方法时,用户提供的信息是查询字符串表示的URL编码。

无需对URL进行编码,因为这是由表单完成的。

然后URL编码的查询字符串被附加到ServletURL中,则整个URL提交完成。

URL编码的查询字符串将根据用户同可视部件之间的交互操作,将用户所选的值同可视部件的名称进行配对。

例如,考虑前面的HTML代码段将用于显示按钮(标记为AM和FM),如果用户选择FM按钮,则查询字符串将包含name=value的配对操作为broadcast=fm。

因为在这种情况下,Servlet将响应HTTP请求,因此Servlet应基于HttpServlet类。

Servlet应根据提交给它的查询字符串中的用户信息使用的GET或POST方法,而相应地使用doGet()或doPost()方法。

  3.在<SERVLET>标记中指定Servlet

  当使用<SERVLET>标记来调用Servlet时,如同使用<FORM>标记一样,无需创建一个完整的HTML页面。

作为替代,Servlet的输出仅是HTML页面的一部分,且被动态嵌入到原始HTML页面中的其它静态文本中。

所有这些都发生在服务器上,且发送给用户的仅是结果HTML页面。

建议在Java服务器页面(JSP)文件中使用<SERVLET>标记。

  原始HTML页面中包含<SERVLET>和</SERVLET>标记。

Servlet将在这两个标记中被调用,且Servlet的响应将覆盖这两个标记间的所有东西和标记本身。

如果用户的浏览器可以看到HTML源文件,则用户将看不到<SERVLET>和</SERVLET>标记。

要在DominoGoWebserver上使用该方法,请启用服务器上的服务器端包括功能。

部分启用过程将会涉及到添加特殊文件类型SHTML。

当Web服务器接收到一个扩展名为SHTML的Web页面请求时,它将搜索<SERVLET>和</SERVLET>标记。

对于所有支持的Web服务器,WebSphere应用服务器将处理SERVLET标记间的所有信息。

下列HTML代码段显示了如何使用该技术。

<SERVLETNAME="myservlet"CODE="myservlet.class"CODEBASE="url"initparm1="value">

<PARAMNAME="parm1"VALUE="value">

</SERVLET>

  使用NAME和CODE属性带来了使用上的灵活性。

可以只使用其中一个属性,也可以同时使用两个属性。

NAME属性指定了Servlet的名称(使用WebSphere应用服务器管理器配置的),或不带.class扩展名的Servlet类名。

CODE属性指定了Servlet类名。

使用WebSphere应用服务器时,建议指定NAME和CODE,或当NAME指定了Servlet名称时,仅指定NAME。

如果仅指定了CODE,则会创建一个NAME=CODE的Servlet实例。

装入的Servlet将假设Servlet名称与NAME属性中指定的名称匹配。

然后,其它SHTML文件可以成功地使用NAME属性来指定Servlet的名称,并调用已装入的Servlet。

NAME的值可以直接在要调用Servlet的URL中使用。

如果NAME和CODE都存在,且NAME指定了一个现有Servlet,则通常使用NAME中指定的Servlet。

由于Servlet创建了部分HTML文件,所以当创建Servlet时,将可能会使用HttpServlet的一个子类,并优先使用doGet()方法(因为GET方法是提供信息给Servlet的缺省方法)。

另一个选项是优先使用service()方法。

另外,CODEBASE是可选的,它指定了装入Servlet的远程系统的URL。

请使用WebSphere应用服务器管理器来从JAR文件配置远程Servlet装入系统。

  在上述的标记示例中,initparm1是初始化参数名,value是该参数的值。

可以指定多个"名称-值"对的集合。

利用ServletConfig对象(被传递到Servlet的init()方法中)的getInitParameterNames()和getInitParameter()方法来查找参数名和参数值的字符串数组。

在示例中,parm1是参数名,并在初始化Servlet后被才被设置某个值。

因为只能通过使用"请求"对象的方法来使用以<PARAM>标记设置的参数,所以服务器必须调用Servletservice()方法,以从用户处传递请求。

要获得有关用户的请求信息,请使用getParameterNames()、getParameter()和getParameterValues()方法。

  初始化参数是持续的。

假设一台客户机通过调用一个包含某些初始化参数的SHTML文件来调用Servlet。

并假设第二台客户机通过调用第二个SHTML文件来调用同一个Servlet,且该SHTML中未指定任何初始化参数。

那么第一次调用Servlet时所设置的初始化参数将一直可用,并且通过所有其它SHTML文件而调用的所有后继Serv

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 表格类模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1