JSP与Servlet

课前索引

1 动态网页和静态网页有什么区别?
2
什么是Web应用程序?
3
什么是Servlet,和一般Java程序有什么区别?
4
什么是JSP,和Java是什么关系?
5
JSPServlet有哪些异同点?
6
JSPServlet的主要用途?
101 Servlet的概念、配置与运行

10.1.1 Java Servlet的概念  Java Servlet是一个专门用于编写网络服务器应用程序的Java组件。所有基于Java的服务器端编程都是构建在Servlet之上的。在J2EEServlet已经是一个标准的组件。

J2EE中跟Servlet相关的一个包是javax.servlet,其中最基本的Servlet被声明为一个接口javax.servlet: Interface Servlet,这是Servlet最高层次的一个抽象,它是和网络协议无关的。同样在javax.servlet中,实现了一个类 javax.servlet: class GenericServlet,这个类实现了Servlet接口,也是和协议无关的。而这个类是构建其他和协议相关的Servlet子类型的通用的父类(至少HttpServlet是从它继承而来的,从它的名字也能看出这一点)。

也就是说Servlet所适用的网络协议可以是多种多样的,比如HTTPFTPSMTPTELNET等,但是就目前而言,只有HTTP服务已经形成了标准的Java组件。对应的软件包有两个javax.servlet.httpjavax.servlet.jsp,分别对应我们要讲解的ServletJSP编程。我们通常所说的Servlet编程主要就是指针对HTTPServlet编程,用到的就是javax.servlet.http包中的类(典型的就是HttpServlet类),实际上Java Servlet编程的概念要更广一些,在这里我们也就约定俗成的使用Servlet来指代HTTP Servlet的编程,这点读者是需要了解的。由于JSP最终都是要经过JSP引擎转换成Servlet代码的,而且Servlet编程和一般的Java编程是没有大的区别的,只需要了解一定的规范即可,所以我们在这里先讲解Servlet的编程,这样对以后理解JSP是很大的有好处的,尽管在使用的时候可能JSP更为简单一些。  目前,Servlet引擎一般是第三方的插件,它通过一定的方法连接到Web服务器,Servlet引擎把它识别为Servlet请求的那些HTTP请求截获下来处理,而其他的HTTP请求由Web服务器按照通常的方式来处理,Servlet引擎会装载合适的Servlet到内存中,如果Servlet还没有运行的话,会分配一个可以使用的线程来处理请求,再把Servlet的输出返回到发出请求的Web客户机。  Java ServletJava Applet正好是相对应的两种程序类型,Applet运行在客户端,在浏览器内执行,而Servlet在服务器内部运行,通过客户端提交的请求启动运行,读者在学习过程可以作简单的比较。

由于Servlet是用Java编写的,所以它与生俱来就有跨平台的特性,因此Servlet程序的设计完全和平台是无关的,同样的Servlet完全可以在ApacheIIS等不同Web服务器上执行,不管底层的操作系统是WindowsSolarisMacLinux还是其他的能支持Java的操作系统。  Servlet是跟普通的Java程序一样,是被编译成字节码后由JVM执行的。相比传统的CGI,尽管CGI是用本地代码直接执行的,但是由于每次客户端发出请求,服务器必须启动一个新的程序来处理请求,这就把高负载强加给了服务器资源,尤其如果CGI使用脚本语言编写时,如perl,服务器还必须启动语言解释程序,程序越多,占用的内存就越多,消耗CPU也越多,严重影响系统性能。  Servlet运行于Servlet引擎管理的Java虚拟机中,被来自客户机的请求所唤醒,与CGI不同的是,在虚拟机中只要装载一个Servlet就能够处理新的请求,每个新请求使用内存中那个Servlet的相同副本,所以效率比CGI来得高。如果采用服务器端脚本,如ASPPHP,语言解释程序是内置程序,因此可以加快服务器的运行,但是效率还是比不上准编译的Servlet。实际的使用也已经证明,Servlet是效率很高的服务器端程序,很适合用来开发Web服务器应用程序。  Java Servlet有着十分广泛的应用。不光能简单的处理客户端的请求,借助Java的强大的功能,使用Servlet还可以实现大量的服务器端的管理维护功能,以及各种特殊的任务,比如,并发处理多个请求,转送请求,代理等

10.1.3 Servlet的运行环境

典型的Servlet运行环境有JSWDKTomcatResin等,这几个都是免费的软件,适合用来学习ServletJSP。它们都自带一个简单的HTTP Server,只需简单配置即可投入使用,你也可以把它们绑定到常用的Web服务器上,如ApacheIIS等,提供小规模的Web服务。还有一些商业的大中型的支持ServletJSPWeb服务器,如JRunWeb SphereWeb Logic等等,配置比较复杂,并不适合初学者。但是功能较为强大,有条件的读者可以一试。

10.1.7 Servlet的编译

Servlet的编译和一般的Java程序是完全一样的,在使用javac编译的时候不需要任何特殊的参数。只要Servlet的编写是正确的,编译完后生成的Class文件就可以做为Servlet来运行了。简单示例:

import java.io.*;
   import java.util.*;
   import javax.servlet.http.*;
   import javax.servlet.*;
   
