您的位置:寻梦网首页编程乐园Java天地小龙亭之JSP实践之旅
小龙亭之JSP实践之旅
主页入门EJBJ2EE平台JSP编程译文工具JavaAppServerWeb数据库XML手记小亭

实践之旅的序言
JSP概况
JSP内幕
JSP官方白皮书
关于Java在国内外的地位
JSP语法介绍
2001年度Java最佳技术和产品
JSP入门介绍
新浪网 3种Web技术-PHP
新浪网 3种Web技术-ASP
新浪网 3种Web技术-JSP
JSP从入门到精通
JSP入门手册
关于PHP的前景
对一个java项目的反思
ASP/PHP/JSP大比拼
JSP/ASP比较1
JSP/ASP比较2
Duke的快乐世界
更多Duke
更新小札

jsp简介


作者:nixinzhong 2000-07-22


  一、 什么是JSP
  
   JSP是JavaServer Pages的简称。是将纯JAVA代码镶嵌在HTML中实现动态功能的一种技术。在 Sun 正式发布 JSP(JavaServer Pages) 之后,这种新的 Web 应用开发技术很快引起了人们的关注。 JSP 为创建高度动态的 Web 应用提供了一个独特的开发环境。按照 Sun 的说法, JSP 能够适应市场上包括 Apache WebServer 、 IIS4.0 在内的 85% 的服务器产品。即使您对 ASP “一往情深”,我们认为,关注 JSP 的发展仍旧很有必要
  
  二、JSP与ASP的比较
  JSP 与 Microsoft 的 ASP 技术非常相似。两者都提供在 HTML 代码中混合某种程序代码、由语言引擎解释执行程序代码的能力。在 ASP 或 JSP 环境下, HTML 代码主要负责描述信息的显示样式,而程序代码则用来描述处理逻辑。普通的 HTML 页面只依赖于 Web 服务器,而 ASP 和 JSP 页面需要附加的语言引擎分析和执行程序代码。程序代码的执行结果被重新嵌入到 HTML 代码中,然后一起发送给浏览器。 ASP 和 JSP 都是面向 Web 服务器的技术,客户端浏览器不需要任何附加的软件支持。
  ASP 的编程语言是 VBScript 之类的脚本语言, JSP 使用的是 Java ,这是两者最明显的区别。此外, ASP 与 JSP 还有一个更为本质的区别:两种语言引擎用完全不同的方式处理页面中嵌入的程序代码。在 ASP 下, VBScript 代码被 ASP 引擎解释执行;在 JSP 下,代码被编译成 Servlet 并由 Java 虚拟机执行,这种编译操作仅在对 JSP 页面的第一次请求时发生。
  三、JSP运行环境
  
  为了实验JSP技术,首先需要建立运行环境,这个过程相当简单:
  1、在 < A href="http://java.sun.com/jdk/处下载JDK(Java" target="_NEW">http://java.sun.com/jdk/处下载JDK(Java< /A> 2 SDK、Standard Edition、v 1.2.2)。
  2、在< A href="http://java.sun.com/products/jsp/处下载JSWDK(JavaServer" target="_NEW">http://java.sun.com/products/jsp/处下载JSWDK(JavaServer< /A> Web Development Kit 1.0.1)。Linux用户可以在< A href="http://jakarta.apache.org/处下载Tomcat" target="_NEW">http://jakarta.apache.org/处下载Tomcat< /A> 3.0。 
  3、安装 
  以Windows NT环境为例,JDK的安装是首先运行下载得到的jdk1_2_2-win.exe,然后修改系统环境参数,在PATH参数中加入[x:]\jdk1.2.2\bin以及增加新的环境参数 CLASSPATH=[x:]\jdk1.2.2\lib\tools.jar,其中[x:]是安装JDK的硬盘符(c:、d: 等)。 JSWDK的安装仅需将jswdk1_0_1-win.zip带目录释放到硬盘根目录下(c:\、d:\ 等),然后就可以在硬盘上找到\jswdk-1.0.1\目录。将来如果不想保留JSWDK,删除这个目录就可以了,没有任何系统文件和注册表遗留问题。更详细的安装过程以及Solaris/Unix和Linux下JDK、Tomcat的安装可以参考下载得到的文件包中的安装说明。 
  4、启动 
  以Windows NT环境为例,在\jswdk-1.0.1\目录下执行startserver.bat,就可启动JSWDK中一个支持JSP网页技术的Web服务器。为了不与现有的Web服务器(例如IIS、PWS等)冲突,JSWDK的Web服务器使用了8080端口。在浏览器的地址栏中键入< A href="http://localhost:8080或者http://127.0.0.1:8080后,如果能看到" target="_NEW">http://localhost:8080或者http://127.0.0.1:8080后,如果能看到< /A> JSWDK 的欢迎页就说明JSP实验环境已经建成,可进入下一步实验。要关闭Web服务器则运行stopserver.bat。
  
   四、一个简单的JSP例子
  < HTML>
    < HEAD>< TITLE>JSP 页面 < /TITLE>< /HEAD>
    < BODY>
    < %@ page language="java" %>
    < % String str="0"; %>
    < % for (int i=1; i < 10; i++) {
    str = str + i;
    } %>
    JSP 输出之前。 
    < P>
    < %= str %>
    < P>
    JSP 输出之后。 
    < /BODY>
   < /HTML>
  >
     这个 JSP 页面可以分成几个部分来分析。 
  首先是 JSP 指令。它描述的是页面的基本信息,如所使用的语言、是否维持会话状态、是否使用缓冲等。 JSP 指令由 < %@ 开始, %> 结束。在本例中,指令“ < %@ page language="java" %> ”只简单地定义了本例使用的是 Java 语言(当前,在 JSP 规范中 Java 是唯一被支持的语言)。 
  接下来的是 JSP 声明。 JSP 声明可以看成是定义类这一层次的变量和方法的地方。 JSP 声明由 < %! 开始, %> 结束。如本例中的“ < % String str="0"; %> ”定义了一个字符串变量。在每一项声明的后面都必须有一个分号,就象在普通 Java 类中声明成员变量一样。 
  位于 < % 和 %> 之间的代码块是描述 JSP 页面处理逻辑的 Java 代码,如本例中的 for 循环所示。 
  最后,位于 < %= 和 %> 之间的代码称为 JSP 表达式,如本例中的“ < %= str %> ”所示。 JSP 表达式提供了一种将 JSP 生成的数值嵌入 HTML 页面的简单方法。 
  
   
