随笔 - 100  文章 - 50  trackbacks - 0
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿(3)

随笔分类

随笔档案

文章分类

文章档案

收藏夹

我收藏的一些文章!

搜索

  •  

最新评论

阅读排行榜

评论排行榜

1. 什么是 JSP
       JSP
简单来说就是在一个网页中利用 <%%> 来嵌套 JAVA 程序片。例如:

<%@ page contentType="text/html;charset=GB2312" %>

<HTML>

<BODY >

<%

    out.println(" 这是一个 JSP 页面。 ");

%>

</BODY>

<HTML>

2. JSP 运行机制:

       JSP 把静态页面交割客户的浏览器负责显示,动态部分( java 程序片)由服务器运行,把结果交给浏览器显示,每个用户分配一个线程。

在执行 JSP 文件时,服务器应用程序会自动将 JSP 文件转换为 Servlet 文件(即 java 文件),然后加以编译成为可执行的 Class (字节码文件),所以 JSP 在第一次执行的时候没有直接用 Servlet 快,但 JSP 几乎可以实现 Servlet 的所有功能,其优点是比 Servlet 更易维护,利用 JSP+JavaBean 的模式完全可以实现动态和静态的分离,大大提高程序可读性,而且一般网站第一运行往往是在测试阶段,之后当客户访问时已经是转换完的 Servlet 文件了,因此 JSP Servlet 更具优点,另外 JSP 也可以很容易的和 Servlet 结合。

3. JSP 语法:

       3.1 JSP 的结构:

              一个 JSP 文件一般是由五部分组成:

<!--[if !supportLists]-->(1)       <!--[endif]-->普通的HTML标记符。

<!--[if !supportLists]-->(2)       <!--[endif]-->JSP标签。

<!--[if !supportLists]-->(3)       <!--[endif]-->变量和方法声明。

<!--[if !supportLists]-->(4)       <!--[endif]-->Java程序片。

<!--[if !supportLists]-->(5)       <!--[endif]-->Java表达式。

其中后三条被成为 JSP 的脚本部分。

       3.2 JSP 的语法:

              3.2.1 变量的声明:

1 )在“ <%! %> ”之间声明变量或方法。其中变量和方法可以是 Java 中的任何变量。其作用范围是整个 JSP 文件。当多个用户访问这个页面时,他们将共享这些变量,任何对变量的修改都会直接影响到其他用户。这些变量只有服务器关闭时才会释放。

例如这个例子就是利用此方法声明的变量,实现了访问网页计数功能:

<%@ page contentType="text/html;charset=GB2312" %>

<HTML>

<BODY BGCOLOR=cyan><FONT size=1>

  <%!int i=0;

  %>

  <%i++;

  %>

<P> 您是第

   <%=i%>

  个访问本站的客户。

</BODY>

</HTML>

 

另外,如果用这个方法来声明方法,则其中方法是在整个 JSP 页面有效,但在该方法中声明的变量为局部的,只在该法中有效调用完毕时即释放。而用户往往会调用方法来修改某个变量或直接修改变量,所以,在应用这种方法声明变量时当你要试图修改某个数据,尽量加上关键字 synchronized 以实现同步锁定,防止同时修改变量。

利用该方法声明的类,也是在 JSP 页面内有效,可以在其范围内使用该类的对象,具体方法和前面的一样。

2 )在“ <% %> ”之间声明变量和方法。为局部变量和方法,可以简单的理解为非共享变量,即每个客户都有自己的变量,他们的操作不会影响到其他人,程序执行完内存自动释放。大多的 Java 程序片是放在这里的。

3 )笔者的简易,尽量不要在 JSP 中过多使用前两种方式来进行动态操作,应该尽量使用 JavaBean 来操作,尽量做到静态页面和动态页面相分离,这也是为什么要用 JSP 替代 Servlet 的优点。

 

3.2.2 JSP 中的注释:

                     (1) HTML 注释: ”<!-- -->” 之间的为注释。

                     (2)JSP 注释:在 ”<%-- --%>” 之间的为注释。

 

              3.2.3 JSP 中的指令标签:

                     3.2.3 .1 page 指令标签

(1)page 指令用来指定整个页面的一些属性和这些属性的值。

                  指令格式 : <%@ page 属性 1=” 属性 1 的值 属性 2=” 属性 2 的值 ”…%>

例如: <%@ page contentType="text/html; charset=gb2312" %> 可以指定页面显示汉语。

(2) import 指令可以指定多个值,为导入 JAVA 类库。

例如: <%@ import="java.sql.*",”java.awt.*” %>

(3) language 属性 : 默认为 JAVA ,目前也只支持 JAVA

例如: <%@ page language=”java”%>

(4) contentType 属性:用来指定 JSP 页面的编码,默认属性为 ”text/html;

                   charset=ISO-8859-1”

                         (5) session 用于设置是否要使用内置的 session 对象。默认为 true

(6) buffer 内置输出流对象负责将服务器的某些信息或运行结果发送到客户端显示可以不设置,默认为 8kb

           (7) 指定 out 的缓冲区被填满时,缓冲区是否自动判断。默认为 true

           (8) isThreadSafe 属性用来设置页面是否可多线程访问。默认为 true

           (9) info 属性为 JSP 页面准备一个字符串,属性值为字符串。

    例: <%@ page info=”we are students”%> 可用 getServletInfo() ;获得。

一个综合应用:

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>

其中 errorPage 是发生错误后应该转到的异常处理的页面

       3.2.3 .2 include 指令标签

(1)<%@ include file=”filename”%> 要注意在引用的文件中含有类似 page contentType 属性设置,则此文件不要设置,否则会报错。

(2) 可作为动作标签 , 其格式为 :<jsp:include page=”fileName”/> 功能:可动态包含一个文件,即在执行时才对这个文件进行包含,并且可以随时修改包含文件,改后相应结果即发生变化,而静态的引用只能重新编译。

                     3.2.3 .3 其他标签 :

(1) param 标签:以“名字-值”对应的形式为其他标签提供附加信息。这个标签与 jsp:include jsp:forward jsp:plugin 标签一起使用。

格式为: <jsp:param name=” 名字 ”, value=” 指定给 param 的值 ”>

该标签主要功能是和 include 标签连用,可以达到给加载文件传递参数的作用。

例:

tom.jsp

<%@ page contentType="text/html;charset=GB2312" %>

<HTML>

<BODY>

    <%  String str=request.getParameter("computer"); // 获取值。

         int n=Integer.parseInt(str);

         int sum=0;

         for(int i=1;i<=n;i++)

            { sum=sum+i;

            }

    %>

<P>

   1 <%=n%> 的连续和是:

<BR>

  <%=sum%>

</BODY>

</HTML>

 

Mc1035.jsp

<%@ page contentType="text/html;charset=GB2312" %>

<HTML>

<BODY>

<P> 动态加载文件并传递参数效果:

   <jsp:include page="tom.jsp">

     <jsp:param name="computer" value="300" />

   </jsp:include>

</BODY>

</HTML>

这样在引用 tom.jsp 的同时就把参数 computer 的值传了过去,要注意名称要与 tom.jsp 里的 request.getParameter("computer"); 的一直。