//导入必要的包

   public class HelloServlet extends HttpServlet {
          
//所有Servlet必须从HttpServlet派生
     public void doGet (HttpServletRequest req, HttpServletResponse res)
     throws ServletException, IOException
     
//doGet()是这个Servlet的核心,真正处理请求的地方
   {
   res.setContentType("text/html");
     
//设置相应的类型为text/html
   PrintWriter pw = res.getWriter();
     
//从HttpServletResponse得到输出流

   pw.println("");
   pw.println("");
   pw.println("");
   pw.println("<!-- The Servlet expression tags interpolate script variables into the HTML --&gt");
   pw.println("Hello, world!");
   pw.println("");
   pw.println("");
   pw.println("

Hello, world!

");
   pw.println("");
    //上面的语句都是向客户端打印HTML文本
   pw.close();
   
//关闭HttpServletResponse,使Web服务器知道相应结束
  }
  public HelloServlet() {}
//构造函数,可以不要
 }

102 Servlet的应用实例

10.2.1 Servlet与表单交互的方法

表单是HTML中使用最广泛的传递信息的手段。搞清楚Servlet与表单的交互,就在客户端与服务器之间架起了一座桥梁。Servlet使用HttpServlet类中的方法与表单进行交互。在HttpServlet类中有几个未完全实现的方法,你可以自己定义方法的内容,但是必须正确使用方法名称以使HTTP Server把客户请求正确的映射到相应的函数上。  doHeader 用于处理HEADER请求  doGet 用于处理GET请求,也可以自动的支持HEADER请求  doPost 用于处理POST请求  doPut 用于处理PUT请求  doDelete 用于处理DELETE请求  HttpServletService方法,当它接收到一个OPTIONS请求时,它会自动调用doOptions方法,当接收到一个TRACE请求时调用doTraceDoOptions默认执行方式是自动决定什么样的HTTP被选择并返回哪个信息。  在使用这些方法时必须带两个参数。第一个包含来自客户端的数据HttpServletRequest。第二个参数包含客户端的相应HttpServletResponse

一个HttpServletRequest对象提供请求HTTP头部数据,也允许获取客户端的数据。怎样获取这些数据取决于HTTP请求方法。  不管何种HTTP方式,都可以用getParameterValues方法返回特定名称的参数值。

HttpServletRequest,HttpServletResponse接口分别继承于ServletRequestServletResponse接口,getParameterValuesgetWriter方法都是其祖先接口中的方法)  对于HTTP GET请求的方式,getQueryString方法将会返回一个可以用来解剖分析的参数值。  对于用HTTP POSTPUTDELETE请求的方式,HttpServletRequest有两种方法可以选择:如果是文本数据,你能通过getReader的方法得到BufferedReader获取数据;如果是二进制数据,可以通过getInputStream方法得到ServletInputStream获取数据。  为了相应客户端,一个HttpServletResponse对象提供返回数据给用户的两个方法:一种是用getWriter方法得到一个PrintWriter,用于返回文本数据;另一种方法是用getOutputStream方法得到ServletOutputStream,用于返回二进制数据。在使用WriterOutputStream之前应先设置头部(HttpServletResponse中有相应的方法),然后用WriterOutputStream将相应的主体部分发给用户。完成后要关闭WriterOutputStream以便让服务器知道相应已经结束。

例:PrintWriter out = response.getWriter();     out.println("Request URI: " + request.getRequestURI()+"
");
      

我们知道在同一台机器上,所有的编码方式都是一样的,一般中文平台是gb2312,英文平台是ISO-8859-1,但是网络上的两台机器并不能保证他们的编码方式都是一样的,这时候就有可能出现乱码的问题。在进行HTTP网络传输的时候,统一采用的编码方式是ISO-8859-1,这时候如果还是按照本地编码来传输就会出现问题,这也是Servlet在实现网络传输的时候一个不完美的地方,它不会自动进行本地编码到ISO-8859-1的转换,所以直接打印的话就会出现乱码。原理上讲任何出现打印字符串的地方,都是需要进行编码转换的,但是西文字符在不同字符集下对应相同的编码,以在打印西文字符的时候就不需要转换了。在Servlet后继的规范中可能会改变这种麻烦的状况。不同的是,从网络提交的表单数据,Servlet是自动把它转换成本地编码的,所以程序中得到的name字符串变量是gb2312编码的,同样需要进行转换后才能在客户端正确打印。  字符编码转换常用的方法是  String native_encoded = "中文字符串";             //本地编码的字符串  Byte[] byte_array = native_encoded.getBytes();             //得到本地编码的字节数组  String net_encoded = new String(native_encoded, "ISO-8859-1");             //生成ISO-8859-1编码的字符串

例:out.println(new String(new String("

你的姓名: ").getBytes(),"ISO-8859-1"));

10.2.3 Servlet控制会话

会话状态的维持是开发Web应用所必须面对的问题,有多种方法可以来解决这个问题,如使用Cookieshidden类型的表单域,或直接把状态信息加到URL中等,还有Servlet本身提供了一个HttpSession接口来支持会话状态的维持,在这里我们主要介绍基于这个接口的会话状态的管理。

Session的发明是为了填补HTTP协议的局限。请注意HTTP协议是如何工作的--用户发出请求,服务器作出响应,这种用户端和服务器端的联系就是离散的,非连续的。HTTP协议不能提供允许服务器跟踪用户请求的功能。在服务器端完成响应用户的请求之后,服务器不能继续与该浏览器继续保持连接。从服务器这端来看,每一个请求都是独立的,因此HTTP协议被认为是无状态协议,当用户在多个主页间切换时,服务器无法知道他的身份。Session的出现就是为了弥补这个局限。利用Session,您就可以当一个用户在多个主页间切换的时候也能保存他的信息。这样很多以前根本无法去做的事情就变得简单多了。
在访问者从到达某个特定的主页到离开为止的那段时间,每个访问者都会单独获得一个Session  Java Servlet定义了一个HttpSession接口,实现的Session的功能,在Servlet中使用Session的过程如下:   1

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7558084/viewspace-1002580/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7558084/viewspace-1002580/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值