五、如何使用Beans
  
  JSP网页吸引人的地方之一就是能结合JavaBean技术来扩充网页中程序的功能。 JavaBean是一种Java类 (class),通过封装属性和方法成为具有某种功能或者处理某个业务的对象。JavaBean被组织成为package(数据包)以便进行管理,实际上就是把一组JavaBean一起放在某某目录中,每个类的定义前加上package某某,本例中为test。目录test必须放在系统环境CLASSPATH包含的目录下,系统才能找到其中的JavaBean。JSWDK在缺省状态下将\jswdk-1.0.1\webpages\WEB-INF\jsp\beans\ 加入CLASSPATH。建立自己的JavaBean和package时,就放在这个目录中也不失为一种简易的方法。
  下面介绍一个简单的JavaBean框架。用文本编辑器创建一个文本文件helloWorld.java,并保存在\jswdk-1.0.1\webpages\WEB-INF\jsp\beans\test目录下,其内容如下: 
  package test; 
  public class helloWorld { 
   public String name = "My first bean"; 
   public String getHi() 
   { 
   return "Hello from " + name; 
   } 
  } 
  helloWorld.java编辑好后,在DOS状态下,进入目录\jswdk-1.0.1\webpages\WEB-INF\jsp\beans\,用JDK的javac命令编译helloWorld.java如下:
  javac helloWorld.java
  注意,Java是区分大小写的,在程序中,编译命令行中字母的大小写都不能写错。编译成功就表示建立了一个JavaBean。下面看如何在JSP中使用这个JavaBean。用文本编辑器创建一个文本文件hi-bean.jsp,并保存在\jswdk-1.0.1\webpages\test目录下,其内容如下: 
  〈html> 
  〈head> 
  〈title>JavaBean 试验〈/title> 
  〈/head> 
  〈body> 
  〈jsp:useBean id="helloBean" scope="session" class="test.helloWorld" /> 
  〈%= helloBean.getHi() %> 
  〈hr> 
  〈% 
   helloBean.name = "JSP"; 
   out.print(helloBean.getHi()); 
  %> 
  〈/body> 
  〈/html> 
  在JSP网页中,使用 〈jsp:useBean ... />语法来创建JavaBean对象,并命名为helloBean。读者可从这个简单的例子中看出设置、获取JavaBean属性,以及调用JavaBean方法的做法。在浏览器的地址栏中键入< A href="http://localhost:8080/test/hi-bean.jsp,得到结果如图3所示。注意,如果修改和重新编译了JavaBean程序,则需要关闭和重新启动JSWDK的Web服务器以后修改的结果才会有效。如果仅仅修改JSP文件,则不用重新启动JSWDK的Web服务器。" target="_NEW">http://localhost:8080/test/hi-bean.jsp,得到结果如图3所示。注意,如果修改和重新编译了JavaBean程序,则需要关闭和重新启动JSWDK的Web服务器以后修改的结果才会有效。如果仅仅修改JSP文件,则不用重新启动JSWDK的Web服务器。< /A>
  虽然,这仅仅完成了一个非常简单的JavaBean框架,但是遵循这个框架可以设计出多种多样的JavaBean。例如,从JSP中访问数据通常就是通过JavaBean来实现的。
  六、如何实现翻页
  实现翻页的beans原代码
  package commonmodul;
  import java.lang.*;
  import java.sql.*;
  import java.math.*;
  import oracle.jdbc.*;
  
  public class Pages
  {
   int m_rows=10; //every page rows
   int pages;
   public void SetRows(int rows)
   {
   m_rows=rows;
   }
   public int GetPages(int rowcounts)
   {
   int test;
   test = rowcounts%m_rows;
   if(test==0)
   pages = rowcounts/m_rows;
   else
   pages=rowcounts/m_rows+1;
   return pages;
   }
   public ResultSet GetPageSet(ResultSet rs,int CurPage)
   {
   if(CurPage==1)
   return rs;
   int i=0;
   try
   {
  
   while (rs.next ())
   {
   i=i+1;
   if( i>=((CurPage-1)*m_rows))
   break;
   }
   return rs;
   }
   catch(Exception e)
   {
   System.out.println(e.getMessage());
   e.printStackTrace();
   }
   return rs;
   }
  
  
  }
  实现翻页的html代码:
  < %@ include file="gconnection.jsp" %>
  < body bgcolor="#CCFFFF">
  < jsp:useBean id="m_pages" class="commonmodul.Pages" scope="page"/>
  
  < div align="center">
  < % 
  String curpage=request.getParameter("curpage");
  if (curpage==null)
  curpage="1";
  
  Statement stmt = conn.createStatement ();
   Statement stmtcount=conn.createStatement ();
   
  String countsql="select count(*) as countstr from cicp_dict_category";
   ResultSet countset=stmtcount.executeQuery (countsql);
   ResultSet rset = stmt.executeQuery ("select * from cicp_dict_category");
   countset.next ();
   int resultcounts= countset.getInt ("countstr");
   m_pages.SetRows (10);
   int totalpages=m_pages.GetPages (resultcounts);
   ResultSet pagerd=m_pages.GetPageSet (rset,Integer.parseInt(curpage)) ;
   // System.out.println (totalcount);
   out.println (totalpages);
  
  %>
  
  
   < p>分类表< /p>
  < form name="pageform" method="post">
   < table width="75%" border="1px" cellspacing="0" cellpadding="0">
   < tr>
   < td>1< /td>
   < td>2< /td>
   < td>3< /td>
   < td>4< /td>
   < td>5< /td>
   < td>6< /td>
   < /tr>
   < tr>
  < % int i=0; %>
  < % while (rset.next ()){ %>
   < td> < % out.println (rset.getString ("category_id"));%>< /td>
   < td> < % out.println (rset.getString ("category_pid"));%>< /td>
   < td> < % out.println (rset.getString ("category_name"));%>< /td>
   < td> < % out.println (rset.getString ("category_class"));%>< /td>
   < td> < % out.println (rset.getString ("category_order"));%>< /td>
   < td> < % out.println (rset.getString ("topic_count"));%>< /td>
   < /tr>
   < %i=i+1;
   if (i>=10)
   break;
   }
   stmt.close ();
   conn.close (); 
   %>
   < /table>
   < p> 
   < select name="pagenum" onChange="newPage(this)">
   < option selected >选择页< /option>
   < % int pagei;
   for(pagei=1;pagei< =totalpages;pagei++)
   {
   %> 
   < option value=< %out.print(pagei); %> >< %out.print(pagei); %>页< /option>
   < % }%> 
   < /select>
   < /p>
  < /div>
  < /form>
  < /body>
  < /html>
  七、如何连接数据库
  下面是一个叫做gconnction.jsp的文件,文件的代码内容如下:
  < %@ page import="java.sql.*"%>
  < %@ page import="java.net.*" %>
  < %@ page import="java.math.*"%>
  < %@ page import="oracle.jdbc.driver.*"%>
  < % 
  DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver ());
  Connection conn=DriverManager.getConnection ("jdbc:oracle:thin:@192.168.0.62:1521:orc1", "gqw", "1234");
  %>
   这是一个连接oracle数据库的例子。
   
   八、如何操作结果集
  example:
  < %@ include file="../gconnection.jsp"%>
  < html>
  < head>
  < title>论坛标题< /title>
  < meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  < link rel="stylesheet" href="../css/style2.css" type="text/css">
  < /head>
  < BODY bgColor=#FFFFFF border="0">
   < table width="100%" border="0" cellspacing="0" cellpadding="0">
   < tr bgcolor="#000000"> 
   < td>
   < table align=center border=0 cellpadding=0 cellspacing=1 width="100%">
   < tbody> 
   < tr> 
   < td height="23px" bgcolor="#348898">
   < table width="100%" border="0" cellspacing="0" cellpadding="0">
   < tr>
   < td width="22%">< img height=16 src="../images/menu_next.gif" width=16>< /td>
   < td width="78%"> < b>< a href="../userreg/reg_modi.jsp" target=right>< font color=#ffffff>修改注册信息< /font>< /a>< /b>< /td>
   < /tr>
   < /table>
   < /td>
   < /tr>
   < tr> 
   < td height="23px" bgcolor="#348898"> 
   < table width="100%" border="0" cellspacing="0" cellpadding="0">
   < tr>
   < td width="23%">< img height=16 src="../images/menu_next.gif" width=16>< /td>
   < td width="77%"> < a href="bbs_welcome.jsp" target=right>< b>< font color="#FFFFFF">国情论坛 < /font>< /b>< /a>< /td>
   < /tr>
   < /table>
   < /td>
   < /tr>
   < %Statement stmt = conn.createStatement();
   ResultSet rset = stmt.executeQuery ("select * from cicp_bbs_subject");%>
   < %while (rset.next()) 
   { %>
   < %String subject_name=rset.getString("subject_name");%>
   < tr class=size4 style="COLOR: #ffffff" bgcolor="#FFFFFF"> 
   < td height=25> 
   < p> < img height=15 src="../images/slogo.jpg" width=16>< a href="bbs_right.jsp?id=< %=rset.getString("subject_id")%>&name=< %=URLEncoder.encode(subject_name)%>" target="right">< font color="blue">< %=subject_name%>< /a>< /p>
   < /td>
   < /tr>
   < % } 
   stmt.close();%>
   < tr> 
   < td height=23 bgcolor="#348898">
   < table width="100%" border="0" cellspacing="0" cellpadding="0">
   < tr>
   < td width="24%"> < img height=16 src="../images/menu_stop.gif" width=16>< /td>
   < td width="76%"> < b>< a href="bbs_exit.jsp" target=_parent>< font color="#FFFFFF">退出< /font>< /a>< /b>< /td>
   < /tr>
   < /table>
   < /td>
   < /tr>
   < /tbody>
   < /table>
   < /td>
   < /tr>
  < /table>
  < /BODY>
  < /html>
  九、如何使用Session
  
  example1
  < %@ include file="../gconnection.jsp"%>
  < html>
  < head>
  < title>用户登录< /title>
  < meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  < /head>
  < table width="100%" border="0" cellspacing="0" cellpadding="0" height="250px">
   < %Statement stmt = conn.createStatement();
   String user_id=request.getParameter("user_id");
   String user_pw=request.getParameter("pw");
   String sql="select user_id,user_password from cicp_member_user where user_id='"+user_id+"' and 
  
  user_password='"+user_pw+"'";
   ResultSet rset = stmt.executeQuery (sql);%>
   < % if (rset.next()) { %> 
   < % 
   String userid="";
   String userpw="";
   session.putValue("userid",user_id);
   response.sendRedirect("bbs/bbs_default.jsp");%>
  < % } else {
   response.sendRedirect("userreg/error.htm");%>
   < % }
   stmt.close();%>
  < /table>
  < /body>
  < /html>
  
  example2
  < %@ include file="../gconnection.jsp"%>
  < jsp:useBean id="pages" class="commonmodul.Pages" scope="page"/>
  < html>
   < head>
   < link rel="stylesheet" href="../css/style2.css" type="text/css">
   < /head>
   < % String pubid=request.getParameter("id");%>
   < % String name=request.getParameter("name");%>
   < script language="JavaScript">
   function newPage(list){
   if (list.selectedIndex != 0){
   //var pubid=document.form1.pubid.value
   //var name=document.form1.name.value
   var goto_here = list.options[list.selectedIndex].value;
   document.form1.curpage.value=goto_here
   //var goto_page = "bbs_right.jsp?curpage="+goto_here+"&id="+pubid+"&name="+name;
   document.form1.action="bbs_right.jsp"
   //window.location.href=goto_page;
   document.form1.submit();
   }
  }
  function checkInp()
  {//检查输入字串是否少于3(包括为空) 
  if(document.search.search_text.value=="")
  { 
   alert("你什么也没有输入嘛!"); 
   return false; 
   } 
  if(document.search.search_text.value.length< 3)
  { alert("请至少输入三个字符!");
   return false; } 
   return true; }
   //-->
   < /script> 
   < BODY bgColor=#FFFFFF border="0">
   < table width="100%" border="0" cellspacing="0" cellpadding="1px">
   < tr bgcolor="#000000"> 
   < td>
   < table border=0 cellpadding=0 cellspacing=0 width="100%">
   < tbody> 
   < tr bgcolor="#FFFFFF"> 
   < td height="20px" width="26%"> 
   < div align="left">当前登录者: 
   < %
   String aa=(String)session.getValue("userid");%>
   < %
   if ( aa=="" ) {
   %> 匿名用户 
   < /div>
   < /td> 
   < td height="20px" width="10%"> < /td>
   < !-- 这一行不能缺少,不然操作返回信息都竖起来了 -->
   < td align=left height="20px" width="41%">
   当前栏目--< b>< %=name%>< /b>
   < /td>
   < td width="23%" align="right" >< a href="../userreg/default.jsp" target="_parent">马上注册/立即登录< /a>< /td>
   < %} else {
   out.println(aa);
   %>< /div>
   < /td> 
   ………
   < /tr>
   < /TBODY> 
  < /table>
   < /body>
  < /html>
  
  example3
  
  < HTML>
  < HEAD>
  < META NAME="GENERATOR" Content="NetObjects ScriptBuilder 3.0">
  < META HTTP-EQUIV="Content-Type" content="text/html; charset=iso-8859-1">
  < TITLE>release-session< /TITLE>
  < /HEAD>
  < BODY>
  < % session.invalidate();%>
  < % response.sendRedirect("userreg/default.jsp");%>
  < /BODY>
  < /HTML>
  采用PHP的网站如新浪网(sina)、中国人(Chinaren)等,但由于PHP本身存在的一些缺点,使得它不适合应用于大型电子商务站点,而更适合一些小型的商业站点。

  首先,PHP缺乏规模支持。其次,缺乏多层结构支持。对于大负荷站点,解决方法只有一个:分布计算。数据库、应用逻辑层、表示逻辑层彼此分开,而且同层也可以根据流量分开,组成二维阵列。而PHP则缺乏这种支持。还有上面提到过的一点,PHP提供的数据库接口支持不统一,这就使得它不适合运用在电子商务中。

  ASP和JSP则没有以上缺陷,ASP可以通过Microsoft Windowsd的COM/DCOM获得ActiveX规模支持,通过DCOM和Transcation Server获得结构支持;JSP可以通过SUN Java的Java Class和EJB获得规模支持,通过EJB/CORBA以及众多厂商的Application Server获得结构支持。

  三者中,JSP应该是未来发展的趋势。世界上一些大的电子商务解决方案提供商都采用JSP/Servlet。比较出名的如IBM的E-business,它的核心是采用JSP/Servlet的Web Sphere;西方另外一个非常著名的电子商务软件提供商,Intershop,它原来的产品Intershop1,2, 3, 4占据了主要的电子商务软件份额。 

  它们都是通过CGI来提供支持的。但去年10月后它推出了Enfinity,一个采用JSP/Servlet的电子商务Application Server,而且声言不再开发传统软件。

  总之,ASP,PHP,JSP三者都有相当数量的支持者,由此也可以看出三者各有所长。正在学习或使用动态页面的朋友可根据三者的特点选择一种适合自己的语言。        

小龙亭工作室 Blueski   CopyLeft: 2000/9