(2)plugin 动作标签 : 用来保证客户可以执行 applet 小程序。该标签只是 JSP 页面加载 Java plugin ,该插件负责客户下载,并使用该插件来运行 Java applet

例:

<%@ page contentType="text/html;charset=GB2312" %>

<HTML>

<BODY>

<jsp:plugin type="applet" code="B.class"  jreversion="1.2" width="200" height="260" >

     <jsp:fallback>

        Plugin tag OBJECT or EMBED not supported by browser.

     </jsp:fallback>

</jsp:plugin>

</body></html>

当客户访问上述 JSP 页面时,将导致登陆 Sun 公司下载 Java plugin 。并执行 B.class

笔者认为现在很少有人用 applet 程序了,大多用 JS

                     3.2.3 .4 useBean 动作标签

                            这个标签是笔者认为最重要的标签,所以放在了最后。

                            首先介绍 Java Bean 的特点:

可以实现代码服用,易编写,易维护,易使用,可以在任何有 JVM 的机器上使用而不许重新编译。

1. 编写 JavaBean 的规则:

(1) 如果类的成员变量的名字是 xxx ,那么为了更改或获取成员变量的值在类中可以定义两个方法:

getXxx() 来获取属性和 setXxx ()来设置属性,要注意大小写。

(2) 对于 boolean 类型的成员变量,允许使用 is 来代替 get set

(3) 类中的方法属性必须是 Public 的。

(4) 类中如果有构造方法,那么这个构造方法也是 public 的,并且是无参数的。

例:一个简单 bean

Circle.java

import java.io.*;

public class Circle 

{ int radius;

  public Circle()

     { radius=1;

     }

  public int getRadius()

     { return radius;

     }

  public void setRadius(int newRadius)

     {radius=newRadius;

     }

  public double circleArea()

     {return Math.PI*radius*radius;

     }

  public double circlLength()

     {return 2.0*Math.PI*radius;

     }

}

 

2. 使用 beans

使用 beans 时就要用到 useBean 标签了,其格式为:

<jsp:useBean id=-“ bean 起的名字 ”class=” 创建 beans 的类 ”scope=”bean 有效范围 ”>

</jsp:useBean>

其中 scope 的属性值需要注意一下:

Scope page :则即当客户使用 bean 时为每个客户占用不同的空间,简单说 bean 是不共享的,用户不能互相干涉。当用户离开该访问页时无效。

Scope session :即该 bean 是共享的,所有用户访问时将对同一个 bean 操作,会互相干涉。当客户关闭浏览器时无效。

Scope request :只当用户访问时有效,且不是共享的。当客户请求时作出相信,相应完后无效。

Scope application :共享 bean ,当服务器关闭时该 bean 无效。

最后,若要使用 bean 还必须导入其类,可用命令:

<@page import=”className”>

例: Circle 为一个类文件名。

useBeans.jsp

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="Circle"%>

<HTML>

<BODY bgcolor=cyan><Font size=1>

   <jsp:useBean id="girl" class="Circle" scope="page" >

   </jsp:useBean>

  <%-- 通过上述 JSP 标签,客户获得了一个作用域是 page ,名字是 girl beans --%>

   <% // 设置圆的半径:

      girl.setRadius(100);

   %>

<P> 圆的半径是:

   <%=girl.getRadius()%>

<P> 圆的周长是:

   <%=girl.circlLength()%>

<P> 圆的面积是:

   <%=girl.circleArea()%>

</BODY>

</HTML>

                                   3 获取和修改 beans 的属性

                                   getProperty setProperty 可完成该命令。

                                   格式分别为:

                                   <jsp:getProperty name=”bean 的名字 ” property=”beans 的属性 ” />

                                   <jsp:setProperty name=”bean 的名字 ” property=”beans 的属性 ” />

                                   一个综合的例子 :

student.jsp

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="Student"%>

<HTML>

<BODY bgcolor=cyan><Font size=1>

   <jsp:useBean id="zhang" class="Student" scope="page" >

   </jsp:useBean>

<jsp:setProperty  name= "zhang"  property="name" value=" 张小三 "  />

<P> 名字是:

<jsp:getProperty  name= "zhang"  property="name"  />

<jsp:setProperty  name= "zhang"  property="number" value="1999001"  />

<P> 学号是:

<jsp:getProperty  name= "zhang"  property="number"  />

<% double height=1.70;

%>

<jsp:setProperty  name= "zhang"  property="height" value="<%=height+0.05%>"  />

<P> 身高是:

<jsp:getProperty  name= "zhang"  property="height"  />

<jsp:setProperty  name= "zhang"  property="weight" value="67.65"  />

<P> 体重是:

<jsp:getProperty  name= "zhang"  property="weight"  />

公斤

</FONT>

</BODY>

</HTML>

4.JSP 内置对象

       4.1 request 对象

       该对象封装了用户提交的信息,主要时表单,表单格式和 HTML 的一样,用法:

       (1)  Request.getParameter(String s);  其中 s 为变量名。

              注意 JSP 的编码问题,大多数可用如下指令实现:

              String str=request.getParameter (“ game ”);

              Byte b[]=str.getBytes(“ISO-8859-1”);

              Str=new String(b);

       (2) getProtocol() 获取客户向服务器提交信息所使用的通信协议。

       (3) getServletPath() 获取客户请求的 JSP 页面文件的目录

(4) getContentLength() 获取提交的整个信息长度。

(5) geMethod() 获取客户提交信息的方式,如 post

(6) getHeader(String s) 获取 HTTP 头文件中有参数 s 指定的头名字的值

(7) getHeaderNames() 获取头名字的一个枚举。

(8) getHeaders(String s) 获取头文件中指定头名字的全部值的一个枚举。

(9) getRemotoAddr() 获取客户 IP 地址。

(10)getRemoteHost() 获取客户机的名称(如果获取不到,就获取 IP 地址)

(11)getServerName() 获取服务器的名称

(12)getServerPort() 获取服务器端口号

(13)getParameterNames() 获取客户提交的信息体部分中 name 参数值的之歌枚举 .

 

Example3_4.jsp:

<HTML>

<BODY bgcolor=cyan><FONT size=1>

<%@ page contentType="text/html;charset=GB2312" %>

   <FORM action="tree2.jsp" method=post name=form>

       <INPUT type="text" name="boy">

       <INPUT TYPE="submit" value="enter" name="submit">

   </FORM>

</FONT>

</BODY>

</HTML>

 

tree2.jsp

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="java.util.*" %>

<MHML>

<BODY bgcolor=cyan>

<Font size=1 >  

<BR> 客户使用的协议是 :

   <% String protocol=request.getProtocol();

      out.println(protocol);

   %>

<BR> 获取接受客户提交信息的页面:

   <% String path=request.getServletPath();

      out.println(path);

   %>

<BR> 接受客户提交信息的长度:

   <% int length=request.getContentLength();

      out.println(length);

   %>

<BR> 客户提交信息的方式:

   <% String method=request.getMethod();

      out.println(method);

   %>

<BR> 获取 HTTP 头文件中 User-Agent 的值::

   <% String header1=request.getHeader("User-Agent");

      out.println(header1);

   %>

<BR> 获取 HTTP 头文件中 accept 的值:

   <% String header2=request.getHeader("accept");

      out.println(header2);

   %>

<BR> 获取 HTTP 头文件中 Host 的值:

   <% String header3=request.getHeader("Host");

      out.println(header3);

   %>

<BR> 获取 HTTP 头文件中 accept-encoding 的值:

   <% String header4=request.getHeader("accept-encoding");

      out.println(header4);

   %>

<BR> 获取客户的 IP 地址:

   <% String  IP=request.getRemoteAddr();

      out.println(IP);

   %>

<BR> 获取客户机的名称:

   <% String clientName=request.getRemoteHost();

      out.println(clientName);

   %>

<BR> 获取服务器的名称:

   <% String serverName=request.getServerName();

      out.println(serverName);

   %>

<BR> 获取服务器的端口号:

   <% int serverPort=request.getServerPort();

      out.println(serverPort);

   %>

<BR> 获取客户端提交的所有参数的名字:

   <% Enumeration enum=request.getParameterNames();

       while(enum.hasMoreElements())

            {String s=(String)enum.nextElement();

             out.println(s);

            }     

      %>

<BR> 获取头名字的一个枚举:

   <% Enumeration enum_headed=request.getHeaderNames();

      while(enum_headed.hasMoreElements())

            {String s=(String)enum_headed.nextElement();

             out.println(s);

            }     

   %>

<BR> 获取头文件中指定头名字的全部值的一个枚举:

   <% Enumeration enum_headedValues=request.getHeaders("cookie");

      while(enum_headedValues.hasMoreElements())

            {String s=(String)enum_headedValues.nextElement();

             out.println(s);

            }     

   %>

<BR>

   <P> 文本框 text 提交的信息:

   <%String str=request.getParameter("boy");

     byte  b[]=str.getBytes("ISO-8859-1");

     str=new String(b);

   %>

 <BR>

   <%=str%>

<BR> 按钮的名字:

   <%String buttonName=request.getParameter("submit");

     byte  c[]=buttonName.getBytes("ISO-8859-1");

     buttonName=new String(c);

   %>

<BR>

   <%=buttonName%>

</Font>

</BODY>

</HTML>

4.2 response 对象

       我认为最主要的属性的是重定向 :

       response.encodeRedirectURL(“ 页面 ”);

       由于篇幅关系,其他的就不介绍了。

4.3 session 对象

(1)public void setAttribute(String key,Object obj)

       Session 对象类似与散列表,可以俺 key 添加值

(2)public Object getAttibute(String key)

       获取 session 对象对应 key 的值

(3)public Enumeration getAttributeNames()

       获取枚举对象遍历 session ,可以用 nextElements ()方法。

(4)public long getCreationTime ()

       Session 对象调用该方法可以获取创建的时间

(5)public long getLastAccessedTime()

       获取当前 session 对象最后一次被操作的时间

(6)public int get MaxInactiveIterval()

       获取当前 session 的生存时间。

(7)public void setMaxInactiveIterval(int n)

       设置 session 对象的生存时间。

(8)public void removeAttribute(String key)

       从当前 session 中删除关键字时 key 的对象

(9)public String getId ()

       获取对象的编号

(10)invalidate

       使 session 无效

4.4 application 对象

(1)public void setAttribute(String key,Object obj)

       application 对象类似与散列表,可以俺 key 添加值

(2)public Object getAttibute(String key)

       获取 application 对象对应 key 的值

(3)public Enumeration getAttributeNames()

       获取枚举对象遍历 application ,可以用 nextElements ()方法。

(4)public void removeAttribute(String key)

       从当前 application 中删除关键字时 key 的对象

(5)public String getServletInfo()

       获取 Servlet 编译器的当前版本的信息。

4.5 out 对象

out 对象使一个数错流,用来向客户输出信息,格式如下:

out.print(Obj); 输出任意对象,不换行。

out.println(Obj); 输出对象换行

out.newLine(); 输出一个换行符

out.flush(); 输出缓冲区里的内容

out.close(); 关闭流

 

5 JSP 里的文件操作和数据库操作

       这里就不再细说了,只提示一下,因为 jsp 的操作其实和 java 的一样,只要把程序放在 beans 里,获 <%%> 里就可以了,如果有不懂的可以参考俺以前发的帖子,里面有详细的介绍,是 java 的,其实都一样,我的网址为 http://blog.csdn.net/mc1035/

下面再给个综合的例子供大家参考:

<!--[if !supportLists]-->(1)    <!--[endif]-->文件上传的例子:

<%@ page contentType="text/html;charset=GB2312" %>

<HTML>

<BODY>

 <P> 选择要上传的文件: <BR>

   <FORM action="accept.jsp" method="post" ENCTYPE="multipart/form-data">

      <INPUT type=FILE name="boy" size="38">

      <BR>

     <INPUT type="submit" name ="g" value=" 提交 "> 

 </BODY>

</HTML>

 

accept.jsp

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import ="java.io.*" %>

<HTML>

<BODY>

  <%try{  InputStream in=request.getInputStream();

          File f=new File("F:/2000","B.txt");

          FileOutputStream o=new FileOutputStream(f);

          byte b[]=new byte[1000];

          int n;

          while((n=in.read(b))!=-1)

               {o.write(b,0,n);

               }

          o.close();

          in.close();

       }

    catch(IOException ee){}

    out.print(" 文件已上传 ");

  %>

</BODY>

</HTML>

<!--[if !supportLists]-->(2)    <!--[endif]-->文件下载的例子

<%@ page contentType="text/html;charset=GB2312" %>

<HTML>

<BODY>

<P> 点击超链接下载 Zip 文档 book.Zip

 <BR>  <A href="loadFile.jsp"> 下载 book.zip

</Body>

</HTML> 

 

loadFile.jsp

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="java.io.*" %>

<HTML>

<BODY>

<% // 获得响应客户的输出流:

    OutputStream o=response.getOutputStream();

   // 输出文件用的字节数组 , 每次发送 500 个字节到输出流:

   byte b[]=new byte[500];

   // 下载的文件:

    File fileLoad=new File("f:/2000","book.zip");

   // 客户使用保存文件的对话框:

   response.setHeader("Content-disposition","attachment;filename="+"book.zip");

   // 通知客户文件的 MIME 类型:

    response.setContentType("application/x-tar");

   // 通知客户文件的长度:

    long fileLength=fileLoad.length();

    String length=String.valueOf(fileLength);

    response.setHeader("Content_Length",length);

   // 读取文件 book.zip, 并发送给客户下载 :

   FileInputStream in=new FileInputStream(fileLoad);

   int n=0;

   while((n=in.read(b))!=-1)

      { o.write(b,0,n);

      }

%>

</BODY>

</HTML>

<!--[if !supportLists]-->(3)    <!--[endif]-->标准化考试

标准化考试系统源代码

ttt.jsp

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import ="java.io.*" %>

<%@ page import ="java.util.*" %>

<%!

  String answer=null;// 存放答案用的字符串。

 // 对字符串进行回压流处理的方法:

public String getString(String content)

  { try{  StringReader in=new StringReader(content) ;// 指向字符串的字符流。

          PushbackReader push=new PushbackReader(in); // 回压流

          StringBuffer stringbuffer=new StringBuffer(); // 缓冲字符串对象。

          int c;

          char b[]=new char[1];             

          while ( (c=push.read(b,0,1))!=-1)// 读取 1 个字符放入字符数组 b

             { String s=new String(b);

              if(s.equals("<"))        // 回压的条件  

               {  push.unread('&');

                  push.read(b,0,1); //push 读出被回压的字符字节 , 放入数组 b.

                  stringbuffer.append(new String(b));

                  push.unread('L');

                  push.read(b,0,1); //push 读出被回压的字符字节 , 放入数组 b.

                  stringbuffer.append(new String(b));

                  push.unread('T');

                  push.read(b,0,1); //push 读出被回压的字符字节 , 放入数组 b.

                  stringbuffer.append(new String(b));

                }

              else if(s.equals(">"))        // 回压的条件  

               {  push.unread('&');

                  push.read(b,0,1); //push 读出被回压的字符字节 , 放入数组 b.

                  stringbuffer.append(new String(b));

                  push.unread('G');

                  push.read(b,0,1); //push 读出被回压的字符字节 , 放入数组 b.

                  stringbuffer.append(new String(b));

                  push.unread('T');

                  push.read(b,0,1); //push 读出被回压的字符字节 , 放入数组 b.

                  stringbuffer.append(new String(b));

               }

              else if(s.equals("\n"))       

               {  stringbuffer.append("<BR>");

               }

              else

               { stringbuffer.append(s);

               }

            }

          push.close();

          in.close();

          return new String(stringbuffer); // 返回处理后的字符串。

      }

    catch(IOException e)

      {return content=new String(" 不能读取内容 ");

      }  

 }

  %>

  <%  String s=request.getParameter("g"); // 获取客户提交的信息(是否重新读取文件)

         if(s==null)

            {s="";

            }

      byte b[]=s.getBytes("ISO-8859-1");

       s=new String(b);

     File f=null;

     FileReader in=null;

     BufferedReader buffer=null;

     Integer number=new Integer(0); // 初始题号。

     Integer score=new Integer(0);// 初始分数。

     if(session.getCreationTime()-session.getLastAccessedTime()==0) // 当第一次请求该页面时,建立和文件的输入流连接。

      {  f=new File("f:/2000","English.txt");

         in=new FileReader(f);

         buffer=new BufferedReader(in);

         // 读入文件的第 1 行:答案

         answer=buffer.readLine().trim();;

         // 将上述 f in buffer 对象保存到用户的 session 对象中:

         session.setAttribute("file",f);

         session.setAttribute("in",in);

         session.setAttribute("buffer",buffer);

        // 再将初始题号保存到 session 对象中:

         session.setAttribute("number",number);

        // 再将用户的初始得分保存到 session 对象中:

         session.setAttribute("score",score);

      }

     if(s.equals(" 重新练习 "))   // 当请求重新读取文件时,建立和文件的输入流连接。

      {  f=new File("f:/2000","English.txt");

         in=new FileReader(f);

         buffer=new BufferedReader(in);

         // 读入文件的第 1 行:答案

         answer=buffer.readLine().trim();

         // 将上述 f in buffer 对象保存到用户的 session 对象中:

         session.setAttribute("file",f);

         session.setAttribute("in",in);

         session.setAttribute("buffer",buffer);

        // 再将初始题号保存到 session 对象中:

         session.setAttribute("number",number);

        // 再将用户的初始得分保存到 session 对象中:

         session.setAttribute("score",score);

      }

      // 读取试题:

       try{ String str=null;

           f=(File)session.getAttribute("file");

           in=(FileReader)session.getAttribute("in");

           buffer=(BufferedReader)session.getAttribute("buffer");

            while((str=buffer.readLine())!=null)

                 { // 为了能显示原始的 HTML 文件或 JSP 文件需使用回压流技术。

                    str=getString(str);

                    if(str.startsWith("**")) // 每个试题的结束标志。

                        {break;

                        }

                   out.print("<BR>"+str);

                }

          }

        catch(IOException e)

          { out.print(""+e);

          }

  %>

  <%String code=response.encodeURL("ttt.jsp");

  %>

<HTML>

<BODY><Font size=1>

 <P><BR> 请选择答案:

 <FORM action="<%=code%>" method="post" name=form>

    <Input type=radio name="r" value="A">A

    <Input type=radio name="r" value="B">B

    <Input type=radio name="r" value="C">C

    <Input type=radio name="r" value="D">D

  <Input type=submit name="submit" value=" 提交答案 ">

 </FORM> 

<% // 当用户提交表单时,获取提交的答案:

   // 判断用户是否提交了答案表单:

    String select=request.getParameter("submit"); // 获取客户提交的答案选择表单

         if(select==null)

            {select="";

            }

       byte c[]=select.getBytes("ISO-8859-1");

      select=new String(c);

   if(select.equals(" 提交答案 "))

    {  String userAnswer=request.getParameter("r");

        if(userAnswer==null)

             { userAnswer="#";

             }

      // 将提交的答案与正确答案进行比较:

      // 首先获取题号:

       Integer num=(Integer)session.getAttribute("number"); 

       int tihao=num.intValue();

       // 获取相应题号的标准答案:

        char correctAnswer='\0';

        try{ correctAnswer=answer.charAt(tihao);

           }

        catch(StringIndexOutOfBoundsException ee)

           { tihao=0;

           }

       // 然后再将题号重新存入 session 对象:

         tihao=tihao+1;

        Integer newNumber=new Integer(tihao);

        session.setAttribute("number",newNumber);

       // 将用户提交的答案与标准答案比较

       char user=userAnswer.charAt(0);

       if(user==correctAnswer)

           { // 给用户增加分值:

             Integer newScore=(Integer)session.getAttribute("score");

             int fenshu=newScore.intValue();

             fenshu=fenshu+1;

             newScore=new Integer(fenshu);

             session.setAttribute("score",newScore);

             out.print(" 您答对了,您现在的得分是: ");

             out.print(""+fenshu);

           }

       else

           { out.print(" 您没有答对,继续努力! ");

             out.print(" 您现在的得分是: "+session.getAttribute("score"));

           }

   }

%>

<P><BR> 点击按钮重新练习:

<FORM action="" method="post" name=form>

    <Input type=submit name="g" value=" 重新练习 ">

 </FORM> 

</FONT>

</BODY>

</HTML>

4 )分页显示记录

        showByPage.jsp :(效果如图 5.28 所示)

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="java.sql.*" %>

<HTML>

<BODY>

 <%! int pageSize=3; // 每页显示的记录数。

     int pageCount=0; // 分页后的总页数。

 %>

<%-- 客户通过表单提交欲要显示的页码数 --%>

<FORM action="" method=get >

  输入页码数 <Input Type=text name=showPage size=4 >

   <Input Type=submit name=g value= 提交 >

 </FORM>

<%  Connection con;

    Statement sql;

    ResultSet rs;

    try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

       }

    catch(ClassNotFoundException e){}

    try { con=DriverManager.getConnection("jdbc:odbc:sun","sa","");

         sql=

con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);

        // 返回可滚动的结果集:

         rs=sql.executeQuery("SELECT * FROM students");

        // 将游标移动到最后一行:

            rs.last();

        // 获取最后一行的行号:

         int lastRow=rs.getRow();

        // 计算分页后的总页数:

        pageCount=(lastRow%pageSize==0)?(lastRow/pageSize):(lastRow/pageSize+1);

        // 当前显示的初始页数:

        int showPage=1;

        // 告知客户总页数:

      %>

        <P> 共有 <%=pageCount%>

        <BR> 每页显示 <%=pageSize%> 条记录 .

      <% // 获取客户想要显示的页数:

          String integer=request.getParameter("showPage");

               if(integer==null)

                  { integer="1";

                  }

           try {showPage=Integer.parseInt(integer); 

               }

           catch(NumberFormatException e)

               {showPage=1;

               }

          if(showPage<=1)

             {showPage=1;

             }

          if(showPage>=pageCount)

             {showPage=pageCount;

             }

      %>

        <BR> 目前显示第 <%=showPage%>  

      <% // 如果要显示第 showPage 页,那么游标应移到 posion 的值是:

         int posion=(showPage-1)*pageSize+1;

          rs.absolute(posion); // 设置游标的位置

          out.print("<Table Border>");

          out.print("<TR>");

            out.print("<TH width=100>"+" 学号 ");

            out.print("<TH width=100>"+" 姓名 ");

            out.print("<TH width=50>"+" 数学成绩 ");

            out.print("<TH width=50>"+" 英语成绩 ");

            out.print("<TH width=50>"+" 物理成绩 ");

          out.print("</TR>");

       for (int i=1;i<=pageSize;i++)

        { out.print("<TR>");

             out.print("<TD >"+rs.getString(1)+"</TD>");

             out.print("<TD >"+rs.getString(2)+"</TD>");

             out.print("<TD >"+rs.getInt(" 数学成绩 ")+"</TD>");

             out.print("<TD >"+rs.getInt(" 英语成绩 ")+"</TD>");

            out.print("<TD >"+rs.getInt(" 物理成绩 ")+"</TD>");  

         out.print("</TR>") ;

          rs.next(); 

         }

       out.print("</Table>");

      con.close();

     }

   catch(SQLException e1) {}

 %>

</BODY>

</HTML>

 

(5) l 连接 Oracle 数据库

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="java.sql.*" %>

<HTML>

<BODY>

 <% Connection con=null;

    Statement sql=null;

    ResultSet rs=null;

    try{Class.forName("oracle.jdbc.driver.OracleDriver");

       }

    catch(ClassNotFoundException e){}

    try

      {  con=

DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.35:1521:Lea","scott","tiger");

         sql=con.createStatement();

         rs=sql.executeQuery("select * from emp");

         out.print("<Table Border>");

         out.print("<TR>");

            out.print("<TH width=100>"+"EMPNO");

            out.print("<TH width=50>"+"Ename");

         out.print("</TR>");

       while(rs.next())

       { out.print("<TR>");

             int n=rs.getInt(1);

             out.print("<TD >"+n+"</TD>");

            String e=rs.getString(2);

             out.print("<TD >"+e+"</TD>");

         out.print("</TR>") ; 

        }

        out.print("</Table>");

        con.close();

     }

   catch(SQLException e1) {out.print(""+e1);}

 %>

</BODY>

</HTML>

 

6 )查询电子表格

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="java.sql.*" %>

<HTML>

<BODY>

 <% Connection con; 

     Statement sql; 

     ResultSet rs;

    try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

      }

    catch(ClassNotFoundException e){}

    try { con=DriverManager.getConnection("jdbc:odbc:star","","");

         sql=con.createStatement();

         rs=sql.executeQuery("SELECT * FROM 品名 ");

         out.print("<Table Border>");

         out.print("<TR>");

            out.print("<TH width=100>"+" 品名 ");

            out.print("<TH width=50>"+" 单位 ");

            out.print("<TH width=50>"+" 单价 ");

         out.print("</TR>");

       while(rs.next())

       { out.print("<TR>");

            String name=rs.getString(1);

             out.print("<TD >"+name+"</TD>");

            String  unit=rs.getString(2);

             out.print("<TD >"+unit+"</TD>");

            String  unitprice=rs.getString(3);

            out.print("<TD >"+unitprice+"</TD>");

         out.print("</TR>") ;         

        }

        out.print("</Table>");

        con.close();

     }

   catch(SQLException e1) {}

 %>

</BODY>

</HTML>

 

7 )使用同步连接

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="java.sql.*" %>

<HTML>

<BODY>

 <%! // 声明一个共享的连接对象:

    Connection con=null;

  %>

 <% Statement sql=null;

    ResultSet rs=null;

    // 第一个客户负责建立连接对象:

    if(con==null)

      { try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

           }

           catch(ClassNotFoundException e)

           {out.print(e);

           }

        try {con=DriverManager.getConnection("jdbc:odbc:moon","sa","");

           sql=con.createStatement();

           rs =sql.executeQuery("SELECT * FROM students");

           out.print("i am  first");

          }

        catch(SQLException e)

          {out.print(e);

          }

      }

     // 其它客户通过同步块使用这个连接:

     else

      { synchronized(con)

        {  try { sql=con.createStatement();

               rs =sql.executeQuery("SELECT * FROM students");

               out.print("i am not first");

               }

          catch(SQLException e)

               {out.print(e);

               }

        }

      }

    try

      {  out.print("<Table Border>");

         out.print("<TR>");

            out.print("<TH width=100>"+" 学号 ");

            out.print("<TH width=100>"+" 姓名 ");

            out.print("<TH width=50>"+" 数学成绩 ");

            out.print("<TH width=50>"+" 英语成绩 ");

            out.print("<TH width=50>"+" 物理成绩 ");

         out.print("</TR>");

       while(rs.next())

       { out.print("<TR>");

           String  number=rs.getString(1);

             out.print("<TD >"+number+"</TD>");

           String  name=rs.getString(2);

             out.print("<TD >"+name+"</TD>");

           int  math=rs.getInt(" 数学成绩 ");

             out.print("<TD >"+math+"</TD>");

           int  english=rs.getInt(" 英语成绩 ");

             out.print("<TD >"+english+"</TD>");

           int  physics=rs.getInt(" 物理成绩 ");

             out.print("<TD >"+physics+"</TD>");  

        out.print("</TR>") ;         

        }

      out.print("</Table>");

    }

   catch(SQLException e1) {}

 %>

</BODY>

</HTML>

8 )投票系统

vote.jsp

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="java.sql.*" %>

<HTML>

<BODY>

 <%  StringBuffer nameList=new StringBuffer();

      Connection con;

      Statement sql;

      ResultSet rs;

      try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

        }

      catch(ClassNotFoundException e){}

      try{ con=DriverManager.getConnection("jdbc:odbc:vote","","");

          sql=con.createStatement();

          rs=sql.executeQuery("SELECT * FROM people");

          nameList.append("<FORM action=startvote.jsp  Method=post>");

          nameList.append("<Table Border>");

          nameList.append("<Table Border>");

          nameList.append("<TR>");

          nameList.append("<TH width=100>"+" 姓名 ");

          nameList.append("<TH width=50>"+" 投票选择 ");

          nameList.append("</TR>");

          while(rs.next())

             { nameList.append("<TR>");

               String name=rs.getString(1);

               nameList.append("<TD >"+name+"</TD>");

               String s="<Input type=radio name=name value="+name+" >";

               nameList.append("<TD >"+s+"</TD>");  

               nameList.append("</TR>") ;         

             }

          nameList.append("</Table>");

          nameList.append("<Input Type=submit value= 提交 >");

         nameList.append("</FORM ");

        con.close();

        out.print(nameList);

       }

      catch(SQLException e1) {}

%>

</BODY>

</HTML>

startvote.jsp (效果如图 5.40 5.41 所示):

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="java.sql.*" %>

<%@ page import="java.io.*" %>

<html>

<body>

<%! // 记录总票数的变量:

    int total=0;

    // 操作总票数的同步方法:

    synchronized void countTotal()

        { total++;

        }  

%>

<% boolean vote=true;// 决定用户是否有权投票的变量。

    // 得到被选择的候选人名字:

    String name="";

    name=request.getParameter("name");

      if(name==null)

       {name="?";

       }

    byte a[]=name.getBytes("ISO-8859-1");

    name =new String(a);

    // 得到投票人的 IP 地址:

    String IP=(String)request.getRemoteAddr();

    // 加载桥接器:

     try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

        }

     catch(ClassNotFoundException e){}

    Connection con=null;

    Statement sql=null;

    ResultSet rs=null;

   // 首先查询 IP 表,判断该用户的 IP 地址是否已经投过票:

    try {  con=DriverManager.getConnection("jdbc:odbc:vote","","");

          sql=con.createStatement();

          rs=sql.executeQuery("SELECT * FROM IP WHERE IP = "+"'"+IP+"'");

          int row=0;

         while(rs.next())

            { row++;

            }

          if(row>=1)

            { vote=false;     // 不允许投票。

            }

         }

    catch(SQLException e)

       { }

if(name.equals("?"))

    { out.print(" 您没有投票 , 没有权利看选举结果 ");

    }

 else

  {

    if(vote)

    {   out.print(" 您投了一票 ");

         // 将总票数加 1

         countTotal();

        // 通过连接数据库,给该候选人增加一票 ,

        // 同时将自己的 IP 地址写入数据库

       try

         { rs=sql.executeQuery("SELECT * FROM people WHERE name = "+"'"+name+"'");

           rs.next();

           int count=rs.getInt("count");

           count++;

           String condition=

              "UPDATE people SET count = "+count+" WHERE name="+"'"+name+"'" ;

         // 执行更新操作 ( 投票计数 )

          sql.executeUpdate(condition);

          // IP 地址写入 IP 表:

         String to=

         "INSERT INTO IP VALUES"+"("+"'"+IP+"'"+")";

          sql.executeUpdate(to);

         }

       catch(SQLException e)

         { out.print(""+e);

         }

      // 显示投票后的表中的记录:

       try{ rs=sql.executeQuery("SELECT * FROM people");

            out.print("<Table Border>");

            out.print("<TR>");

            out.print("<TH width=100>"+" 姓名 ");

            out.print("<TH width=50>"+" 得票数 ");

             out.print("<TH width=50>"+" 总票数 :"+total);

            out.print("</TR>");

         while(rs.next())

            {  out.print("<TR>");

               out.print("<TD >"+rs.getString(1)+"</TD>");

               int count=rs.getInt("count");

               out.print("<TD >"+count+"</TD>");

               double b=(count*100)/total;  // 得票的百分比。

               out.print("<TD >"+b+"%"+"</TD>");

               out.print("</TR>") ; 

            }

           out.print("</Table>");

           con.close();

         }

     catch(SQLException e)

        { }

   }

  else

   {out.print(" 您已经投过票了 ");

   }

 }

%>

</BODY>

</HTML>

(9) 成绩录入查询系统

main.jsp

<%@ page contentType="text/html;charset=GB2312" %>

<HTML>

<BODY BGcolor=yellow>

<CENTER>

<FONT SIZE=2>

<P> 成绩录入查询系统

<BR>

<BR><A HREF="login.jsp"> 录入人员登录 </A>

<BR><A HREF="inputMessage.jsp"> 录入学生的基本信息 </A>

<BR><A HREF="inputResult.jsp"> 录入学生成绩 </A>

<BR><A HREF="modifySecret.jsp"> 修改密码 </A>

<BR><A HREF="inquire.jsp"> 查询成绩 </A>

</FONT>

</CENTER>

</BODY>

</HTML>

 

登录页面

login.jsp

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="java.sql.*" %>

<HTML>

<BODY  bgcolor=pink ><Font size=1>

 <P> 成绩输入人员登录

<FORM action="login.jsp" Method="post">

<BR> 输入帐号:

<BR><Input type=text name="account">

<BR> 输入密码:

<BR><Input type=password name="secret">

<BR><Input type=submit name="g" value=" 提交 ">

</FORM>

<%  // 获取提交的帐号:

     String account=request.getParameter("account");

       if(account==null)

            {account="";

            }

       byte b[]=account.getBytes("ISO-8859-1");

       account=new String(b);

    // 获取提交的密码:

    String secret=request.getParameter("secret");

       if(secret==null)

            {secret="";

            }

     byte c[]=secret.getBytes("ISO-8859-1");

     secret=new String(c);

    // 查询数据库信息,验证身份:

    Connection con=null;

    Statement sql=null;

    ResultSet rs=null;

    try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

          }

    catch(ClassNotFoundException event){}

    try

      {con=DriverManager.getConnection("jdbc:odbc:manage","","");

       sql=con.createStatement();

       String condition="SELECT * FROM verify WHERE 帐号 = "+"'"+account+"'";

       rs =sql.executeQuery(condition);

       while(rs.next())

            { String n=rs.getString(" 帐号 ");

              String s=rs.getString(" 密码 ");

              if(account.equals(n)&&secret.equals(s))

                { // 将帐号和密码存入 session 对象,以备在输入界面: inputMessage.jsp 中使用:

                   session.setAttribute("account",account);

                   session.setAttribute("secret",secret);

                 // 为了防止客户浏览器限制了 Cooker 的使用,需对连接进行重定向处理:

                 String s1=response.encodeRedirectURL("inputMessage.jsp");

                 String s2=response.encodeRedirectURL("inputResult.jsp");

                 // 连接到基本信息输入页面:

                 response.sendRedirect(s1);

                }

            }

       if(!(session.isNew()))

           { out.print("<BR> 您输入的帐号或密码不正确 "+account+":"+secret);

           }

      }

    catch(SQLException e1) {}

%>

<BR><A HREF="main.jsp"> 返回主页 </A>

</FONT>

</BODY>

</HTML>

 

基本信息输入页面(效果如图 5.45 所示)

inputMessage.jsp

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="java.sql.*" %>

<HTML>

<BODY  bgcolor=pink ><Font size=1>

<P> 在该页面输入若干个学生的基本信息, <BR> 或直接连接到成绩输入页面。

 <%!// 处理字符串的一个常用方法:

    public String getString(String s)

     { if(s==null) s="";

       try {byte a[]=s.getBytes("ISO-8859-1");

            s=new String(a);

           }

       catch(Exception e)

           {

           }

       return s;

     }

 %>

<% // 为了防止客户浏览器限制了 Cooker 的使用,需对连接进行重定向处理:

   String s1=response.encodeRedirectURL("inputMessage.jsp");

   String s2=response.encodeRedirectURL("inputResult.jsp");

%>

<% // 为了防止客户直接进入该页面,首先从 session 对象获取密码和帐号信息:

    String account="",secret="";

    if(session.isNew())

       {// 如果直接进入该页面就再连接到登录页面:

         response.sendRedirect("login.jsp");

       }

    else

       { account=(String)session.getAttribute("account");

         secret=(String)session.getAttribute("secret");

         secret=getString(secret);

         account=getString(account);

       }

   // 连接到数据库验证帐号和密码:

    Connection con=null;

    Statement sql=null;

    ResultSet rs=null;

    boolean boo=false;

    try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

       }

    catch(ClassNotFoundException event){}

    try

      {con=DriverManager.getConnection("jdbc:odbc:manage","","");

       sql=con.createStatement();

       String condition="SELECT * FROM verify WHERE 帐号 = "+"'"+account+"'";

       rs =sql.executeQuery(condition);

       while(rs.next())

            { String n=rs.getString(" 帐号 ");

              String s=rs.getString(" 密码 ");

              if(account.equals(n)&&secret.equals(s))

                {boo=true; break;

                }

            }

      }

    catch(SQLException e1) {}

   // 如果帐号密码正确,就显示输入学生基本信息的表单界面:

   if(boo)

    {out.print("<FORM action= "+s1+" method=post>");

     out.print("<P> 输入学生的基本信息: ");

     out.print("<BR> 学号: ");

     out.print("<Input type=text name=number1>");

     out.print("<BR> 姓名: ");

     out.print("<Input type=text name=name>");

     out.print("<BR> 专业: ");

     out.print("<Input type=text name=zhuanye>");

     out.print("<BR> 年级: ");

     out.print("<Input type=text name=grade>");

     out.print("<BR> <Input type=submit value= 提交 >");

     out.print("</FORM>");

    }

   else

    {response.sendRedirect("login.jsp");

    }

%>

<% // 获取基本信息存入数据库中的 " 基本信息 " 表中:

   String number1=request.getParameter("number1"),

          name   =request.getParameter("name"),

          zhuanye=request.getParameter("zhuanye"),

          grade  =request.getParameter("grade");

   if(number1==null)

      {number1="????????";

      }

   number1=getString(number1);

   number1=number1.trim();

   name   =getString(name);

   zhuanye=getString(zhuanye);

   grade  =getString(grade);  

   String  basicmessage=

   "INSERT INTO 基本信息 VALUES"+"("+"'"+number1+"','"+name+" ',' "+

                                      zhuanye+" ',' "+grade+" ' "+")";

      if(!(number1.startsWith("?")))

        { // 首先查找基本信息表中是否已存在该学生的信息:

          rs=sql.executeQuery("SELECT * FROM 基本信息 WHERE 学号 ="+" '"+number1+"' " );

          // 如果该学号的学生已经存在,就转入成绩输入页面:

          boolean line=rs.next();

          // 通过 line 判断结果集是否有记录

           if(line==true)

              {  out.print(" 该考号已经存在,请再录入其它学生的基本信息 ");

                 out.print("<BR> 也可以点击按钮:进入成绩录入页面 ");

                 // 显示该生的基本信息:

                 out.print("<BR> 学号 "+rs.getString(1)) ;

                 out.print("<BR> 姓名 "+rs.getString(2)) ;

                 out.print("<BR> 专业 "+rs.getString(3)) ;

                 out.print("<BR> 年级 "+rs.getString(4)) ;

              }

          // 如果该学号的学生不存在,就将信息写入基本信息表,再转入成绩输入页面:

         else

             {sql.executeUpdate(basicmessage);

              out.print("<BR> 该学生的信息已录入成功,请再录入其它学生的基本信息 ");

              out.print("<BR> 也可以点击按钮:进入成绩录入页面 ");

             }

        }

     else

        {out.print(" 必须输入学号,学号不可以用 ? 开头 ");

        }

    con.close();

 %>

<FORM action=<%=s2%>>

<P> 点击按钮连接到学生成绩输入页面:

<BR><Input type="submit" value=" 连接到学生成绩输入页面 ">

<BR><A HREF="main.jsp"> 返回主页 </A>

</BODY>

</HTML>

 

成绩录入页面

inputResult.jsp

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="java.sql.*" %>

<HTML>

<BODY  bgcolor=yellow ><Font size=1>

 <%!// 处理字符串的一个常用方法:

    public String getString(String s)

     { if(s==null) s="";

       try {byte a[]=s.getBytes("ISO-8859-1");

            s=new String(a);

           }

       catch(Exception e)

           { }

       return s;

     }

 %>

<% String s1=response.encodeRedirectURL("inputMessage.jsp");

   String s2=response.encodeRedirectURL("inputResult.jsp");

%>

<% // 为了防止客户直接进入该页面,首先从 session 对象获取密码和帐号信息:

    String account="",secret="";

    if(session.isNew())

       {// 如果直接进入该页面就连接到登录页面:

         response.sendRedirect("login.jsp");

       }

    else

       { account=(String)session.getAttribute("account");

         secret=(String)session.getAttribute("secret");

         secret=getString(secret);

         account=getString(account);

       }

// 连接到数据库验证帐号和密码:

    Connection con=null;

    Statement sql=null;

    ResultSet rs=null;

    boolean boo=false;

    try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

       }

    catch(ClassNotFoundException event){}

    try

      {con=DriverManager.getConnection("jdbc:odbc:manage","","");

       sql=con.createStatement();

       String condition="SELECT * FROM verify WHERE 帐号 = "+"'"+account+"'";

       rs =sql.executeQuery(condition);

       while(rs.next())

            { String n=rs.getString(" 帐号 ");

              String s=rs.getString(" 密码 ");

              if(account.equals(n)&&secret.equals(s))

                {boo=true; break;

                }

            }

      }

    catch(SQLException e1) {}

   // 如果帐号密码正确,就显示输入成绩的表单界面:

  if(boo)

    {out.print("<P> 输入学生的考试科目、成绩等信息: ");

     out.print("<FORM action="+s2+" method=post>");

     out.print("<BR> 学号: ");

     out.print("<Input type=text name=number2>");

     out.print("<BR> 科目: ");

     out.print("<Input type=text name=subject>");

     out.print("<BR> 成绩: ");

     out.print("<Input type=text name=result>");

     out.print("<BR> <Input type=submit value= 提交 >");

     out.print("</FORM>");

    }

   else

    {response.sendRedirect("login.jsp");

    }

%>

<%     String number2=request.getParameter("number2"),

        subject=request.getParameter("subject"),

        result=request.getParameter("result");

        if(number2==null)

          {number2="########";

          }

         number2=getString(number2);

         subject=getString(subject);

         result=getString(result);

         number2=number2.trim();

    // " 基本信息 " 表中查找学号是 nunumber2 的记录:

         String basicmessage=

         "SELECT * FROM 基本信息 WHERE 学号 = "+" '"+number2+"'";

    try {  sql=con.createStatement();

           rs=sql.executeQuery(basicmessage);

           boolean line=rs.next();

          // 通过 line 判断结果集是否有记录 ,

          // 如果没有该学生的基本信息就返回提示:

         if(line==false)

            {out.print(" 你还没有输入成绩呢 ,");

             out.print(" 如果你输入的学号不在 <BR> 学生的基本信息表中 ,");

             out.print(" 请点击按钮:连接到学生 <BR> 基本信息输入页面 .");

            }

         else

            {  // 显示该生的基本信息:

               out.print("<BR> 学号 "+rs.getString(1)) ;

               out.print("<BR> 姓名 "+rs.getString(2)) ;

               out.print("<BR> 专业 "+rs.getString(3)) ;

               out.print("<BR> 年级 "+rs.getString(4)) ;

               String resultmessage=

               "INSERT INTO 成绩 VALUES"+"("+"'"+number2+"','"+subject+" ','"+result+"' "+")";

               sql.executeUpdate(resultmessage);

               out.print("<BR> 成绩已被录入 ");

            }

        }

     catch(SQLException e)

        {out.print("<BR>"+subject+" 该课程的成绩已经存在 <BR> 不允许重复录入 ");

        }

  con.close();

%>

<FORM action=<%=s1%>>

<P> 点击按钮连接到学生信息输入页面:

<BR><Input type="submit" value=" 连接到学生基本信息输入页面 ">

</FORM>

</BODY>

</HTML>

 

成绩查询页面

inquire.jsp

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="java.sql.*" %>

<HTML>

<BODY bgcolor=orange ><Font size=1>

 <FORM action="" Method=post>

  输入学生的学号:

 <Input type=text name=number>

 <Input type=submit name=g vale= 提交 >

 </FORM>

 <%!  Connection con=null; // 声明一个共享的连接对象

  %>

 <% // 获取学号:

    String studentNumber=request.getParameter("number");

        if(studentNumber==null)

          {studentNumber="?";

          }

    byte b[]=studentNumber.getBytes("ISO-8859-1");

    studentNumber=new String(b);

    Statement sql=null;

    ResultSet rs=null;

    if(con==null)

      { try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

           }

           catch(ClassNotFoundException e)

           {out.print(e);

           }

        try {con=DriverManager.getConnection("jdbc:odbc:manage","","");

          String condition="SELECT * FROM 成绩 WHERE 学号 = "+"'"+studentNumber+"'";

                 rs =sql.executeQuery(condition);

          }

        catch(SQLException e)

          {out.print(e);

          }

      }

     else

      { synchronized(con)

        {  try { sql=con.createStatement();

             String condition="SELECT * FROM 成绩 WHERE 学号 = "+"'"+studentNumber+"'";

                 rs =sql.executeQuery(condition);

               }

          catch(SQLException e)

               {out.print(e);

                }

        }

      }

    try {  out.print("<Table Border>");

         out.print("<TR>");

            out.print("<TH width=100>"+" 学号 ");

            out.print("<TH width=100>"+" 课程名称 ");

            out.print("<TH width=50>"+" 成绩 ");

        out.print("</TR>");

       while(rs.next())

       { out.print("<TR>");

           String  number=rs.getString(1);

             out.print("<TD >"+number+"</TD>");

           String  subjectName=rs.getString(2);

             out.print("<TD >"+subjectName+"</TD>");

           String  chengji=rs.getString(" 成绩 ");

             out.print("<TD >"+chengji+"</TD>");

        out.print("</TR>") ;

        }

      out.print("</Table>");

    }

   catch(SQLException e1) {}

 %>

<BR><A HREF="main.jsp"> 返回主页 </A>

</FONT>

</BODY>

</HTML>

 

修改密码页面

modifySecret.jsp

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="java.sql.*" %>

<HTML>

<BODY  bgcolor=pink ><Font size=1>

 <P> 修改密码 , 密码长度不能超过 30 个字符:

<FORM action="" Method="post">

<BR> 输入您的帐号:

<BR><Input type=text name="account">

<BR> 输入您的密码:

<BR><Input type=password name="secret">

<BR> 输入您的新的密码:

<BR><Input type=text name="newSecret1">

<BR> 请再输入一次新密码:

<BR><Input type=text name="newSecret2">

<BR><Input type=submit name="g" value=" 提交 ">

</FORM>

<%!// 处理字符串的一个常用方法:

    public String getString(String s)

     { if(s==null) s="";

       try {byte a[]=s.getBytes("ISO-8859-1");

            s=new String(a);

           }

       catch(Exception e)

           { }

       return s;

     }

 %>

<%  // 获取提交的帐号:

    String account=request.getParameter("account");

           account=getString(account);

    // 获取提交的密码:

    String secret=request.getParameter("secret");

           secret=getString(secret);

   // 获取提交的新密码:

    String newSecret1=request.getParameter("newSecret1");

           newSecret1=getString(newSecret1);

    // 获取提交的新密码:

    String newSecret2=request.getParameter("newSecret2");

       newSecret2=getString(newSecret2);

     try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

          }

     catch(ClassNotFoundException event){}

    // 查询数据库信息,验证身份:

    Connection con=null;

    Statement sql=null;

    ResultSet rs=null;

    boolean modify=false;

    boolean ifEquals=false;

            ifEquals=(newSecret1.equals(newSecret2))&&(newSecret1.length()<=30);

    if(ifEquals==true)

        {try

           { con=DriverManager.getConnection("jdbc:odbc:manage","","");

             sql=con.createStatement();

             String condition="SELECT * FROM verify WHERE 帐号 = "+"'"+account+"'";

             rs =sql.executeQuery(condition);

             while(rs.next())

                 { String n=rs.getString(" 帐号 ");

                   String s=rs.getString(" 密码 ");

                   if(account.equals(n)&&secret.equals(s))

                    {  // 修改密码:

                     modify=true;

                     out.print(" 您的密码已经更新 ");

                     String c=

         "UPDATE verify SET 密码 = "+"'"+newSecret1+"'"+" WHERE 帐号 = "+"'"+account+"'";

                     rs =sql.executeQuery(c);

                    }

                  }

           }

         catch(SQLException e1) {}

        }

    else

       { out.print(" 你两次输入的密码不一致或长度过大 ");

       }

    if(modify==false&&ifEquals==true)

     { out.print("<BR> 您没有输入密码帐号或 <BR> 您输入的帐号或密码不正确 "+account+":"+secret);

     }

%>

</FONT>

</BODY>

</HTML>

 

呵呵,上面举的例子都是具有代表性的例子。

在文章最后还要声明一下:本篇文章是参考 JSP 实用教程写的,再次提出感谢,另外该书不错,本人看了,推荐 JSP 初学者可以买一本看看,获益非浅的。

 

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1322070

posted on 2006-10-11 17:16 fly 阅读(5163) 评论(1)  编辑  收藏 所属分类: jsp学习

FeedBack:
# re: 新手入门-JSP(完结篇) 2016-04-15 09:32 
123  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: