jsp笔记

JSP:Java server pages,是一种动态网页技术;“动态”指的是交互性,而不是动画或者js特效的动态。

 

同类产品:ASP,PHP,......

 

JSP的服务器:Tomcat,Weblogic,webSphere,JBoss,JRun,Resin.....

 

Tomcat目录:

       bin:Tomcat的启动和关闭程序

       Common:一些库文件

       Conf:配置信息。

       WebApps:站点放在此

       Work:jsp会被译成servlet,放在此目录下

      

 

站点的创建:

       1。在WebApps目录下创建一个目录,比如:JspStudy。

       2。编写first.jsp,内容就是以前的HTML代码。

       3。在JspStudy下创建一个文件夹:WEB-INF

       4。在WEB-INF下创建一个文件:web.xml

       5。编写web.xml的内容为:

              <?xmlversion="1.0" encoding="ISO-8859-1"?>

              <web-app>

                     <welcome-file-list>

                            <welcome-file>first.jsp</welcome-file>

                     </welcome-file-list>

              </web-app>

       6。<welcome-file-list>可以省略,它指的是访问站点时的默认首页;可以有多个,会依次寻找。

       7。访问:http://localhost:8080/JspStudy

                     8080为端口号;JspStudy是你的站点目录名;localhost可以换成IP地址;

 

更改端口号:

       1。打开conf\server.xml文件。

       2。找到port="8080"

       3。更改。注意:不要与系统中其它软件的端号冲突。

 

 

将服务目录创建在任意的目录下,而不是webapps目录下:

       1。打开conf\server.xml文件。

       2。在</host>前加:

              <Contextpath="/站名"docBase="实际目录"debug="0" reloadable="true"></Context>

              注意:大小写;XML是区分大小写;

       3。访问:http://localhost:端口号/站名

      

       比如:<Context path="/cat"docBase="c:/myCatSite" debug="0" reloadable="true"></Context>

 

 

DW中的站点配置:

       1。菜单:stie(站点)/manage site(管理站点)

       2。对话框上:单击“new”/"site"

       3。advance选项卡,local root folder:本地文夹,找到webapps下的你的站点目录;

       4。左侧remote info(远程信息):Access(访问)设置为local/network(本地/网络):指定站点根目录,同上。

       5。左侧Testing Server(测试服务器),server modal(服务器模型):设置为jsp,

                     Access(访问):local/network,URL prefix(URL前缀):设置你的站点访问的URL,比如:

                                   http://localhost:6688/JspStudy/

                                   即:http://localhost:端口号/站点名/

      

 

 

JSP嵌入在HTML中,就是使用:<%%>以及其它特定的指令或者动作

 

       <%="输出一条语句"%>:注意:只能是一条语句;

       <%out.println("输出语句")%>:注意:可以有N个out.println();区别java没有System

       练习:写一段代码,求出1-100和,并输出

 

 

JSP输出语句中可以使用HTML

    <%

        if(3>2)

             out.println("3>2");

        else

             out.println("3<2");

    %>

 

    以上代码可以写成:

    <%if(3>2){%>

        3>2

    <%}else{%>

        3<2

    <%}%>

        请理解!

 

 

JSP文件的构成元素:

    1.HTML  2.注释  3.脚本(scriptLet)    4.指令     5.动作

 

    注释元素:

    <!--注释内容-->      其实是HTML注释

    <!--<%=jsp代码%>-->  其实还是HTML注释,只不过是注释的内容是由jsp决定的

    <%--注释内容--%> 此种注释不同于上两种,不会显示在客户端的源码中

    <%

        //单行注释

        /*多行注释*/

    %>

                 此种注释是脚本种的注释,即java的注释

    脚本元素:

    包括三个方面:声明(Declaration);表达式(Expression);小脚本(scriptlets)

    声明:  1.可以声明变量,也可声明方法;这种变量和方法会成为成员变量和成员方法;否则,为局部变量和局部方法

        2.声明的办法<%! 变量;%>     <%! 方法名(){}%>

        3.此种声明可以在变量使用前,也可以在变量使用后;

        4。而局部变量则必须在使用前声明;方法同理。

    如:

        <%!String color="green";%>

 

        <BODYbgcolor="<%=color()%>">

 

 

    再如:

        <%!String color="green";

        publicString getColor()

        {

            return color;

        }

        %>

        <BODYbgcolor="<%=getColor()%>">

 

    请查看work目录下的java文件,进行理解。

 

    表达式;

    用法:<%=表达式%>

    注意:无分号;=是输出的作用;

   

    小脚本:

    <%这之间的多行java代码,就是小脚本%>

 

 

    指令元素:

    三种:页面指令(page);include指令;taglib指令;指令的特点是<%@ 指令%>

 

    动作元素:

    作用:可以理解为sun为我们定义的一些标签,有相应的功能;

    特点:<jsp:动作></jsp:动作>;有时可以写成<jsp:动作 />

 

    page指令:

    格式;

    <%@page

        [langage="java"]            [import="package.class|package.*,package2.class2,....."]

        [contentType="TYPE;charset=CHARSET"] [session="true|false"]

        [buffer="none|8kb|sizeKB"]       [autoFlush="true|false"]    

        [info="text"]                [errorPage="relativeURL"]

        [isErrorPage="true|false"]        [extends="package.class"]

        [pageEncoding="peinfo"]

    %>

    注意:除import之外,其它指令只能出现一次。

 

    说明:

    属性         描述                 默认值       比如

    langage      定义使用的语言,只有"java"   java         language="java"]

    import       导入包,多包之间用逗号                import="java.io.*,java.util.*"

    session      此页面是否在session中有效    true         session="false"

    buffer       缓冲大小                 buffer="64K"

    autoFlush    自冲刷新缓冲         true         autoFlush="true"

    info         可以使用servlet.getServletInfo()

             获取信息                 info="一个测试"

    errorPage    出现异常是,自动跳转的页          errorPage="*.jsp|*.html"

    isErrorPage  指定当前页为错误页                isErrorPage="true"

    contentType  指页面的MIME类型                 contentType="text/html;charset=gb2312"

    pageEncoding 页面的编码                   pageEncoding="iso-8859-1"

 

    info属性实例:

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

    <%@page info="我!张惠妹" %>

    <HTML>

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

    <P>谁呀?

      <% String s=getServletInfo();

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

      %>

    </BODY>

    <HTML>

 

 

    错误页实例:注意是两个文件

 

    文件一:此文件会产生错误,使用指令:errorPage=""

    <%@page contentType="text/html; charset=gb2312" language="java"  errorPage="error.jsp" %>

    <%

    //这个页面一定会出错。

    inti=0;

    intj=1;

    out.println(j/i);

    %> 

   

    文件二:此文件是显示错误信息的页,使用指令:isErrorPage="true"

    <%@page contentType="text/html; charset=gb2312"language="java" isErrorPage="true" %>

    <html>

    <head>

    <title>出错了!</title>

    <metahttp-equiv="Content-Type" content="text/html;charset=gb2312">

    </head>

    <body>

    出错了!<br>

    发生了以下的错误:<br>

    1.除数不能为零。<br><hr><font color=red>

    2.<%=exception.getMessage()%><br><hr>

    3.<%=exception.getLocalizedMessage()%><br><hr>

    <br>

    </font></body>

    </html>

 

 

    include指令:

   

    作用:静态的包含一个文件;可是是txt,jsp以及其它浏览器所能识别的文件;被包含文件将成为当前文件的一部分;

   

    注意:   1.若被包含文件修改了,则必须重新编译jsp,否则不能更新.

        2.若当前jsp文件已经有某个page指令,则被包含的文件一定不能有相同指令.

        3.常应用于多页有重复的内容;比如:导航栏或者版权说明;

   

    格式:<%@ include file="文件的名称"%>

    比如:

    <%@page contentType="text/html;charset=GB2312"pageEncoding="iso-8859-1"%>

    <html>

    <BODYbgcolor=cyan>

    <H3>

      <%@ include file="A.txt" %>

    </H3>

    </BODY>

    </HTML>

   

    jsp的动作标签:

    理解:自定义的标签;所以,要有结束标记;

   

    include动作:

    <jsp:includepage="文件名" />

    或者

    <jsp:includepage="文件名"></jsp:include>

    与include指令的区别:

        第一:动作标签是在执行时才对包含的文件进行处理;而指令是在编译处理;

        第二:动作标签不将被包含的文件实际的合并成当前页面的一部而,而只是告知java解释器去执行被包含的文件;

        第三:被包含的文件在语法和逻辑上是独立的;

        第四:被包含文件内容的修改会更新在包含文件上.

       

 

    forward动作:

    作用:停止当前页面的执行,跳转到另一个页面;

    格式:<jsp:forward page=要转向的页面" />

    实例:产生一个随机数,当随机数大于0.5时自动跳转到1.jsp;否则,跳转到2.jsp

    作业:根据不同的星期几跳转到对应的页面;

   

 

 

    plugin动作:

    作用:用业产生object或者embed标签,使用它可以插入Applet或者JavaBean

    格式:

    <jsp:plugin

        type="bean|applet"

        code="文件名"

        codebase="文件目录"

    >

        <jsp:params>

             <jsp:paramname="参数名" value="值|<%=jsp表达式%>"  />

             多参,同上

        </jsp:params>

    </jsp:plugin>

   

 

 

    out对象及方法

 

 

    jsp内置对象谈讨之二:

    request对象

    作用:封装了用户提交的信息;所以,可以由对象来获取用户请求的信息。

    说明:  第一:它被包装成HttpServletRequest接口。

        第二:常用来在单击表单中的提交按钮后,获取信息。

        第三:表单的格式:

             <formmethod=get|post action="要处理提交信息的页面">

                 <各表单对象>

                 <提交按钮>

             </form>

             在单击提交按钮后,会自动执行action所对应的jsp页面;action对应的页面可以获取表单中的信息;

             这些信息就封装在request对象中;

 

    request对象的方法:

    getAttribute(Stringname):返回由name指定的属性值;如果属性值不存在,则返回null;

    getAttributeNames():返回request对象中的所有属性的名字集合,结果的类型是枚举型;

    getCookies():返回客户端所有Cookie对象,结果是一个Cookie数组;

    getCharacterEncoding():返回请求的编码方式;

    getContentLength():返回请求的body长度;如果不确定长度,则返回-1;

    getHeader(Stringname): 返回Http协议定义的文件头信息;

    getHeaders(Stringname):返回指定名字的头信息的所有值,结果是一个枚举型;

    getHeaderNames():返回所有文件头信息的名字,结果是一个枚举型;

    getMethod():返回客户端提交数据的方法;

    getParameter(Stringname):重要方法,返回指定表单中提交参数的值;

    getParameterNames():返回客户端提交的所有参数的名字,结果是一个枚举型;

    getParameterValues(Stringname):获得指定参数的所有值,结果是一个字符数组;

    getProtocal():返回客户端提交数据时,所使用的协议;

    getQueryString():返回客户端以get方法传递参数的值;

    getRequestURI():返回发出请求的页面的地址;

    getRemoteAddr():返回客户端的IP;

    getRemoteHost():返回客户端的主机名;

    getSession([Booleancreate]):返回与请求相关的session;若create参数为true,表示如果客户端没有创建session,则创建;

    getServletPath():返回请求的脚本文件的文件路径;

    getServerPort():返回服务器的端口号;

    removeAttribute(Stringname):删除请求中的一个属性;

    setAttribute(Stringname,java.lang.Object obj):设置名字为name的request参数的值;类型由obj决定;

    getLocale():返回本土信息;在此返回zh_ch;

 

    举例:

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

    RequestObject Info:

    <hr> 

    <%

    out.println("<br>getMethod:");

    out.println(request.getMethod());

    out.println("<br>getParameter:");

    out.println(request.getParameter("name"));

 

    out.println("<br>getAttributeNames:");

    java.util.Enumeratione=request.getAttributeNames();

    while(e.hasMoreElements())

    out.println(e.nextElement());

 

    out.println("<br>getCharacterEncoding:");

    out.println(request.getCharacterEncoding());

    out.println("<br>getContentLength:");

    out.println(request.getContentLength());

    out.println("<br>getContentType:");

    out.println(request.getContentType());

    out.println("<br>getLocale:");

    out.println(request.getLocale());

    out.println("<br>getProtocol:");

    out.println(request.getProtocol());

    out.println("<br>getRemoteAddr:");

    out.println(request.getRemoteAddr());

    out.println("<br>getRemoteHost:");

    out.println(request.getRemoteHost());

    out.println("<br>getRemoteUser:");

    out.println(request.getRemoteUser());

    out.println("<br>getServerName:");

    out.println(request.getServerName());

    out.println("<br>getServerPort:");

    out.println(request.getServerPort());

    out.println("<br>getSession:");

    out.println(request.getSession(true));

    out.println("<br>getHeader('User-Agent')");

    out.println(request.getHeader("User-Agent"));

    %>

 

    例子:返回所有的文件头信息名称及值

    <%

    java.util.Enumerationenum_header=request.getHeaderNames();

    while(enum_header.hasMoreElements())

    {

        Strings=(String)enum_header.nextElement();

        out.println(s+":");

        out.println(request.getHeader(s)+"<br>");

    }

    %>

    通过这个例子,我们知道request.getHeader(String name)方法的参数可以有:accept,referer,accept-language,

    acceptEncoding,user-agent,host,connection,cookie等

 

    例子:返回所有指定头名字cookie的值

    <%

    java.util.Enumerationenum_cookie=request.getHeaders("cookie");

    while(enum_cookie.hasMoreElements())

    {

        Strings=(String)enum_cookie.nextElement();

        out.println(s+"<br>");

    }

    %>

 

    表单信息的获取,由request.getParameter("表单元素名")实现:

    举例:在一文本框中输入信息,提交后在另一页面中显示

   

    第一个文件:

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

    <HTML>

    <BODYbgcolor=green><FONT size=1>

       <FORM action="tree.jsp"method=get name=form>

             <!--action所对应的页面,会在此表单中的提交按钮(submit)单击后自动执行-->

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

             <!--注释文本框的名字,在另一个页面,可以通过request.getParameter("文本框名")来获取提交的文本框值-->

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

           <!--type=submit是提交按钮,它的值也可以通过request.getParameter("提交按钮名")来获取->

       </FORM>

    </FONT>

    </BODY>

    </HTML>

   

    第二个文件:

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

    <HTML>

    <BODYbgcolor=green><FONT size=1>  

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

       <%StringtextContent=request.getParameter("boy");

             //上面语句可以获取boy表单元素的值

       %>

    <BR>

       <%=textContent%>

    <P>获取按钮的名字:

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

        //上面语句可以获取submit表单元素的值

       %>

    <BR>

       <%=buttonName%>

    </FONT>

    </BODY>

    </HTML>

 

 

    注意:

    第一:如果直接由地址栏请求处理页,则request.getParameter("表单元素"),返回值为null;

    第二:可以在直址中直接传递参数;以地址?参数=值&参数=值&参数=值...

    第三:若参数值有空格,则用+号或者20%来表示;切记:地址中不能有空格;

    第四:表单的post方法与get方法的区别:

        1.get方法会将参数及值显示在地址栏中;所以,有安全需要的信息不能这种方式;

        2.post方法不会,可以提交大数据;而get方法提交时对提交的信息量有限制;所以,留言之类的信息不可用get

        3.post方法是默认方法;通常使用此方法;

        4.get方法,执行效率高;

    第五:可以用超链接传递参数,相当于get方法;如:<ahref=tree.jsp?boy=22&submit=33>go to tree.jsp</a>

   

    再做一例子:在文本框中输入一个数,在另一个页面显示这个数的平方根(自做,提示:需转换数据类型)

 

request对象中的中文乱码问题解决:

    实例:

    文件一:

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

    <HTML>

    <BODYbgcolor=green><FONT size=1>

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

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

          <INPUT TYPE="submit" value="提交" name="submit">

       </FORM>

    </FONT>

    </BODY>

    </HTML>

 

    文件二:

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

    <MHML>

    <BODY>  

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

       <%StringtextContent=request.getParameter("boy");

       //若没有下面的语句,将不能处理汉字.

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

         //ISO-8859-1是简体中文编码

         //上面结果形成一个字节数组

         textContent=new String(b);

         //将字节数组作用字符串对象的构造参数,返回字符串对象

       %>

    <BR>

       <%=textContent%>

        <%//输出字符串%>

 

    小结:

    1。page指令中的contentType="text/html;charset=GB2312"只能用来控制页面上静态内容的中文问题;

    2。String对象的getBytes("ISO-8859-1")用来解决request对象中包含中文信息的乱码问题;

    3。从数据库中提取出来的值也会有乱码问题,但是Tomcat4有,Tomcat5没有。

    4。使用String对象的getBytes("ISO-8859-1")方法需要对每个表单元素的值都进行转换,较麻烦;替代方法是

        request.setCharacterEncoding("GBK"),将它写在所有的request.getParameter("**")之前,可以使

        所有的表单元素提交的信息编码为中文。

    5。也可以定义一个方法,这个方法功能为:将参数转换成中文编码,即getBytes("ISO-8859-1"),然后这个方法返回

        值为一个字符串,即new String(b);在jsp页中将每个request.getParameter("**")做为这个方法的参数;

    6。若没有page指令,且IE编码为“简体中文”,在Tomcat5.0下,则不需要任何转换;

 

    实例:获取用户提交数据中的所有参数名称及值,并解决中文问题

    文件一:

    <html>

        <head>

             <title>TestHTML</title>

        </head>

        <body>

             <formaction="params.jsp">

                 请输入学员ID:<br>

                 <Inputtype="text" name="myid"><br>

                 请输入学员name:<br>

                 <Inputtype="text" name="myname"><br>

                 请选择学员性别:<br>

                 <Inputtype="radio" name="mysex" value="m" checked>男

                 <Inputtype="radio" name="mysex" value="f">女<br>

                 <Inputtype="submit" name="mysubmit"><br>

                 <Inputtype="reset" value="重新填写"><br>

             </form>

        </body>

    </html>

 

    文件二://params.jsp

    <%@pagecontentType="text/html;charset=gb2312"%>

    <%@pageimport="java.util.*"%>

    <%

    //输出request中的所有参数名称及值

    Stringcurrent_param = "";

    request.setCharacterEncoding("ISO-8859-1");     //处理页面传递的中文问题

    Enumerationparams = request.getParameterNames();  //得到所有的参数名称

    while(params.hasMoreElements()){

        current_param= (String)params.nextElement();

        out.println("Name:   " + current_param +"<br>");

        out.println("Values:" + request.getParameter(current_param) + "<br>");

    }

    %>

 

 

    实例:单选按钮的提交例子

    文件一:

    <HTML>

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

    <BODYbgcolor=cyan><Font size=1 >

     <P>诗人李白是中国历史上哪个朝代的人:

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

           <INPUT type="radio"name="R" value="a">宋朝

           <INPUT type="radio"name="R" value="b">唐朝

           <INPUT type="radio" name="R"value="c">明朝

           <INPUT type="radio"name="R" value="d" checked="ok">元朝

             <BR>

     <P>小说红楼梦的作者是:

             <BR>

           <INPUT type="radio"name="P" value="a">曹雪芹

           <INPUT type="radio"name="P" value="b">罗贯中

           <INPUT type="radio"name="P" value="c">李白

           <INPUT type="radio"name="P" value="d">司马迁

           <BR>

           <INPUT TYPE="submit"value="提交答案"name="submit">

       </FORM>

    </FONT>

    </BODY>

    </HTML>

 

    文件二://answer.jsp

    <HTML>

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

    <BODYbgcolor=cyan><Font size=1 >

     <% int n=0;

        Strings1=request.getParameter("R");

        Strings2=request.getParameter("P");

         if(s1==null)

           {s1="";}

         if(s2==null)

           {s2="";}

          if(s1.equals("b"))

           { n++;}

          if(s2.equals("a"))

           { n++;}

     %>

    <P>您得了<%=n%>分

 

    </FONT>

    </BODY>

    </HTML> 

 

   

    下拉菜单实例:

    文件一:

    <HTML>

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

    <BODYbgcolor=cyan><Font size=1 >

     <P>选择计算和的方式

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

           <Select name="sum" size=2>

               <Option Selected value="1">计算1到n的连续和

               <Option value="2">计算1到n的平方和

               <Option value="3">计算1到n的立方和

           </Select>

     <P>选择n的值:<BR>

           <Select name="n" >

               <Option value="10">n=10

               <Option value="20">n=20

               <Option value="30">n=30

               <Option value="40">n=40

               <Option value="50">n=50

               <Option value="100">n=100

           </Select>

             <BR><BR>

         <INPUT TYPE="submit" value="提交你的选择" name="submit">

       </FORM>

    </FONT>

    </BODY>

    </HTML>

 

    文件二://sum.jsp

    <HTML>

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

    <BODYbgcolor=cyan><Font size=1 >

     <% long sum=0;

        Strings1=request.getParameter("sum");

        Strings2=request.getParameter("n");

         if(s1==null)

           {s1="";}

         if(s2==null)

           {s2="0";}

        if(s1.equals("1"))

           {int n=Integer.parseInt(s2);

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

                 {sum=sum+i;

                 }

           }

          else if(s1.equals("2"))

           {int n=Integer.parseInt(s2);

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

                 {sum=sum+i*i;

                 }

           }

          else if(s1.equals("3"))

           {int n=Integer.parseInt(s2);

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

                 {sum=sum+i*i*i;

                 }

           }

     %>

    <P>您的求和结果是<%=sum%>

    </FONT>

    </BODY>

    </HTML>

 

 

复选框同名,下拉菜单可以多选,返回的值都是多值,获取办法:

    request.getParameterValues("elementName")

    比如:

    文件一:

    <html>

    <head>

        <title>允许多重选择的下拉菜单</title>

    </head>

    <bodybgcolor="#FFFFFF">

    <h2>允许多重选择的下拉菜单</h2>

    <hr>

    <formaction="echo3b.jsp" method="POST">

        <p><selectname="City" multiple size="6">

             <option>北京市</option>

             <option>上海市</option>

             <option>天津市</option>

             <option>重庆市</option>

        </select></p>

        <p><inputtype="submit" value=" 提 交"></p>

        <hr>

    </form>

    </body>

    </html>

   

    文件二://echo3b.jsp

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

    <%

    request.setCharacterEncoding("GBK");

    StringCitys[] = request.getParameterValues("City");

    %>

    <html>

    <head>

        <title>允许多重选择的下拉菜单</title>

    </head>

    <bodybgcolor="#FFFFFF">

    <h2align="center">允许多重选择的下拉菜单</h2>

    <hr>

    <p>您选择的城市是: </p>

    <ul>

    <%

    for(inti=0; i<Citys.length; i++)

        out.println("<li>"+ Citys[i]);

    %>

    </ul>

    </body>

    </html>

 

    实例:复选框同名,获取多值

    文件一:

    <html>

    <head>

    <title>复选框演示程序</title>

    </head>

    <bodyBGCOLOR="#FFFFFF">

    <h2ALIGN="CENTER">复选框演示程序</h2>

    <hr>

    <p>您有兴趣的书籍是:</p>

    <formAction="echo4b.jsp" Method="GET">

             <inputType="CheckBox" Name="Book" Value="VB 5.0 与数据库程序设计">VB 5.0 与数据库程序设计<br>

             <inputType="CheckBox" Name="Book" Value="VB 5.0 实战讲座">VB 5.0 实战讲座<br>

             <inputType="CheckBox" Name="Book" Value="VB5 与 ActiveX 程序设计">VB5 与 ActiveX 程序设计<br>

      <p>  <input Type="Submit" Value="提 交"> </p>

    </form>

    </body>

    </html>

 

    文件二://echo4b.jsp

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

    <HTML>

    <HEAD><TITLE>复选框演示程序</TITLE></HEAD>

    <BODYbgcolor="#FFFFFF">

    <HTML>

    <BODYBGCOLOR=#FFFFFF>

    <H2ALIGN=CENTER>复选框演示程序<HR></H2>

    您有兴趣的书籍是:

    <UL>

    <%

      request.setCharacterEncoding("GBK");

       String Books[] = request.getParameterValues("Book");

       if(Books != null) {

           for(int i=0; i<Books.length; i++)

                out.println(Books[i] +"<br>");

       }

    %>

    </UL>

    </BODY>

    </HTML>

 

 

    多行文本框的换行问题:如果直接输出不能实现换行,需将\n转换成<br>

    文件一:

    <html>

    <head>

        <title>文字输入框(TextArea)演示程序</title>

    </head>

    <bodybgcolor="#FFFFFF">

    <h2align="center">滚动文本框(TextArea)演示程序</h2>

    <hr>

    <formaction="echo2.jsp" method="POST">

        <p>留言:</p>

        <p><textareaname="Memo" rows="4"cols="60"></textarea></p>

        <p><inputtype="submit" value="提 交"></p>

    </form>

    </body>

    </html>

 

    文件二://echo2.jsp

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

    <html>

    <head>

        <title>TextareaDemo</title>

    </head>

    <bodybgcolor="#FFFFFF">

    <h2align="center">

             TextareaDemo - Your Input is

    </h2>

    <hr>

    <%!

        // 下面方法myTranslate的作用是将StringBuffer中的的回车符号换为<br>

        StringBuffermyTranslate(StringBuffer sour) {

             for(inti=0; i<sour.length(); i++) {

                 if(sour.substring(i,i+1).equals("\n")){

                     sour.delete(i,i+1);

                     sour.insert(i,"<br>");

                 }

             }

             returnsour;

        }

    %>

    <%

        request.setCharacterEncoding("GBK");

        StringBufferMemo = new StringBuffer(request.getParameter("Memo"));

        Memo= myTranslate(Memo);

        out.println(Memo);

    %>

    </body>

    </html>

 

 

课后作业:

    1。用一个页面处理自己的表单;提交前看到表单,提交后看到request的值.(判断提交按钮的值;判断某隐藏域的值)

    2。提交时的表单验证问题。(服务端验证:jsp;客户端验证:JavaScript).(要求:返回时已填值存在;自动让未真项获得焦点)

    3。注册用户;成功后显示成功信息;可以检查一个用户是否已经注册过,若注册过,则不能同名注册;(请研究Hashtable类)

 

 

 

 

 

 

response内置对象:

    含义与作用:它封装了HttpServletResponse接口,对客户端进行响应;与request相对应,request表示请求,response表示响应。

    常见方法:

    addCookie(Cookiecookie):添加一个Cookie对象,用来保存客户端的信息。

    addHeader(Stringname,String value):添加Http文件头信息,并传递到客户端;若已经存在此Header,则覆盖;

    containsHeader(Stringname):判断是否包含指定的Header,返回布尔值;

    encodeURL():使用sessionID来封闭一个URL,如果没有必要封装,则返回原值;

    flushBuffer():强制当前缓冲区中的内容发送到客户端;

    getBufferSize():返回缓冲区的大小;

    sendError(int):向客户端发错误信息;比如:404指网页不存在;

    sendRedirect(Stringlocation):跳转到另一个页;

    setContentType(StringcontentType):设置响应的MIME类型;参数:text/html;text/plain;application/msword;application/x-msexcel等

    setHeader(Stringname,String value):设置header,若存在则覆盖;

    setStatus(int):同sendError(int);

    encodeRedirectURL():同encodeURL();

 

 

    实例:设置文档类型为word格式

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

    <HTML>

    <BODYbgcolor=cyan><Font size=1 >

     <P>我正在学习response对象的

     <BR>setContentType方法

     <P>将当前页面保存为word文档吗?

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

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

       </FORM>

     <% Stringstr=request.getParameter("submit");

          if(str==null)

              {str="";

              }

          if(str.equals("yes"))

              {response.setContentType("application/msword;charset=GB2312");

              }

    %>

    </FONT>

    </BODY>

    </HTML>

 

    实例:设置头每隔五秒刷新一次

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

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

    <HTML>

    <BODYbgcolor=cyan><Font size=1 >

    <P>现在的时间是:<BR>

    <%out.println(""+new Date());

      response.setHeader("Refresh","5");

     %>

    </FONT>

    </BODY>

    </HTML>

 

    实例:文本框是必填项,若未填则总停留在表单页;若填,则显示成功页;

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

    <HTML>

    <BODY>

    <P>填写姓名:<BR>

       <FORM action="tree4.jsp"method="get" name=form>

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

         <INPUT TYPE="submit"value="Enter">

       </FORM>

    </BODY>

    </HTML>

 

    文件二://tree4.jsp

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

    <HTML>

    <BODY>

    <%Stringstr=null;

    str=request.getParameter("boy");

    if(str==null)

    {str="";

    }

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

    str=newString(b);

    if(str.equals(""))

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

    }

    else

    {out.print("欢迎您来到本网页!");

    }

    %>

    </BODY>

    </HTML>

 

    实例二:关于多送错误报告的几个例子

    <HTML>

    <BODY>

     <% response.setStatus(408);

        out.print("不显示了");

     %>

    </BODY>

    </HTML>

 

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

    <HTML>

    <BODY>

     <% response.setStatus(200);

        out.println("ok");

      %>

    </BODY>

    </HTML>

 

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

    <HTML>

    <BODY>

     <%

        response.sendError(505);

      %>

    </BODY>

    </HTML>

 

    提示:可以更改参数,看不同错误报告。

 

 

 

 

session对象:

    含义与作用:会话,指的是从一个客户打开浏览器并链接到服务器,到客户端关闭所有的浏览器页面并离开这个服务器,

             这一个期间就叫做一个会话;包括页面间的反复跳转,反复刷新一个页面,或不断提交信息等;session

             对象用来表示某一个会话期间的某一个特定的客户;比如:在一个网站的不同页面购买商品,通过session

             可以用来表示是你的行为而不是其它网页的行为。

    原理:当一个客户首次进行某个网站,就开始接受服务器的服务,JSP引擎将自动为每一个客户产生一个互相不同的ID;

        在整个会话周期中,此ID就标识着你的身份;若你关闭浏览器,则自动收回你的ID;若你重新登录到服务器的服务

        之中,则重新分配一个ID;它与Cookie有关,若浏览器屏蔽了Cookie功能,则session失效;

   

    常见方法:

    publicvoid setAttribute(String key,Object obj):类似于Hashtable,通过key对应存储一个值,此值类型为Object;

    publicObject getAttribute(String key):通过key获取已经存储在session中的Object;注意:因是Object,需转换类型;

    publicEnumeration getAttributeNames():返回session中的全有对象,其值为枚举类型;

    publiclong getCreationTime():L返回session对象创建的时间,即离1970年7月1日所过去的毫秒数;

    publiclong getLastAccessedTime():返回最后一次访问的时间,离1970年7月1日所过去的毫秒数;

    publicint getMaxInactiveInterval():获取session对象的生存时间;

    publicvoid setMaxInactiveInterval():设置session对象的生存时间;

    publicvoid removeAttribute(String key):删除当前session对象中关键字是key的对象;

    publicString getId():获取session对象分配的ID号;

    publicovid invalidate():使session无效;

    publicboolean isNew():是否为新客户;

 

    //session.getId()示例,多页面,对同一客户而言在同一次会话中是相同的ID

    //文件一:

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

    <HTML>

    <BODY>

    <P>

       <% String s=session.getId();

       %>

    <P>您的session对象的ID是:

       <BR> 

       <%=s%>

    <P>输入你的姓名连接到tom.jsp

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

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

           <INPUT TYPE="submit"value="送出" name=submit>

      </FORM> 

    </BODY>

    </HTML>

 

 

 

    //文件二:tom.jsp

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

    <HTML>

    <BODY>

    <P>我是Tom页面

       <% String s=session.getId();

       %>

    <P>您的在Tom页面中的session对象的ID是: 

       <%=s%>

    <P>点击超链接,连接到Jerry的页面。

    <AHREF="jerry.jsp">

     <BR> 欢迎到Jerry屋来!

    </A>  

    </BODY>

    </HTML>

   

    //文件三:jerry.jsp

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

    <HTML>

    <BODY>

    <P>我是Jerry页面

       <% String s=session.getId();

       %>

    <P>您在Jerry页面中的session对象的ID是: 

       <%=s%>

    <P>点击超链接,连接到session的页面。

    <AHREF="session.jsp">

     <BR> 欢迎到session屋来!

    </A>  

    </BODY>

    </HTML>

 

 

    //session.setAttribute(),session.getAttribute()示例

    文件一:

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

    <HTML>

    <BODYbgcolor=cyan><FONT Size=1>

      <%session.setAttribute("customer","顾客");

      //可以理解为customer="顾客",但此变量可以在整个会话中访问;

      %>

     <P>输入你的姓名连接到第一百货:first.jsp

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

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

           <INPUT TYPE="submit"value="送出" name=submit>

      </FORM> 

    <FONT>

    </BODY>

    </HTML>

 

    文件二://first.jsp

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

    <HTML>

    <BODYbgcolor=cyan><FONT Size=1>

       <% Strings=request.getParameter("boy");

          session.setAttribute("name",s);

       %>

    <P>这里是第一百货

    <P>输入你想购买的商品连接到结帐:account.jsp

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

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

           <INPUT TYPE="submit"value="送出" name=submit>

      </FORM> 

    </FONT>

    </BODY>

    </HTML>

 

 

    文件三://account.jsp

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

    <%!//处理字符串的方法:

       publicString getString(String s)

       { if(s==null)

          {s="";

          }

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

               s=new String(b);

              }

         catch(Exception e)

              {

              }

         return s;

       }

    %>

    <HTML>

    <BODYbgcolor=cyan><FONT Size=1>

       <% String s=request.getParameter("buy");

          session.setAttribute("goods",s);

       %>

    <BR>

    <%String 顾客=(String)session.getAttribute("customer");

       String 姓名=(String)session.getAttribute("name");

       String 商品=(String)session.getAttribute("goods");

       姓名=getString(姓名);

       商品=getString(商品);

    %>

    <P>这里是结帐处

    <P><%=顾客%>的姓名是:

      <%=姓名%>

    <P>您选择购买的商品是:

      <%=商品%>

    </FONT>

    </BODY>

    </HTML>

 

 

 

实例:session.setAttribute()与session.getAttribute()的再举例:

    //猜数游戏:系统自动产生一个随机数,能判断你猜大了或者猜小了;猜对了可以告知你用的时间,猜的次数,以及所猜的数;

    //要点:通过session保存随机数以及猜的次数

    文件一:

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

    <HTML>

    <BODYbgcolor=cyan><FONT Size=1>

    <P>随机分给了你一个1到100之间的数,请猜!

      <%   

         int number=(int)(Math.random()*100)+1;

         session.setAttribute("count",newInteger(0));

         //count变量保存是猜的次数

         session.setAttribute("save",newInteger(number));

         //save变量保存产生的随机数

      %>

    <BR>

    <P>输入你的所猜的数

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

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

           <INPUT TYPE="submit"value="送出"name="submit">

       </FORM>

    </FONT>

    </BODY>

    </HTML>

 

    文件二://result.jsp

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

    <HTML>

    <BODYbgcolor=cyan><FONT Size=1>

    <BR>

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

         if(str==null)

           {str="0";

           }

          int guessNumber=Integer.parseInt(str);

             //guessNumber中保存了上一页面中表单中文本框中的提交值

 

          Integer integer=(Integer)session.getAttribute("save");

          int realnumber=integer.intValue();

          //realnumber保存的是上一页面中产生的随机数

 

        //将文本框提交的值与产生的随机数比较,分为三种情况:相同,大于,小于

        //三种情况分别跳转到不同的页面,进一步处理

         if(guessNumber==realnumber)

             {int n=((Integer)session.getAttribute("count")).intValue();

             n=n+1;

               session.setAttribute("count",newInteger(n));

               response.sendRedirect("success.jsp");

             }

           else if(guessNumber>realnumber)

             {int n=((Integer)session.getAttribute("count")).intValue();

               n=n+1;

               session.setAttribute("count",newInteger(n));

               response.sendRedirect("large.jsp");

             }

        elseif(guessNumber<realnumber)

             {int n=((Integer)session.getAttribute("count")).intValue();

               n=n+1;

               session.setAttribute("count",newInteger(n));

              

               response.sendRedirect("small.jsp");

             }

    %>

    </FONT>

    </BODY>

    </HTML>

 

    文件三://large.jsp

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

    <HTML>

    <BODYbgcolor=cyan><FONT Size=1>

    <BR>

    <P>所猜的数比实际的数大,请再猜:

       <FORM action="result.jsp"method="get" name=form >

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

           <INPUT TYPE="submit"value="送出"name="submit">

       </FORM>

    </FONT>

    </BODY>

    </HTML>

 

    文件四://small.jsp

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

    <HTML>

    <BODYbgcolor=cyan><FONT Size=1>

    <BR>

    <P>所猜的数比实际的数小,请再猜:

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

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

           <INPUT TYPE="submit"value="送出"name="submit">

       </FORM>

    </FONT>

    </BODY>

    </HTML>

 

    文件五://success.jsp

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

    <HTML>

    <BODYbgcolor=cyan><FONT Size=1>

    <%  intcount=((Integer)session.getAttribute("count")).intValue();

         intnum=((Integer)session.getAttribute("save")).intValue();

      long startTime=session.getCreationTime();

      long endTime=session.getLastAccessedTime();

    %>

    <P>恭喜你,猜对了

    <BR>

    <P>您共猜了<%=count%>次

    <P>用时<%=(endTime-startTime)/1000%>秒。

    <P>这个随机数字就是<%=num%>

    <P>您必须关掉浏览器才能获得新的数。

    </FONT>

    </BODY>

    </HTML>

 

作业:  //输入帐号并选择用户类型,若用户不是jacky,则停留在登录页面;否则的话,根据用户的不同类型显示不同的链接

    //要求是三个页面:login.htm,check.jsp,success.jsp;success.jsp中显示欢迎jacky(来自session)。

 

 

application内置对象:

    含义与作用:它代表着整个服务器中的所有用户;生命周期为服务器开启后到服务器关闭;

    常用方法:

    getAttribute(Stringname):返回由name指定的application属性值;

    getAttriubteNames():返回所有application对象的属性名字;结果是一个枚举类型;

    getInitParameter(Stringname):返回由name指定的application某个属性的初始值;

    getServletInfo():返回当前版本的信息;

    setAttribute(Stringname,Object object):设置name名字的application属性值为object;

   

 

    实例:计算某用户是第多少个访问者

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

    <HTML>

    <BODY>

        <%!  

         synchronized void countPeople()

             {ServletContext application=getServletContext();

             //有的容器可能不支持直接使用application对象,可以使用getServletContext()方法初始化;

 

 

                Integernumber=(Integer)application.getAttribute("Count");

                //变量Count的生命周期为application

 

                //服务器打开后第一个人第一次访问此页时,此时为null

                if(number==null)

                   { number=new Integer(1);

                     application.setAttribute("Count",number);

                     //若为null,则设置值为1

                   }

              else

                   { number=new Integer(number.intValue()+1);

                     //在原值的基础上加1后再存回去

                     application.setAttribute("Count",number);

                   }

             }

        %>

        <%if(session.isNew())

           { countPeople();

               IntegermyNumber=(Integer)application.getAttribute("Count");

              session.setAttribute("MyCount",myNumber);

               //将访问量存在session中,以使某特定用户可以在整个会话中获取自己是第多少个用户;

           }

        %>

    <P><P>您是第

       <%int a=((Integer)session.getAttribute("MyCount")).intValue();

        %>

        <%=a%>

    个访问本站的客户。

    </BODY>

    </HTML>

 

 

 

 

JDBC:java DataBase Connectivity,利用它可以对数据库中的数据进行操作,比如:select,update,delete,insert等;

 

JDBC主要完成的三件事:

    1。与数据库进行链接;

    2。向数据库发送SQL语句;

    3。处理数据库返回的结果;

 

数据库的驱动程序类型:

    1。jdbc-odbc桥

    2。部分java,部分本机驱动程序;

    3。中间数据访问服务器;

    4。纯java驱动程序

 

    四者的区别,自行网上查找

 

两个相关的包:

    1。java.sql:提供对数据访问的基本服务,如:链接,执行更新,事务处理等;

    2。javax.sql:提供了数据访问的高级功能;比如:分布式事务等;

 

JDBC-ODBC数据处理的主要流程:

    1。建立数据源;包括数据库的建立,以及ODBC的设置;

    2。建立一个JDBC-ODBC桥接器,即加载桥接器驱动程序:

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

        说明:Class是java.lang中的一个类,它的静态方法forName()可以建立一个桥接器;建立桥接器有可能产生异常,

              所以,标准写法为:

             try{

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

             }

             catch(ClassNotFoundExceptione)

             {}

 

   

    3。连接到数据库:

        Connectioncon=DriverManager.getConnection("jdbc:odbc:数据源名字","用户名","密码");

        说明:  第一:要访问数据库,必须建立连接;

             第二:Connection类是java.sql中的,用它建立一个连接对象;使用DriverManager的getConnection()静态方法

                 来实例化对象;

             第三:若无用户名和密码,则相应处设为"","";通常Access没有帐号,其它数据库则有帐号;

             第四:数据源名字来自于步骤1。中的设置;

        如:连接到SQL server 中的pubs数据库,假设步骤1.中设置了数据源名叫myPubs

             try{

                 Connectioncon=DriverManager.getConnection("jdbc:odbc:myPubs","sa","");

             }

             catch(SQLExceptione)

             {}

    4。建立SQL语句对象:

        try{

             Statementsql=con.createStatement();

        }

        说明:前面语句是创建了一个SQL语句对象;

 

    5。返回查询结果集对象:

        ResultSetrs=sql.executeQuery("select * from 表名");

        说明:executeQuery有可能换成其它的方法;结果保存在一个ResultSet(结果集)对象中;

    6。获取ResultSet中的数据:

        相关方法有:next();getByte();getDouble();getDate();getFloat();getLong();getInt();getString()等;

 

    7。关闭连接对象:

        con.close();

 

 

实例:将student表中的所有记录以表格形式输出

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

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

    <!--首选必须导入此包-->

    <HTML>

    <BODY>

    <%

    //使用数据库的几个步骤

    //首先:建立数据链接.

    //实例化statement对象,con.createStatement()

    //实例化ResultSet对象,sql.executeQuery("select *from ....")

    %>

     <% Connection con;

        Statementsql;

        ResultSetrs;

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

           }

        catch(ClassNotFoundExceptione){System.out.println(e);}

 

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

        //第三,四个参数为帐号和密码.

              sql=con.createStatement();///**************

              rs=sql.executeQuery("SELECT * FROMstudents");

              out.print("<Table Border>");             //输出表格

              out.print("<TR>");                           //以下八行输出表头

                 out.print("<THwidth=100>学号</TH>");

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

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

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

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

                 out.print("<Thwidth=50>"+"出生日期");

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

 

           while(rs.next())                       //循环输出表中所有符合条件的记录

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

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

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

                  out.print("<TD>"+rs.getInt("数学成绩")+"</TD>");//getXXX()的参数是表中的字段名或者字段索引位置

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

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

                  out.print("<TD>"+rs.getDate("出生日期")+"</TD>");

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

             }

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

             con.close();

         }

       catch(SQLException e1){System.out.println(e1);}

     %>

    </BODY>

    </HTML>

 

 

 

JDBC常见的API:

    有:DriverManager,Connection,Statement,PreparedStatement,CallableStatement,ResultSet接口或者类。

 

    DriverManager:

    作用:常用于管理JDBC驱动程序;通过getConnection()方法来取得Connection对象的引用。

    常见方法:

    publicstatic synchronized Connection getConnection(String url,String user,Stringpassword)throws SQLException

    //上面方法获得url对应的数据库的一个链接

 

    publicstatic void setLoginTimeout(int seconds)

    //上面方法设置登录时驱动程序等待的时间

 

 

    Connection:

    作用:通过DriverManager.getConnection()取得的;利用它可以创建Statement,PreparedStatement,CallableStatement等对象;

    常见方法:

    StatementcreateStatement()throws SQLException

    //上面方法返回一个Statement对象

 

    PreparedStatementpreparedStatement(String sql)throws SQLException

    //上面方法返回一个PrepareStatement对象,并能把SQL语句提交到数据库进行预编译;

 

    CallableStatementprepareCall(String sql)

    //上面方法返回一个CallableStatement对象,该对象能够处理存储过程;

 

    voidsetAutoCommit(Boolean autoCommit)throws SQLException

    //上面方法设置事务的提交模式

   

    voidcommit()throws SQLException

    //上面方法进行当前业务开始以来所有改变;

 

    voidrollback()throws SQLException

    //上面方法放弃当前业务开始以前的所有改变;

 

 

    Statement:

    作用:向数据库提交SQL语句并返回相应结果;语句可以是SQL的查询,修改,插入等;

    常见方法:

    ResultSetexecuteQuery(String sql)throws SQLException

    //上面方法执行一个查询语句将结果返回在ResultSet对象中;

 

    intexecuteUpdate(String sql)throws SQlException

    //上面方法执行一个修改或插入和删除的语句,并返回发生改变的记录数;

 

    Booleanexecute(String sql)thows SQLException

    //上面方法执行一个修改或插入和删除语句,返回的布尔值表示语句是否执行成功;

 

 

    PreparedStatement:

    作用:此接口继承了Statement接口;因为可以传递参数,所以常用于那些稍加变化就可以反复执行的SQL语句;

    常见方法:

    setString(索引,值)

    setDouble(索引,值)

    ......

    executeUpdate()执行上面的设定,更新记录

    此对对象的创建是通过Connection对象的prepareStatement方法实现的,可以参见如下形式:

    PreparedStatementpstmt=conn.prepareStatement("insert into stock values(?,?)");

    pstmt.setString(1,"china");

    pstmt.setDouble(2,33d);

    pstmt.executeUpdate();

 

 

   

    CallableStatement:

    作用:继承PreparedStatement接口;可以执行存储过程;

    常见方法:

    同上

    此对象的执行大致如下:

    1.设有一个存储过程如下:

        createprocedure MyProc @para1 varchar(20),@para2 int,@para3 datetime

             asinsert into contact(userName,mobile,lastcontact)

                         values(@para1,@para2,@para3)

    2.调用:

        CallableStatementstmt=conn.prepareCall("{call MyProc(?,?,?)}");

        stmt.setString(1,"XiaoMing");

        stmt.setInt(2,123456);

        stmt.setDate(3,newjava.sql.Date(new java.util.Date().getTime()));

        stmt.executeUpdate();

    3.说明:CallableStatement的创建是conn.prepareCall("call存储过程名(N个?号)");?号个数为存储过程的参数个数;

        这些问号需要使用CallableStatement对象的setXXX()方法传递参数;最后调用executeUpdate()方法,实现更新记录;

 

 

    ResultSet:

    作用:包含了Statement对象产生的结果集;利用它可以访问相应的数据;

    常见方法:

    getXXXX();setXXX()见上课;

    voidclose()throws SQLException

    //上面方法释放ResultSet对象资源程

 

    Booleanabsolute(int row)throws SQLException

    //将结果集移动到指定的行;若取值为负数,则移动到倒数第N行。

 

    ResultSetMetaDatagetMetaData()throws SQLEXception

    //返回包含当前结果集说明的对象;这些说明有列号,列类型等属性;

 

   

    publicboolean previous()

    //将游标向上移动;当移到第一行之前时,返回false.

 

    publicvoid beforeFirst()

    //游标移动到结果集的初始位置,即第一行之前;

 

    publicvoid afterLast()

    //将游标移动结果集最后一行之后;

 

    publicvoid first()

    //将游标移到结果集的第一行

   

    publicvoid last()

    //将游标移到结果集的最后一行

 

 

    publicboolean isAfterLast()

    //判断游标是否在最后一行之后

 

    publicboolean isBeforeFirst()

    //判断游标是否在第一行之前

 

    publicboolean isFirst()

    //判断游标是否在第一行

 

    publicboolean isLast()

    //判断游标是否在最后一行

 

    publicint getRow()

    //取得当前游标所在的行号;若结果集没有行,则返回0.

 

 

游动查询:

    说明:我们上节课学习的next()方法,只能顺序的查询;若要游动查询,则需使用下面方法:

    StatementcreateStatement(int resultSetType, int resultSetConcurrency)

    resultSetType取值为:

        1.TYPE_FORWARD_ONLY

                 游标只能向下游动

        2.TYPE_SCROLL_INSENSITIVE

             游标可以上下游动,当数据库变化时,当前结果集不变。

             3.TYPE_SCROLL_SENSITIVE 

             游标可以上下游动,当数据库变化时,当前结果集同步改变。

 

    resultSetConcurrency)取值为:

        1。CONCUR_READ_ONLY

             不能用结果集更新数据库中的表

             2。CONCUR_UPDATABLE 

             能用结果集更新数据库中的表

 

    实例:游动查询

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

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

    <HTML>

    <BODY>

    <%

    //使用rs对象的next()方法,只能顺序的移动.

    //有时,需要前后移动;或显示指定的一条记录.

    //则,需要一个可滚动的结果集.

    //Statementsql=con.createStatement(int type,int concurrency)

    //type:

    //ResultSet.TYPE_FORWORD_ONLY只能向下游动

    //ResultSet.TYPE_SCROLL_INSENSITIVE可以上下游动,但是数据库变化时,当前结果不变。

    //ResultSet.TYPE_SCROLL_SENSITIVE可以上下游动,当数据库变化时,当前结果变化。

    //concurrency

    //ResultSet.CONCUR_READ_ONLY不能用于更新.

    //ResultSet.CONCUR_UPDATETABLE可以用于更新.

    %>

     <% String name,number;

        intmath,physics,english;

        Connectioncon;

        Statementsql;

        ResultSetrs;

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

           }

        catch(ClassNotFoundExceptione){}

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

              sql=

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

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

              rs=sql.executeQuery("SELECT * FROMstudents");

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

                 rs.last();

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

               int lownumber=rs.getRow();

              out.print("该表共有"+lownumber+"条记录");

              out.print("<BR>现在逆序输出记录:");

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

              out.print("<TR>");

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

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

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

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

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

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

           //为了逆序输出记录,需将游标移动到最后一行之后:

             rs.afterLast();//还有beforeFirst()

             while(rs.previous())//游标前移.还有first();last();

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

                  number=rs.getString("学号");

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

                  name=rs.getString("姓名");

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

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

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

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

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

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

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

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

              }

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

           out.print("单独输出第4条记录<BR>");

             rs.absolute(4);

                  number=rs.getString(1);

                  out.print(number+",");

                  name=rs.getString(2);

                  out.print(name+",");

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

                  out.print(math+",");

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

                  out.print(english+",");

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

                  out.print(physics+"。");

             con.close();

         }

       catch(SQLException e1) {}

     %>

    </BODY>

    </HTML>

 

 

    实例:随机查询

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

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

    <HTML>

    <BODY>

     <% String xuehao,name;

        intmath;

        Connectioncon;

        Statementsql;

        ResultSetrs;

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

           }

        catch(ClassNotFoundExceptione){}

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

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

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

              rs=sql.executeQuery("SELECT * FROMstudents");

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

              out.print("<TR>");

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

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

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

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

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

                 rs.last();

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

               int lownumber=rs.getRow();

             //获取记录数:

             intnumber=lownumber;

             doublesum=0;

             int抽取数目=3;

             intold_i[]={0,0,0,0};

             intk=抽取数目;

             intj=0;

                while(抽取数目>0)

                     {inti=(int)(Math.random()*number+1);//随机获取一个1到number之间的数。

                      boolean boo=false;

                      for(int m=0;m<old_i.length;m++)   //查找该行是否已被取出。

                           {if(i==old_i[m])

                            boo=true;

                           }

                      if(boo) continue;   //假如该行已被取出,结束本次循环,继续产生随机数。

                      rs.absolute(i);                    //游标移到这一行。

                      out.print("<TR>");

                      xuehao=rs.getString("学号");              //获取该行学号字段的值。

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

                      name=rs.getString("姓名");              //获取该行姓名字段的值。

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

                      math=rs.getInt("数学成绩");        //获取改行数学成绩字段的值。

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

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

                      sum=sum+math;

                      抽取数目--;

                      old_i[j]=i;        //记录已取出的行号。

                      j++;

         }

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

              out.print("平均成绩是:"+sum/k);

              con.close();

         }

       catch(SQLException e1) {}

     %>

    </BODY>

    </HTML>

 

 

 

参数查询:

    说明:即根据表单中用户的输入进行查询

   

    实例一://要点:SQL语句中where语句的用法

    文件一:提供两个表单,可以按姓名查询,也可以按分数查询

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

    <HTML>

    <BODY>

    <Fontsize=1>

 

    <FORMaction="byname.jsp" Method="post">

     <P>成绩查询

     <P>输入姓名:

      <Input type=text name="name">

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

    </Form>

 

    <FORMaction="byscore.jsp" Method="post" >

     <P>根据分数查询名单:<BR>  英语分数在

    <Inputtype=text name="englishmin" value=0>

      和

     <Input type=textname="englishmax" value=100>

      之间

     <BR> 数学分数在

    <Inputtype=text name="mathmin" value=0>

      和

     <Input type=text name="mathmax"value=100>

      之间

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

    </Form>

 

 

    </BODY>

    </HTML>

 

    文件二://byname.jsp要点: "SELECT * FROM studentsWHERE 姓名 = "+"'"+name+"'";name是文本框提交的值;

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

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

    <HTML>

    <BODY>

      <% //获取提交的姓名:

        Stringname=request.getParameter("name");

               if(name==null)

                 {name="";

                 }

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

         name=new String(b);

        Connectioncon=null;

        Statementsql=null;

        ResultSetrs=null;

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

               }

           catch(ClassNotFoundException e){}

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

                  sql=con.createStatement();

                  String condition="SELECT * FROM studentsWHERE 姓名 = "+"'"+name+"'";

                  rs=sql.executeQuery(condition);

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

                   out.print("<TR>");

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

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

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

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

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

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

                   while(rs.next())

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

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

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

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

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

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

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

                         }

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

                   con.close();

                }

        catch(SQLExceptione)

                {  }

    %>

    </BODY>

    </HTML>

 

    文件三://byscore.jsp;要点:select * from 表名 where 英语成绩>22 and 英语成绩<33 and 数学成绩>22 and 数学成绩<100

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

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

    <HTML>

    <BODY>

      <% //获取提交的分数的最大值和最小值:

        Stringenglishmax=request.getParameter("englishmax");

               if(englishmax==null)

                 {englishmax="100";

                 }

        Stringenglishmin=request.getParameter("englishmin");

               if(englishmin==null)

                 {englishmin="0";

                 }

        Stringmathmax=request.getParameter("mathmax");

               if(mathmax==null)

                 {mathmax="100";

                 }

        Stringmathmin=request.getParameter("mathmin");

               if(mathmin==null)

                 {mathmin="0";

                 }

        Connectioncon=null;

        Statementsql=null;

        ResultSetrs=null;

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

               }

           catch(ClassNotFoundException e){}

           try

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

                sql=con.createStatement();

                String eCondition="英语成绩 <= "+englishmax+" AND "+"英语成绩 >= "+englishmin;

                String mCondition="数学成绩 <= "+mathmax+" AND "+"数学成绩 >= "+mathmin;

                String condition="SELECT * FROMstudents WHERE "+mCondition+" and "+eCondition;

                rs=sql.executeQuery(condition);

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

                 out.print("<TR>");

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

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

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

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

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

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

           while(rs.next())

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

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

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

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

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

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

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

                 }

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

          con.close();

         }

       catch(SQLException e)

               {}

    %>

    </BODY>

    </HTML>

 

    实例二://要点:SQL语句中的order by语句

    文件一://要点:提供表单三个单选按钮

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

    <HTML>

    <BODY>

    <P>查询成绩:

    <Fontsize=1>

    <FORMaction="byname1.jsp" method=post name=form>

           <INPUT type="radio"name="R" value="姓名">按姓氏排序

           <INPUT type="radio"name="R" value="数学成绩+英语成绩+物理成绩">按总分排序

           <INPUT type="radio"name="R" value="英语成绩">按英语排序

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

    </Form>

    </BODY>

    </HTML>

 

    文件二://要点:select * from 表名 order by 姓名

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

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

    <HTML>

    <BODY>

      <% //获取提交的排序方式:

        Stringname=request.getParameter("R");

               if(name==null)

                 {name="";}

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

         name=new String(b);

        Stringnumber,xingming;

        Connectioncon=null;

        Statementsql=null;

        ResultSetrs=null;

        intmath,english,physics;

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

               }

           catch(ClassNotFoundException e){}

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

              sql=con.createStatement();

              String condition="SELECT * FROM studentsORDER BY "+name;

              rs=sql.executeQuery(condition);

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

                 out.print("<TR>");

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

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

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

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

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

                 out.print("<THwidth=50>"+"总成绩");

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

                while(rs.next())

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

                    number=rs.getString("学号");

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

                    xingming=rs.getString("姓名");

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

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

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

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

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

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

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

                    int total=math+english+physics;

                    out.print("<TH>"+total+"</TH>");

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

                   }

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

             con.close();

           }

        catch(SQLExceptione)

           {  }

     %>

    </BODY>

    </HTML>

 

    实例三://要点:通配符的使用

    文件一://表单,提供一个文本框,将查询此文本框中输入的姓

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

    <HTML>

    <BODY>

    <P>查询成绩:

    <Fontsize=1>

    <P>输入学生的姓氏:

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

           <INPUT type="text"name="name" value="王">

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

    </Form>

    </BODY>

    </HTML>

 

    文件二://要点select * from 表名where 姓名 like '毕%'

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

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

    <HTML>

    <BODY>

      <% //获取提交的姓氏:

        Stringname=request.getParameter("name");

               if(name==null)

                 {name="";

                 }

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

         name=new String(b);

        Connectioncon=null;

        Statementsql=null;

        ResultSetrs=null;

        intmath,english,physics;

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

               }

           catch(ClassNotFoundException e){}

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

                sql=con.createStatement();

                String condition="SELECT * FROMstudents where 姓名 like'"+name+"n'" ;

                rs=sql.executeQuery(condition);

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

                 out.print("<TR>");

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

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

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

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

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

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

           while(rs.next())

                {

                     out.print("<TR>");

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

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

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

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

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

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

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

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

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

            

                 }

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

          con.close();

         }

        catch(SQLExceptione)

         {  }

    %>

    </BODY>

    </HTML>

 

    将上面文件改成下面文件,一样通过,请自行分析:

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

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

    <HTML>

    <BODY>

      <% //获取提交的姓氏:

        Stringname=request.getParameter("name");

               if(name==null)

                 {name="";

                 }

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

         name=new String(b);

        Stringnumber,xingming;

        Connectioncon=null;

        Statementsql=null;

        ResultSetrs=null;

        intmath,english,physics;

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

               }

           catch(ClassNotFoundException e){}

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

                sql=con.createStatement();

                String condition="SELECT * FROMstudents" ;

                rs=sql.executeQuery(condition);

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

                 out.print("<TR>");

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

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

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

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

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

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

           while(rs.next())                       //要点:循环每一条记录,符合条件者输出

                { number=rs.getString(2);

                  xingming=rs.getString(3);               

                  if(xingming.startsWith(name))                //核心处

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

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

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

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

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

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

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

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

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

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

                    }

                 }

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

          con.close();

         }

        catch(SQLExceptione)

         {  }

    %>

    </BODY>

    </HTML>

 

 

 

    小结:通过以上几个例子,说明,只要是标准的SQL语句中的select语句,就可以使用在rs.executeQuery()方法中.

        所以,你想要实现什么样的功能,只要了解相应的select语句用法就可以;比如:top n;between and 等;

 

 

 

关于更新记录,插入记录及删除记录:

    注意:需要使用Statement对象的executeUpdate()方法;而不是executeQuery()方法;后者用于执行select语句;

 

    实例一://修改

    文件一://表单,显示原始数据

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

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

    <HTML>

    <BODYbgcolor=pink >

    <FORMaction="newResult.jsp" method=post>

    输入要修改成绩的同学的姓名:<BR>

    <Inputtype="text" name="name">

    <BR>输入新的数学成绩:

    <Inputtype="text" name="math">

    <BR>输入新的英语成绩:

    <Inputtype="text" name="english">

    <BR>输入新的物理成绩:

    <Inputtype="text" name="physics">

    <BR><Inputtype="submit" name="b" value="提交更新">

    <P>数据库更新前的数据记录是:

     <% String name,number;

        intmath,physics,english;

        Connectioncon;

        Statementsql;

        ResultSetrs;

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

           }

        catch(ClassNotFoundExceptione){}

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

              sql=con.createStatement();

              rs=sql.executeQuery("SELECT * FROMstudents");

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

              out.print("<TR>");

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

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

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

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

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

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

           while(rs.next())

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

                  number=rs.getString("学号");

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

                  name=rs.getString("姓名");

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

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

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

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

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

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

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

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

             }

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

             con.close();

         }

       catch(SQLException e1) {}

     %>

    </Form>

    </BODY>

    </HTML>

 

 

    文件二://newResult.jsp

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

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

    <HTML>

    <BODYbgcolor=pink ><Font size=1>

      <% //获取提交的姓名:

        Stringname=request.getParameter("name");

               if(name==null)

                 {name="";

                 }

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

         name=new String(b);

         System.out.println(name);

         //获取提交的新的数学成绩:

        StringnewMath=request.getParameter("math");

               if(newMath==null || newMath=="")

                 {newMath="10";

                 System.out.println("newmath is null");

                 }

                  System.out.println(newMath);

        //获取提交的新的英语成绩:

        StringnewEnglish=request.getParameter("english");

               if(newEnglish==null)

                 {newEnglish="10";

                 }

                  System.out.println(newEnglish);

         //获取提交的新的物理成绩:

         StringnewPhysics=request.getParameter("physics");

               if(newPhysics==null)

                 {newPhysics="10";

                 }

        Connectioncon=null;

        Statementsql=null;

        ResultSetrs=null;

        Stringnumber,xingming;

        intmath,english,physics;

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

               }

           catch(ClassNotFoundException e){}

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

           sql=con.createStatement();

           String condition1="UPDATE students SET 数学成绩 = "+newMath+" WHERE 姓名="+"'"+name+"'";

           String condition2="UPDATE students SET 英语成绩 = "+newEnglish+" WHERE 姓名="+"'"+name+"'";

           String condition3= "UPDATE students SET物理成绩 = "+newPhysics+" WHERE 姓名="+"'"+name+"'" ;

           //执行更新操作:

           sql.executeUpdate(condition1);

           sql.executeUpdate(condition2);

           sql.executeUpdate(condition3);

           //显示更新后的表中的记录:

         %>

         <P>更新后的表的记录:

         <%

           rs=sql.executeQuery("SELECT * FROMstudents");

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

                 out.print("<TR>");

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

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

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

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

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

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

           while(rs.next())

                {

                  out.print("<TR>");

                      number=rs.getString("学号");

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

                      xingming=rs.getString("姓名");

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

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

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

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

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

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

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

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

               }

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

          con.close();

         }

        catch(SQLExceptione)

         { }

     %>

    </FONT>

    </BODY>

    </HTML>

 

 

    实例二://插入记录

    文件一:

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

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

    <HTML>

    <BODYbgcolor=pink >

 

    <P>添加新的记录到数据库:

    <FORMaction="newDatabase.jsp" method=post>

    同学学号:

    <Inputtype="text" name="number">

    <BR>同学姓名:

    <Inputtype="text" name="name">

    <BR>数学成绩:

    <Inputtype="text" name="math">

    <BR>英语成绩:

    <Inputtype="text" name="english">

    <BR>物理成绩:

    <Inputtype="text" name="physics">

    <BR><Inputtype="submit" name="b" value="提交添加">

    <P>数据库添加记录前的数据记录是:

     <% String name,number;

        intmath,physics,english;

        Connectioncon;

        Statementsql;

        ResultSetrs;

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

           }

        catch(ClassNotFoundExceptione){}

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

              sql=con.createStatement();

              rs=sql.executeQuery("SELECT * FROMstudents");

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

              out.print("<TR>");

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

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

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

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

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

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

           while(rs.next())

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

                  number=rs.getString("学号");

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

                  name=rs.getString("姓名");

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

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

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

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

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

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

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

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

             }

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

             con.close();

         }

       catch(SQLException e1) {}

     %>

    </Form>

    </BODY>

    </HTML>

 

    //文件二:newDatabase.jsp

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

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

    <HTML>

    <BODYbgcolor=pink ><Font size=1>

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

        Stringnumber=request.getParameter("number");

               if(number==null)

                 {number="";

                 }

         byteb[]=number.getBytes("ISO-8859-1");

         number=new String(b);

        //获取提交的姓名:

        Stringname=request.getParameter("name");

               if(name==null)

                 {name="";

                 }

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

         name=new String(c);

         //获取提交的新的数学成绩:

        Stringm=request.getParameter("math");

               if(m==null)

                 {m="-100";}

        //获取提交的新的英语成绩:

        Stringe=request.getParameter("english");

               if(e==null)

                 {e="-100";}

         //获取提交的新的物理成绩:

         Stringp=request.getParameter("physics");

               if(p==null)

                 {p="-100";}

        Connectioncon=null;

        Statementsql=null;

        ResultSetrs=null;

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

           catch(ClassNotFoundException event){}

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

           sql=con.createStatement();

           String condition="INSERT INTO students(学号,姓名,数学成绩,英语成绩,物理成绩)VALUES"+"("+"'"+number+"','"+name+"',"+m+","+e+","+p+")";

          // inser studentvalues('s232323','ss',7p,aa,44)

           sql.executeUpdate(condition); //执行添加操作:

           //显示添加新记录后表中的记录:

         %>

         <P>添加新记录后的表:

         <%

           rs=sql.executeQuery("SELECT * FROMstudents ORDER BY 学号 ");

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

                 out.print("<TR>");

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

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

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

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

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

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

           while(rs.next())

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

                     Stringn=rs.getString("学号");

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

                     Stringxingming=rs.getString("姓名");

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

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

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

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

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

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

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

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

              }

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

          con.close();

         }

        catch(SQLExceptionevent)

         { }

     %>

    </FONT>

    </BODY>

    </HTML>

 

    实例三://删除记录

    文件一:

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

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

    <HTML>

    <BODYbgcolor=pink >

    <Fontsize=1>

    <P>删除记录:

    <FORMaction="delete.jsp" method=post>

    输入被删除记录的学号:

    <Inputtype="text" name="number">

    <BR>

    <BR><Inputtype="submit" name="b" value="提交删除">

    </FORM>

    <P>数据库删除前的数据记录是:

     <% String name,number;

        intmath,physics,english;

        Connectioncon;

        Statementsql;

        ResultSetrs;

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

           }

        catch(ClassNotFoundExceptione){}

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

              sql=con.createStatement();

              rs=sql.executeQuery("SELECT * FROMstudents");

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

              out.print("<TR>");

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

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

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

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

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

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

           while(rs.next())

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

                  number=rs.getString(2);

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

                  name=rs.getString(3);

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

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

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

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

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

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

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

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

             }

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

             con.close();

         }

       catch(SQLException e1) {}

     %>

    </Font>

    </BODY>

    </HTML>

 

    文件二://delete.jsp

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

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

    <HTML>

    <BODYbgcolor=pink ><Font size=1>

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

        Stringnumber=request.getParameter("number");

             if(number==null)

                 {number="";

                 }

         byteb[]=number.getBytes("ISO-8859-1");

         number=new String(b);

        Connectioncon=null;

        Statementsql=null;

        ResultSetrs=null;

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

               }

           catch(ClassNotFoundException event){}

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

           sql=con.createStatement();

           //删除操作:

           String deleteAll="DELETE  FROM students WHERE 学号"+" = "+"'"+number+"'";

           sql.executeUpdate(deleteAll);

          %>

         <P>删除记录后的表:

         <%

           rs=sql.executeQuery("SELECT * FROMstudents ORDER BY 学号 ");

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

                 out.print("<TR>");

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

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

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

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

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

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

           while(rs.next())

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

                     Stringn=rs.getString(2);

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

                     Stringxingming=rs.getString(3);

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

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

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

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

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

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

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

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

              }

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

          con.close();

         }

        catch(SQLExceptionevent)

               {out.print(""+event);

               }

     %>

    </FONT>

    </BODY>

    </HTML>

 

分页显示记录:

    假设总记录数为m,每页显示数量是n,那么总页数的公式为:

    情况一:如果m除以n的余数不为零,总页数等于m除以n的商加1。

    情况二:如果m除以n的除数为零,总页数等于m除以n的商。

 

    所以:

        总页数=(m%n)==0?(m/n):(m/n+1)

 

    第p页的记录在结果集中的游标位置:

    (p-1)*n+1

    说明:因为第p页前有p-1个完整页,而每页显示n条,所以。。。。

 

实例:

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

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

    <HTML>

    <BODY>

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

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

     %>

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

    <FORMaction="" method=get >

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

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

     </FORM>

    <%  Connection con;

        Statementsql;

        ResultSetrs;

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

           }

        catch(ClassNotFoundExceptione){}

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

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

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

              rs=sql.executeQuery("SELECT * FROMstudents");

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

                 rs.last();

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

              int lastRow=rs.getRow();

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

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

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

             intshowPage=1;

             //告知客户总页数:

          %>

             <P>共有<%=pageCount%>页

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

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

               Stringinteger=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("<THwidth=100>"+"学号");

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

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

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

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

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

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

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

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

                  out.print("<TD>"+rs.getString("姓名")+"</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>

 

 

课后作业:在上例基础上添加上一页,下一页,第一页,最后一页的链接;但第一页时无上一页,第一页链接;最后一页同理;

 

不使用Jdbc-Odbc桥接器,利用数据库商提供的驱动程序直接链接数据库:

问题一:驱动程序的获得,到sun的官方网站下载;

问题二:SQL Server 的三个驱动:msutil.jar;mssqlserver.jar;msbase.jar

    Oracle的一个驱动:在oracle安装目录oracle/ora9i/jdbc/class12.zip,需将class12.zip改名为class12.jar

    My SQL的一个驱动:mm.mysql-2.0.4-bin.jar

问题三:这些驱动放在哪儿,Tomcat能找到:放于Tomcat/common/lib下;或者放于站点的web-info/lib下

问题四:Class.forName(驱动),getConnection(URL,帐号,密码)不同数据库的分别替换如下:

 

==========================================JDBC-ODBC桥 ==========================================

driver(驱动) =sun.jdbc.odbc.JdbcOdbcDriver

url   =jdbc:odbc:odbc数据源名

 

========================================== SQL==========================================

driver   =com.microsoft.jdbc.sqlserver.SQLServerDriver

url      =jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=数据库名

user     =sa                ▲主机名或者主机IP:127.0.0.1;1433是端口号   

password = ""

 

==========================================Oracle ==========================================

driver   =oracle.jdbc.driver.OracleDriver

url      =jdbc:oracle:thin:@HostName:1521:数据库名

user     =scott    ▲主机名或者主机IP:127.0.0.1;1521为端口号

password = tiger

 

========================================== MySQL==========================================

driver   =org.gjt.mm.mysql.Driver

url      =jdbc:mysql://localhost/testDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1

          //testDB为你的数据库名

 

 

利用Tomcat的连接池连接数据库:

    了解:它是在应用程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由应用程序动态地对池中的连接进行申请、

          使用和释放。若有并发请求,则进行排队;这种技术尽可能地重用内存资源,来节省内存,提高了服务效率。

使用步骤:

    第一:修改tomcat/conf/server.xml,配置数据源;

    第二:在程序中使用DataSourcedataSource=(DataSource)context.lookup("java:comp/env/数据源名");

 

实例演示步骤:

    第一:设webapp下有一站点叫ch13;

    第二:打开server.xml文件,在</Context>和</host>之间增加如下描述:

    <Contextpath="/ch13" docBase="ch13" debug="0"   reloadable="true"crossContext="true">  

        <Resourcename="jdbc/bn" auth="Container"type="javax.sql.DataSource"/>  

             <ResourceParamsname="jdbc/bn">   <----数据源名

                    <parameter>  

                     <name>factory</name>     ↓固定写法

                         <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>     

                     </parameter>

              

                 <parameter>     

                                <name>driverClassName</name>  ↓指写驱动  

                             <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>       

                     </parameter>

              

                 <parameter> 

                      <name>url</name>                     ↓数据库名

                      <value>jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=jspdev</value>

                 </parameter>

   

                      <parameter>     ↓提供访问数据库的名用户名和密码

                      <name>username</name>       

                          <value>bn</value>            

                  </parameter>

              

                  <parameter>            

                 <name>password</name>                

                 <value>bn</value>   

                      </parameter>

 

               <parameter>               

                 <name>maxActive</name>               

                     <value>20</value>             

               </parameter>

                   <parameter>       

                     <name>maxIdle</name>            

                 <value>10</value>             

                </parameter>           

                <parameter>  

                     <name>maxWait</name>            

                 <value>-1</value>             

                </parameter>     

            </ResourceParams>    

    </Context>

          

        第三:利用程序建立数据库的连接:

 <!--测试数据源-->

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

 <%@page import="javax.naming.Context" %>

 <%@page import="javax.sql.DataSource"%>

 <%@page import="javax.naming.InitialContext"%>

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

 

 <%

  DataSource ds = null;

   try{

    Context initCtx = new InitialContext();

    Context envCtx = (Context) initCtx.lookup("java:comp/env");

    //从Context中lookup数据源。

     ds =(DataSource)envCtx.lookup("jdbc/bn");

    if(ds!=null)

    {

    out.println("已经获得DataSource!");

    out.println("<br>");

    Connectionconn = ds.getConnection();

    Statementstmt=conn.createStatement();

    ResultSetrst=stmt.executeQuery("select * from book");

    out.println("以下是从数据库中读取出来的数据");

    while(rst.next())

    {

    out.println("bookName:"+rst.getString("bookName"));

    out.println("<br>");

    }

    }

    else

     out.println("连接失败!");

    }

    catch(Exceptionne)

    {

     out.println(ne);

    }

 %>         

 

 

JavaBeans:

    实质:就是java类。

    理解:可以理解为“组件”。

    好处:

        第一:可以实现代码的重用性。

        第二:易编写,易维护,易使用。

        第三:可以在任何安装了java环境的平台上使用,不需要重新编译。

        第四:避免了jsp与html混杂一起,可读性差等缺点。

JavaBeans的分类:

    分为可视化和非可视化;我们在web中使用的常常是非可视化的。

 

/////////////////////////////////////////////编写

Beans编写的要求:

    1。如果成员变量是XXX,那么为获取和更改成员变量的值,则在类中使用方法:

        getXxx():获取成员变量的值;

        setXxx():修改成员变量的值;

    2。对于boolean型的变量,可以使用isXxx()方法;

    3。类中的方法的访问属性都必须是public的。

    4。类如果有构造方法,则构造方法也必须是public的,并且不能有参数;

    5。Bean通常都要放于某个包内;

 

一个Bean编写的例子:

    packagecircle;          //遵守通常放于包中

    importjava.io.*;

    publicclass Circle 

    {

      int radius;            //成员变量

      public Circle()        //构造不必有,有则须是public,且无参

         { radius=1;

         }

      public int getRadius() //获取成员变量的值的方法,须是public;且注意命名规则

         { return radius;

         }

      public void setRadius(int newRadius)    //设置成员变量的值的方法

         {radius=newRadius;

         }

      public double circleArea()          //bean中可以包含普通方法

         {return Math.PI*radius*radius;

         }

      public double circlLength()

         {return 2.0*Math.PI*radius;

         }

    }

 

/////////////////////////////////////////////编译,与存放

编译:同以前的java类编译方法相同;

存放位置:站点的web-inf/classes/包名;注意:存放的是类文件,源文件java文件则不需放于此

 

/////////////////////////////////////////////jsp中的调用

第一:导入包

    <%@page import="包名.类名"%>

    或者<%@ page import="包名.*"%>

第二:使用jsp的useBean动作标签:

    <jsp:useBeanid="给Bean起的名字"class="bean的完整包名.类名"scope="bean有效范围"></jsp:useBean>

    或者<jsp:useBean id="给Bean起的名字" class="bean的完整包名.类名" scope="bean有效范围" />

   

    说明:

    1。当服务器执行useBean动作时,若发现pageContext对象中已经含有同id的bean,则分配一个对象给客户;

    2。若没有找到,则新建一个名字为id的bean,并分配对象给客户;

    3。scope取值如下:

        page:bean仅在当前页面有效;

        session:bean在整个session中有效;针对一个客户而言;

        request:客户在网站中请求多个页面,这些页面中同名的bean有效;

        application:所有客户共享此bean;直到服务器关闭;

第三:调用bean中的方法:

    <%bean的id名.方法名()%>

 

代码如下:

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

    <%@page import="circle.Circle"%>

    <HTML>

    <BODYbgcolor=cyan><Font size=1>

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

       </jsp:useBean>

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

 

    <P>圆的半径是:

       <%=girl.getRadius()%>

    <P>圆的周长是:

       <%=girl.circlLength()%>

    <P>圆的面积是:

       <%=girl.circleArea()%>

    </BODY>

    </HTML>

 

/////////////////////////////////////////////

使用getProperty(),setProperty()动作修改和获取beans的属性:

setProperty()有三种方式:

第一种:

    <jsp:setPropertyname="给beans起的名字"property="要设置的beans的属性"value="<%=表达式%>" />

    或者 <jsp:setProperty name="给beans起的名字" property="要设置的beans的属性" value="常量" />

 

    说明:上面value中的值会自动的转换成bean中成员变量的数据类型

 

实例:

    packagestudent;

    publicclass Student

    {

        Stringname=null;

        longnumber;

        doubleheight,weight;

        publicString getName()

        {

             try{

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

                 name=newString(b);

                     returnname;

             }

             catch(Exception e)

             {

                 returnname;

             }

        }

 

        publicvoid setName(String newName)

        {

             name=newName;

        }

 

        publiclong getNumber()

        {

             returnnumber;

        }

 

        publicvoid setNumber(long newNumber)

        {

             number=newNumber;

        }

 

        publicdouble getHeight()

        {

             returnheight;

        }

 

        publicvoid setHeight(double newHeight)

        {

             height=newHeight;

        }

 

        publicdouble getWeight()

        {

            return weight;

        }

 

        publicvoid setWeight(double newWeight)

        {

             weight=newWeight;

        }

    }

 

 

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

    <%@page import="student.Student"%>

    <%

    //设置的属性值的数据类型必须与类中定义的类型一致。

    //但若设置的属性值的数据类型是字符串,则可以自动转化为对应的类型。

    %>

    <HTML>

    <BODYbgcolor=cyan><Font size=1>

       <jsp:useBean id="zhang"class="student.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>

 

 

 

 

 

 

setProperty()有三种方式:

第二种:(常用)

    如果需要通过HTTP表单的参数值来设置beans的相应的属性的值,则要求:

        第一:表单中的表单元素的名字必须与beans属性的名字相同;

        第二:使用动作标签:<jsp:setProperty name="给beans起的名字" property="*" />

 

    说明:

        第一:上种是通过<jsp:setProprety name="给beans起的名字" property="属性" value="值">

                 中的value="值",决定相应的属性的值;而此种的值来自表单;

        第二:beans属性的值对应表单中何元素,系统会自动按相同名字匹配;

 

实例:

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

        <%@page import="student.Student"%>

        <HTML>

        <BODY><Font size=1>

        <%

        /*

        表单的参数值用来设置beans的相应的属性的值.

        要求,表单的名字必须与beans的属性的名字相同.

        Jsp会自动将字符串转换为beans属性的类型.

        <jsp:setPropertyname="beans's name" property="*" />

        上面语句就实现了系统会自动根据表单中的名字来匹配beans的属性名.

        */

        %>

        <FORMaction="" Method="post" >

        <P>输入学生的姓名:

        <Inputtype=text name="name">

        <P>输入学生的学号:

         <Input type=textname="number">

        <P>输入学生的身高:

         <Input type=textname="height">

        <P>输入学生的体重:

        <Inputtype=text name="weight">

        <Inputtype=submit value="提交">

        </FORM>

 

 

        <jsp:useBeanid="zhang" class="student.Student" scope="page">

        </jsp:useBean>

 

 

        <jsp:setProperty  name= "zhang"  property="*"  />

 

 

        <P>名字是:

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

        <P>学号是:

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

        <P>身高是:

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

        米

        <P>体重是:

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

        公斤

        </FONT>

        </BODY>

        </HTML>

 

//////////////////////////////////////////////////////////////////////////

setProperty()有三种方式:

第三种:<jsp:setPropertyname="beans的名字"  property="属性名"param="表单元素名" />

 

实例:

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

    <%@page import="student.Student"%>

    <HTML>

    <BODYbgcolor=yellow><Font size=1>

    <FORMaction="" Method="post" >

    <P>输入学生的姓名:

    <Inputtype=text name="name">

    <P>输入学生的学号:

    <Inputtype=text name="number1">

    <P>输入学生的身高:

    <Inputtype=text name="height">

    <P>输入学生的体重:

    <Inputtype=text name="wei">

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

    </FORM>

    <%

    /*

    可以使用value属性获取值.

    可以使用property=*

    可以使用param=value

    此例与上例功能相同,只是不是自动匹配,而是使用param=某域控件名

    */

    %>

    <jsp:useBeanid="zhang" class="student.Student" scope="page">

    </jsp:useBean>

 

 

    <jsp:setProperty  name= "zhang"  property="name"param="name"  />

    <P>名字是:

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

 

    <jsp:setProperty  name= "zhang"  property="number"param="number1"  />

    <P>学号是:

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

 

 

    <%double height=1.70;%>

 

    <jsp:setProperty  name= "zhang"  property="height"param="height"  />

    <P>身高是:

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

 

    米

    <jsp:setProperty  name= "zhang"  property="weight"param="wei"  />

    <P>体重是:

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

    公斤

    </FONT>

    </BODY>

    </HTML>

 

//////////////////////////////////////////////////////////////////////////

实例要求:输入一个整数,求出小于这个数的所有素数:

    packagetom.jiafei;

    publicclass  PrimNumber

    { intnumber;                     //用来接受用户所输入的整数

      StringBuffer result;            //用来包含所输入整数之前的所有素数

 

     public PrimNumber()

      { result=new StringBuffer();

      }

 

     public void setNumber(int n)

      { number=n;

 

        inti,j;

         for( i=2;i<=number;i++)  //找出number以内的素数。

           {for(j=2;j<i;j++)

               {if(i%j==0)

                  break;

               }

             if(j>=i)

              result.append(""+i+"<BR>"); 

           }

      }

 

     public int getNumber()

      {return number;

      }

     public StringBuffer getResult()

      { return result;

      }

    }

 

    文件二:

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

    <%@page import="tom.jiafei.*" %>

    <%

    /*

    如果有包的话,则必须在classes文件下创建相应的文件夹.

    class文件要放于相应的目录下.

    必须在文件头引入此包.

    */

    %>

    <HTML>

    <BODYbgcolor=cyan><Font size=1>

    <FORMaction="" Method="post" >

    <P>输入一个正整数:

 

    <Inputtype=text name="number">

    <Inputtype=submit value="提交">

 

      <jsp:useBean id="prim"class="tom.jiafei.PrimNumber" scope="page" >

      </jsp:useBean>

 

    <jsp:setProperty  name= "prim"  property="number"param="number"   />

    <P>小于

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

    这个数的全部素数是:

    <BR>  <jsp:getProperty  name= "prim"  property="result"   />

    </Font>

    </BODY>

    </HTML>

 

//////////////////////////////////////////////////////////

实例要求:输入三角形三条边,看看能不能形成一个三角形,并求出面积

    packagetriangle;

    publicclass Triangle

    {

      double sideA,sideB,sideC;       //表示三条边,分别接受三个文本框的传值

      double area;                    //面积

      boolean triangle;               //布尔型表示能否形成一个三角形

 

      public void setSideA(double a)

       {sideA=a;

       }

      public double getSideA()

       {return sideA;

       }

      public void setSideB(double b)

       {sideB=b;

       }

      public double getSideB()

       {return sideB;

       }

      public void setSideC(double c)

       {sideC=c;

       }

      public double getSideC()

       {return sideC;

       }

      public double getArea()                     //返回面积

       { double p=(sideA+sideB+sideC)/2.0;

         area=Math.sqrt(p*(p-sideA)*(p-sideB)*(p-sideC));

         return area;

       }

      public boolean isTriangle()             //判断是否能形成三角形

       { if(sideA<sideB+sideC&&sideB<sideA+sideC&&sideC<sideA+sideB)

              triangle=true;

          else

              triangle=false;

          return triangle;

       }

     

    }

 

 

    文件二:

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

    <%@page import="triangle.Triangle"%>

    <HTML>

    <BODY>

 

    <FORMaction="" Method="post" >

 

    <P>输入三角形的边A:

    <Inputtype=text name="sideA" value=0>

    <P>输入三角形的边B:

    <Inputtype=text name="sideB" value=0>

    <P>输入三角形的边C:

    <Inputtype=text name="sideC" value=0>

    <Inputtype=submit value="提交">

 

    <P>你给出三角形的三边是:

 

    <jsp:useBeanid="triangle" class="triangle.Triangle"scope="page" >

    </jsp:useBean>

 

    <jsp:setProperty  name= "triangle"  property="*"  />

 

    <BR>边A是:

    <jsp:getProperty  name= "triangle"  property="sideA"  />

    <BR>边B是:

    <jsp:getProperty  name= "triangle"  property="sideB"  />

    <BR>边C是:

    <jsp:getProperty  name= "triangle"  property="sideC"  />

    <P>这三个边能构成一个三角形吗?

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

    <P>面积是:

    <jsp:getProperty  name= "triangle"  property="area"  />

    </Form>

 

 

    </BODY>

    </HTML>

//////////////////////////////////////////////////////////////////////////////////

课后作业:

作业一:显示访问量:页面上显示“你是第N个访客!~!~!”

作业二:猜数游戏:系统产生一个随机数;在文本框中不断输入数,直到猜对为止;能够最终显示产生的随机数和猜的次数;

 

 

servlet:

    介绍:是在服务器端服务执行的小程序。一个servlet就是javax.servlet.HttpServlet类的子类;由servlet的服务器完成该子类的对               象,即初始化;

    实质:和beans一样,都是java的类文件;

 

servlet的生命周期:

    1。初始化:servlet第一次被请求时加载的,即创建一个servlet对象;是自动调用init方法来完成初始化工作的;

    2。响应客户端的请求:调用service()方法;或者调用doGet(),doPost()方法;

    3。消灭:当服务器关闭时,调用destroy()方法;

 

 

    说明:

    1。init()方法只被调用一次;当后续的客户请求servlet服务时,WEB服务器将自动启动一个新线程;

    2。init()方法是HttpServlet类中的方法,可以重写这个方法;

        publicvoid init(ServletConfig config)throws ServletException

    3。调用init()方法时,会将一个ServletConfig类型的对象传递给init()方法;ServletConfig对象负责传递服务器设置的有关信息;

       如果传递失败,则发生ServletException异常;

    4。service()方法是HttpServlet类中的方法,可以在自定义的servlet中直接继承或者重写该方法;

         public void service(HttpServletRequestrequest,HttpServletResponse response)throws ServletException,IOException

    5。service()方法是在用户请求时自动调用;service()方法封装了用户的请求信息;所以可以处理用户的请求;

    6。service()方法还可以对用户进行响应;

    7。destroy()方法,是HttpServlet类中的方法;自定义的servlet可以直接继承该方法,一般不需要重写;

        publicvoid destroy();

 

///////////////////////////////////////////////////////////

第一个servlet:

 

/////编写:

    importjava.io.*;

    importjavax.servlet.*;               //导入HttpServlet类的包

    importjavax.servlet.http.*;      //导入所需的包

 

    publicclass Hello extends HttpServlet        //自定义的servlet必须继承HttpServlet,继承前需用上面的导入

    { 

        //重写HttpServlet的init()方法,进行初始化

        publicvoid init(ServletConfig config) throws ServletException

        {

             super.init(config);  //调用父类super的初始化方法,完成自己的初始化;

        }

       

        //重写service()方法,处理请求,并进行响应;

      public void service(HttpServletRequestreqest,HttpServletResponse response) throws IOException

        {//获得一个向客户发送数据的输出流:

           PrintWriter out=response.getWriter();

          response.setContentType("text/html;charset=GB2312");//设置响应的MIME类型。

           out.println("<HTML><BODY>");

           out.println("Simple servlet");

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

        }

    }

 

/////编译:

    准备:将tomcat\common\lib\servlet-api.jar拷贝到jdk\jre\lib\ext

    说明:  因为jdk本身不具有servlet-api,则编译时找不到诸如HttpServlet类,所以不能编译;

            

 

////部署:

    1。将编译好的class文件放于web-inf\classes下,如果有包,还要放于相应的包下;

    2。修改web.xml文件;此文件位于web-inf下;

   

    <?xmlversion="1.0" encoding="ISO-8859-1"?>

    <!DOCTYPEweb-app

         PUBLIC "-//Sun Microsystems, Inc.//DTDWeb Application 2.3//EN"

        "http://java.sun.com/dtd/web-app_2_3.dtd">

    <web-app>

 

        <!--指定一个servlet的信息,包括类文件名,以及给servlet起的名,相当于useBean中的id名-->

        <servlet>

                 <!--下面指定名字,找到这个名字,就找到了对应的serlvet的class文件-->

                 <servlet-name>Hello</servlet-name>

                 <!--下面指定类文件-->

                 <servlet-class>Hello</servlet-class>

        </servlet>

       

        <!--指定servlet的映射信息,即访问此servlet的url-->

        <servlet-mapping>

             <!--下面指定servlet名,此名必须在上面定义过,通过它找到对应的class-->

             <servlet-name>Hello</servlet-name>

             <!--下面指定访问上面name的servlet的URL-->

             <url-pattern>/hello</url-pattern>

             <!--/代表是站点的根止录-->

        </servlet-mapping>

 

    </web-app>

 

///访问:http://localhost:端口号/站名/serlet的url-pattern

 

OK

 

 

 

servlet获取表单提交数据:

 

实例一:

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

    <HTML>

    <BODYbgcolor=cyan>

    <P>输入一个数,servlet求这个数的平方根:

    <FORMaction="/StoneJsp/StoneJsp/servlet/Sqrt" method=get>

      <Input Type=text name=number>

      <Input Type=submit value="提交">

    </FORM>

 

    <P>输入一个数,servlet求这个数的平方根:

    <FORMaction="../../../StoneJsp/servlet/Sqrt" method=get>

      <Input Type=text name=number>

      <Input Type=submit value="提交">

    </FORM>

    <%

    //要注意:

    //网页中的地址/,都是相对于网址的,也就是相对于http://localhost:8888/

    //也可以理解为是相对于Tomcat下的WebApp目录。

    //但是:

    //Web.xml文件中配置servlet时,是相对于本站的,也即相对于http://localhost:8888/你的站点

    %>

    <ahref="/StoneJsp/hello">链接到hello那个servlet</a>

 

    </BODY>

    </HTML>

 

    importjava.io.*;

    importjavax.servlet.*;

    importjavax.servlet.http.*;

    publicclass Sqrt extends HttpServlet

    {   public void init(ServletConfig config)throws ServletException

        {super.init(config);

        }

      public void service(HttpServletRequestrequest,HttpServletResponse response) throws IOException

        {//获得一个向客户发送数据的输出流:

           PrintWriter out=response.getWriter();

           response.setContentType("text/html;charset=GB2312");//设置响应的MIME类型。

           out.println("<HTML><BODY>");

           Stringnumber=request.getParameter("number");     //获取客户提交的信息。

           double n=0;

             try{n=Double.parseDouble(number);

                  out.print("<BR>"+Math.sqrt(n));

                }

             catch(NumberFormatExceptione)

                { out.print("<H1>input numberletter please! </H1>");

                }      

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

        }

    }

 

    配置:

    <servlet>

             <servlet-name>sqrt</servlet-name>

             <servlet-class>Sqrt</servlet-class>

    </servlet>

    <servlet-mapping>

       <servlet-name>sqrt</servlet-name>

       <url-pattern>/StoneJsp/servlet/Sqrt</url-pattern>

   </servlet-mapping>

 

小结:

    第一:以前是表单提交的处理是由action属性指定一个jsp;现在可以指定为一个servlet;

    第二:注意:web.xml配置中的url-pattern中的/和,jsp页中的/相对不同的目录;如果用相对路径..则参照当前网页的目录;

    第三:servlet中也可以getParameter()方法获取提交信息;

 

////////////////////////////////////////////////////////////////////////////////////////////////////////

doGet(),doPost()

实例二:

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

    <HTML>

    <BODYbgcolor=cyan><Font size=1>

    <P>输入一个数,提交给servlet(Post方式):

    <FORMaction="/StoneJsp/ComputerFactor" method=post>

      <Input Type=text name=number>

      <Input Type=submit value="提交">

    </FORM>

    <%

    //注意上下表单的不同

    //提交方式一个是get,一个是post

    //servlet中用doGet和doPost分别处理

    %>

    <P>输入一个数,提交给servlet(Get方式):

    <FORMaction="/StoneJsp/ComputerFactor" method=get>

      <Input Type=text name=number>

      <Input Type=submit value="提交">

    </FORM>

    </BODY>

    </HTML>

 

    importjava.io.*;

    importjavax.servlet.*;

    importjavax.servlet.http.*;

    public classComputerFactor extends HttpServlet

    { 

      public void init(ServletConfig config) throwsServletException

        {super.init(config);

        }

      public void  doPost(HttpServletRequestrequest,HttpServletResponse response)

                             throwsServletException,IOException

        {  //获得一个向客户发送数据的输出流:

           PrintWriter out=response.getWriter();

          response.setContentType("text/html;charset=GB2312");//设置响应的MIME类型。

           out.println("<HTML>");

           out.println("<BODY>");

 

           Stringnumber=request.getParameter("number");  //获取客户提交的信息。

           double n=0;

             try{n=Double.parseDouble(number);

                  out.println("<H1> factors of"+n+" :</H1>");

                  //求n的全部因数:

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

                      { if(n%i==0)

                        out.println(i);

                      }

                }

             catch(NumberFormatExceptione)

              { out.print("<H1>input number letter please!</H1>");

                }

        }

      public void  doGet(HttpServletRequestrequest,HttpServletResponse response)

                             throwsServletException,IOException

        {

           doPost(request,response);

        }

    }

 

配置:

    <servlet>

            <servlet-name>ComputerFactor</servlet-name>

             <servlet-class>ComputerFactor</servlet-class>

    </servlet>

   <servlet-mapping>

                 <servlet-name>ComputerFactor</servlet-name>

                 <url-pattern>/ComputerFactor</url-pattern>

   </servlet-mapping>

 

小结:

    第一:表单以post或者get方式提交,会自动执行servlet中的doPost()和doGet()方法;

    第二:如果希望表单不论以什么方式提交,都能执行相同的响应;则在doGet()中调用doPost();反之亦然;

    第三:注意:以超链接或者地址栏中直接请求servlet方式,是会自动执行doGet()方法;

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////

实例三:doGet()与doPost()执行不同功能

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

    <HTML>

    <BODYbgcolor=cyan><Font size=1>

    <P>输入一个数,提交给servlet(Post方式):

    <FORMaction="/StoneJsp/ComputerFactorandPrimNumber" method=post>

      <Input Type=text name=number>

      <Input Type=submit value="提交">

    </FORM>

    <P>输入一个数,提交给servlet(Get方式):

    <FORMaction="/StoneJsp/ComputerFactorandPrimNumber" method=get>

      <Input Type=text name=number>

      <Input Type=submit value="提交">

    </FORM>

    </BODY>

    </HTML>

 

    importjava.io.*;

    importjavax.servlet.*;

    importjavax.servlet.http.*;

    publicclass ComputerFactorandPrimNumber extends HttpServlet

    { 

      public void init(ServletConfig config) throwsServletException

        {super.init(config);

        }

      public void  doPost(HttpServletRequestrequest,HttpServletResponse response)

                             throwsServletException,IOException

        {  //获得一个向客户发送数据的输出流:

           PrintWriter out=response.getWriter();

          response.setContentType("text/html;charset=GB2312");//设置响应的MIME类型。

           out.println("<HTML>");

           out.println("<BODY>");

 

           Stringnumber=request.getParameter("number");  //获取客户提交的信息。

           double n=0;

             try{n=Double.parseDouble(number);

                  out.println("<H1> factors of"+n+" :</H1>");

                  //求n的全部因数:

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

                      { if(n%i==0)

                        out.println(i);

                      }

                }

             catch(NumberFormatExceptione)

                { out.print("<H1>input numberletter please! </H1>");

                }

        }

      public void  doGet(HttpServletRequestrequest,HttpServletResponse response)

                             throwsServletException,IOException

        {  PrintWriter out=response.getWriter();

          response.setContentType("text/html;charset=GB2312");//设置响应的MIME类型。

           out.println("<HTML>");

           out.println("<BODY>");

 

           Stringnumber=request.getParameter("number");  //获取客户提交的信息。

           double n=0;

             try{n=Double.parseDouble(number);

                  out.println("<H1> Primnumbers less"+n+" :</H1>");

                  //求小于n的全部素数:

                  int j=1;

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

                      { for(j=2;j<i;j++)

                         {if(i%j==0)

                             break;

                         }

                        if(j>=i)

                         {out.println(i);

                         }

                      }

                }

             catch(NumberFormatExceptione)

                { out.print("<H1>input numberletter please! </H1>");

                }

         

        }

    }

 

配置:

    <servlet>

             <servlet-name>ComputerFactorandPrimNumber</servlet-name>

             <servlet-class>ComputerFactorandPrimNumber</servlet-class>

    </servlet>

   <servlet-mapping>

                 <servlet-name>ComputerFactorandPrimNumber</servlet-name>

                 <url-pattern>/ComputerFactorandPrimNumber</url-pattern>

   </servlet-mapping>

//////////////////////////////////////////////////////////////////////////////////////

 

Servlet常用接口的使用

有如下几种分类:

    1.servlet实现相关:定义了用于实现Servlet相关的类和方法;

    2.servlet配置相关:通过ServletConfig接口实现;

    3.Servlet异常相关:主要有ServletException,UnavailableException;

    4.请求与响应相关:可以处理请求,并做出响应;

    5.会话跟踪:即HttpSession;

    6.servlet上下文:通过这个接口可以在多个WEB应用之间共享数据;

    7.servlet协作:通过RequestDispatcher接口,进行页面的转发;

    8.过滤:定义了请求响应过滤相关的API和接口;

    9.其他类:比如:cookie,HttpUtils等;

 

-------------------------------

一:与实现相关主要有三个类和接口:

    Servlet:它是所有Servlet必须直接或间接实现的接口,主要方法有:init();destroy();getServletInfo();getServletConfig();

                                      service()

    GenericServlet:是一个抽象类,对Servlet进行继承,并做了基本的实现;但service()方法是抽象方法,需其子类实现;

    HttpServlet:它继承GenericServlet,提供Http协议功能;其子类需实现doGet()或doPost()等方法;

 

    注意:我们的servlet通常都是要继承HttpServlet

 

二:Servlet配置相关:

    相关接口:javax.servlet.ServletConfig;

    主要方法:

    getInitParameter(Stringname):返回特定名字的初始化参数;其参数来自web.xml中的配置;比如:

             <servlet>

                 <init-param>

                     <param-name>encoding</param-name>

                     <param-value>gb2312</param-value>

                 </init-param>               

             </servlet>

        则,getInitParameter("encoding"),将返回"gb2312"字符串;

 

    getInitParameterNames():返回所有初始化参数的名字;

    getServletContext():返回上下文对象;

 

三:异常相关:

    1.ServletException:它继承Exception,主要方法getRootCause()能返回异常的原因;

    2.UnavailableException:它继承ServletException,当Servlet不可用时,就会产生此异常;

 

四:请求响应相关:

    相关接口与类有:

    ServletRequest       HttpServletRequest           请求

    ServletResponse      HttpServletResponse          响应

    ServetInputStream    HttpServletInputStream            输入流

    ServletOutputStream  HttpServletOutputStream           输出流

    ServletRequestWrapper    HttpServletRequestWrapper         请求的实现

    ServletResponseWrapper   HttpServletResponseWrapper        响应的实现

说明:右边以Http开头的接口或者类都是左边的子类;

 

    HttpServletRequest的重要方法:

    1.getCookie()2.getSession()3.getParameter();4.getParameterValues()

 

    HttpServletResponse的重要方法:

    1.addCookie()2.encodeURL()3.sendRedirect()4.setContentType()5.setCharacterEncoding();

 

 

 

五:会话跟踪相关:

    HttpSession接口

    作用:通过它可以来识别一个客户

    常用方法://方法的作用参见jsp内置对象中的session对象的方法

    getCreationTime()

    getId()

    getLastAccessedTime()

    getMaxInactiveInterval()

    getValue()

    getValueNames()

    invalidate()

    isNew()

    putValue()

    removeValue()

    setMaxInactiveInterval()

 

六:servlet上下文

    ServletContext接口

    作用:session用来维扩同一个用户的相关状态;context可以用来维扩多个用户的状态;

    常见方法:

    getAttribute(Stringname):获得ServletContext中的名称为name的属性值;

    getContext(Stringuripath):返回指定uripath的servlet上下文;

    removeAttribute()

    setAttribute()

 

七:servlet的协作

    RequestDispatcher接口

    作用:它可以把一个请求转发到另一个Servlet;

    重要方法:

    forward(ServletRequestrequest,ServletResponse response):将请求转发到另一个资源上,可以是:jsp,serlvet,HTML等;

    include(参数同上):把服务器上另一资源包括到响应中;

   

 

八:过滤:

    Filter接口,FilterChain接口,FilterConfig接口

    作用:可以对请求进行统一编码,进行认证等;每个Filter完成一个特定的任务,多个Filter可以互相协同完成复杂任务;

   

    Filter的方法://是Filter必须实现的接口;

    init(FilterConfigfilterConfig):初始化;

    doFilter(ServletRequestrequest,ServletResponse response,FilterChain chain):实现Filter的业务方法;

    destroy():释放Filter资源;

 

    FilterChain接口

    作用:把过滤的任务在不同的Filter之间转移;

    方法:

    doFilter(ServletRequestrequest,ServletResponse response)

 

    FilterConfig接口

    作用:代表了Filter的配置;

    方法:

    getFilterName():返回Filter的名字;

    getInitParameter(Stringname):获得名称为name的初始化参数;

    getServletContext():返回这个Filter所在的Servlet上下文对象;

    getInitParameterNames():返回配置中所有初始化参数的名字;

 

 

//////////////////////////////////////////////////////////////

配置相关的实例:

    packagecom.jspdev.ch7;

 

    importjava.sql.*;

    importjavax.sql.*;

    importjavax.servlet.*;

    importjavax.servlet.http.*;

    importjava.io.*;

    importcom.microsoft.jdbc.sqlserver.SQLServerDriver;

    importjava.sql.*;

 

    publicclass JDBCServlet extends HttpServlet

    {

        /**

         *连接数据库的属性.

         */

        Stringdriver;

        Stringurl;

        Stringpassword;

        Stringuser;

       

        /**

         *处理Get请求

         */

        public  void doGet(HttpServletRequest request,

                           HttpServletResponse response)

             throwsIOException, ServletException

        {

             response.setContentType("text/html;charset=gb2312");

             PrintWriterout = response.getWriter();

             try

             {

                 Connectioncon=getConnection();

                 Statementstmt=con.createStatement();

                 ResultSetrst=stmt.executeQuery("select * from user_info");

                 while(rst.next())

                 {

                     out.println(rst.getString("userid"));

                     out.println("<br>");

                 }

                rst.close();

                stmt.close();

                con.close();     

           }

           catch(SQLException e)

           {

                e.printStackTrace();

           }

        }

       

        /**

         *处理Post请求

         */

        public  void doPost(HttpServletRequest request,

                           HttpServletResponse response)throwsIOException, ServletException

                          

        {

             doGet(request,response);

        }

        /**

         *获得初始化参数

         */

        publicvoid init()throws ServletException

        {

             driver=getInitParameter("DRIVER");

             password=getInitParameter("PASSWORD");

             url=getInitParameter("URL");

             user=getInitParameter("USER");

        }

       

        /**

         *帮助方法,获得到数据库的连接

         */

        privateConnection getConnection()

        {

             Connectioncon=null;

              try

             {

                

                 Class.forName(driver);

                 con= DriverManager.getConnection(url,user,password);

             }

             catch(Exceptione)

             {

                 e.printStackTrace();

             }

             returncon;

        }

    }

 

-----web.xml中的部分配置:

    <servlet>

       <servlet-name>JDBCServlet</servlet-name>

       <servlet-class>com.jspdev.ch7.JDBCServlet</servlet-class>

        <init-param>

        <param-name>DRIVER</param-name>

        <param-value>com.microsoft.jdbc.sqlserver.SQLServerDriver</param-value>

       </init-param>

       <init-param>

        <param-name>URL</param-name>

        <param-value>jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=jspdev</param-value>

       </init-param>

        <init-param>

        <param-name>USER</param-name>

        <param-value>bn</param-value>

       </init-param>

        <init-param>

        <param-name>PASSWORD</param-name>

        <param-value>bn</param-value>

       </init-param>

   </servlet>

 

 

////////////////////////////////////////////////////////////////////

会话相关实例:

    importjava.io.*;

    importjavax.servlet.*;

    importjavax.servlet.http.*;

    publicclass Boy extends HttpServlet

    {  public void init(ServletConfig config) throwsServletException

        {super.init(config);

        }

      public void doPost(HttpServletRequest request,HttpServletResponse response)

                             throwsServletException,IOException

        {  //获得一个向客户发送数据的输出流:

           PrintWriter out=response.getWriter();

          response.setContentType("text/html;charset=GB2312");//设置响应的MIME类型。

           out.println("<HTML>");

           out.println("<BODY>");

           HttpSessionsession=request.getSession(true);  //获取客户的会话对象

                       session.setAttribute("name","Zhoumin");    //设置属性

           out.println(session.getId());                  //获取会话的Id.

             out.println("</BODY>");

           out.println("</HTML>");

        }

      public void doGet(HttpServletRequestrequest,HttpServletResponse response)

                             throwsServletException,IOException

        {doPost(request,response);

        }

    }

 

文件二:

        importjava.io.*;

        importjavax.servlet.*;

        importjavax.servlet.http.*;

        publicclass Girl extends HttpServlet

        {  public void init(ServletConfig config) throwsServletException

             {super.init(config);

             }

          public void doPost(HttpServletRequest request,HttpServletResponse response)

                                  throwsServletException,IOException

             {  //获得一个向客户发送数据的输出流:

                PrintWriter out=response.getWriter();

               response.setContentType("text/html;charset=GB2312");//设置响应的MIME类型。

              out.println("<HTML>");

                out.println("<BODY>");

              

                out.println(session.getId());                  //获取会话的Id.

                Strings=(String)session.getAttribute("name"); //获取会话中存储的数据。

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

                out.println("</BODY>");

                out.println("</HTML>");

             }

          public void doGet(HttpServletRequestrequest,HttpServletResponse response)

                                  throwsServletException,IOException

             {doPost(request,response);

             }

        }      

            

       

 

//////////////////////////////////////////

会话实例之二:猜数字游戏之servlet版

 

    importjava.io.*;

    importjava.util.*;

    importjavax.servlet.*;

    importjavax.servlet.http.*;

    publicclass GetNumber extends HttpServlet

    {  public void init(ServletConfig config) throwsServletException

        {super.init(config);

        }

      public void  doPost(HttpServletRequestrequest,HttpServletResponse response)

                             throwsServletException,IOException

        { response.setContentType("text/html"); 

           ServletOutputStreamout=response.getOutputStream();

           out.print("A number between 1 and 100to you,guess it out please! ");

           HttpSessionsession=request.getSession(true);

           session.setAttribute("count",newInteger(0));

           int number=(int)(Math.random()*100)+1;        //获取一个随机数。

           session.setAttribute("save",newInteger(number));

           out.print("<FORM action=Result  method=post name=form>");

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

           out.print("<INPUT type=submitvalue=Enter>");

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

        }

      public void  doGet(HttpServletRequestrequest,HttpServletResponse response)

                             throwsServletException,IOException

        {doPost(request,response);

        }

    }

 

 

    importjava.io.*;

    importjava.util.*;

    importjavax.servlet.*;

    importjavax.servlet.http.*;

    publicclass Result extends HttpServlet

    {public void init(ServletConfig config) throws ServletException

        {super.init(config);

        }

      public void  doPost(HttpServletRequestrequest,HttpServletResponse response)

                             throwsServletException,IOException

        { response.setContentType("text/html"); 

           ServletOutputStreamout=response.getOutputStream();

           HttpSessionsession=request.getSession(true);

           Stringstr=request.getParameter("boy");

          if(str==null)

             {str="0";

             }

          int guessNumber=Integer.parseInt(str);

          Integer integer=(Integer)session.getAttribute("save");

          int realnumber=integer.intValue();

         if(guessNumber==realnumber)

             {int n=((Integer)session.getAttribute("count")).intValue();

               n=n+1;

               session.setAttribute("count",newInteger(n));

                response.sendRedirect("Success");

             }

           else if(guessNumber>realnumber)

             {int n=((Integer)session.getAttribute("count")).intValue();

               n=n+1;

               session.setAttribute("count",newInteger(n));

               response.sendRedirect("Larger");

             }

        elseif(guessNumber<realnumber)

             {int n=((Integer)session.getAttribute("count")).intValue();

               n=n+1;

               session.setAttribute("count",newInteger(n));

               response.sendRedirect("Smaller");

             }

        }

      public void  doGet(HttpServletRequestrequest,HttpServletResponse response)

                             throwsServletException,IOException

        {doPost(request,response);

        }

    }

 

 

    importjava.io.*;

    importjava.util.*;

    importjavax.servlet.*;

    importjavax.servlet.http.*;

    publicclass Larger extends HttpServlet

    {  public void init(ServletConfig config) throwsServletException

        {super.init(config);

        }

      public void  doPost(HttpServletRequestrequest,HttpServletResponse response)

                             throwsServletException,IOException

        { response.setContentType("text/html"); 

           ServletOutputStream out=response.getOutputStream();

           out.print("Larger ,try again!");//所猜的数比实际的数大,请再猜。

           out.print("<BR><FORMaction=Result  method=postname=form>");

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

           out.print("<INPUT type=submitvalue=Enter>");

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

        }

      public void  doGet(HttpServletRequestrequest,HttpServletResponse response)

                             throwsServletException,IOException

        {doPost(request,response);

        }

    }

 

 

    importjava.io.*;

    importjava.util.*;

    importjavax.servlet.*;

    importjavax.servlet.http.*;

    publicclass Smaller extends HttpServlet

    { 

      public void init(ServletConfig config) throwsServletException

        {super.init(config);

        }

      public void  doPost(HttpServletRequestrequest,HttpServletResponse response)

                             throwsServletException,IOException

        { response.setContentType("text/html"); 

           ServletOutputStreamout=response.getOutputStream();

           out.print("Smaller ,try again!");//所猜的数比实际的数小,请再猜。

           out.print("<BR><FORMaction=Result  method=post name=form>");

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

           out.print("<INPUT type=submitvalue=Enter>");

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

        }

      public void  doGet(HttpServletRequestrequest,HttpServletResponse response)

                             throwsServletException,IOException

        {doPost(request,response);

        }

    }

 

 

    importjava.io.*;

    importjava.util.*;

    importjavax.servlet.*;

    importjavax.servlet.http.*;

    publicclass Success extends HttpServlet

    { 

      public void init(ServletConfig config) throwsServletException

        {super.init(config);

        }

      public void  doPost(HttpServletRequestrequest,HttpServletResponse response)

                             throwsServletException,IOException

        { response.setContentType("text/html"); 

           ServletOutputStreamout=response.getOutputStream();

           HttpSessionsession=request.getSession(true);

           intcount=((Integer)session.getAttribute("count")).intValue();

           intnum=((Integer)session.getAttribute("save")).intValue();

           long startTime=session.getCreationTime();

           long endTime=session.getLastAccessedTime();

           long spendTime=(endTime-startTime)/1000;

           out.println("Congratulatuon! You areright");

           out.println("aferjust"+count+"tries") ;

           out.println("youspend"+spendTime+"Seconds");

           out.println("That Number is"+num);

        }

      public void  doGet(HttpServletRequestrequest,HttpServletResponse response)

                             throwsServletException,IOException

        {doPost(request,response);

        }

    }

 

 

WEB组件:

JavaBean组件,EJB组件,JSP标签,XML,web service,Servlet,JSP组件,等

 

-------------------------------------------------------------------------------------

WEB组件的三种关联关系:

1.请求转发:

    将表单等请求信息转发给同一应用程序中的其他WEB组件进行处理.

    Servlet的处理方式:

    RequestDispatcherrd=request.getRequestDispatcher("某组件,比如:Hi.jsp");

    rd.forward(request,response);

        //重点理解:RequestDipatcher对象,及其forward方法.

 

    JSP的处理方式:

    <jsp:forwardpage="Hi.jsp" />

   

2.URL重定向:

    重定向,即跳转到另一URL.

    与请求转发的区别:

        1.可以重定向到不是同一应用中的URL.而请求转发通常是跳转到同一应用的URL中.

        2.重定向不携带HttpServletRequest信息,故不能进行数据处理,只是跳到另一URL;而请求转发可以.

    处理方式:

        response.sendRedirect("某URL,比如:http://www.sohu.com")

3.包含:

    包含关系允许一个组件来自不同的组件的合成;

    Servlet的处理方式:

        RequestDispatcherrd;

        rd=request.getRequestDispatcher("/header.jsp");

        rd.include(request,response);

       

    Jsp的处理方式:

        <%@ include file="header.jsp" %>

------------------------------------------------------------------------------------------

WEB开发的两种模式:

1.jsp Model1,jsp+javaBean

2.jsp Model2,jsp+javaBean+servlet

 

MVC:Model-View-Controller,即:模型-视图-控制器.

    说明:MVC是一种设计模式,它强制性地把应用程序的输入,处理和输出分开.

 

视图:用户看到并与之交互的界面.

 

模型:表示业务数据和业务逻辑.一个模型能为多个视图提供数据,从而提设防尖用的可重用性.

 

控制器:控制器能接爱用户的输入并调用模型和视图去完成用户的需求.当WEB用户单击WEB页面中的提交按钮来发送HTML表单时,控制器接收请求并调

用相应的模型组件去处理请求,然后调用相应的视图来显示模型返回的数据.

 

在模式二中:jsp为视图,javabean为模型,servlet为控制器

 

--------------------------------------------------------------------------------------------

Struts的机制:

    Struts实质上就是在JSP Model2基础上实现的一个MVC框架。在Struts框架中,模型由实现业务逻辑的JavaBean或EJB组件构成,控制器是由ActionServlet和Action来实现,视图由一组JSP文件构成。

---------------------------

Struts的工作流程:

 

1.检索和用户请求相匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效的信息。

 

2。如果ActionForm实例不存在,就创建一个ActionForm对象,把客户请求提交的表单数据保存到ActionForm对象中。

 

3。根据配置信息决定是否需要表单验证。如果需要验证,就调用ActionForm的validate()方法。

 

4。如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象,就表示表单验证成功。

 

5。ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action.如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法。

 

6。Action的execute()方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指向的JSP组件。

7。ActionForward对象指向的JSP组件生成动态网页,返回给客户。

 

    说明:如果步骤4中,验证失败,则返回包含一个或多个ActionMessage的ActionError对象有,此时不再向下执行;ActionServlet将直接把请求转发给包含用户提交表单的JSP组件。

JSP:

<%=new java.util.Date()%>   OR <%out.println(newjava.util.Date());%>

 

 

 

javascript:

<script language=javascript>

 

    varmyTime=new Date();

    year=myTime.getYear();

    month=myTime.getMonth()+1;

    date=myTime.getDate();

       hour=myTime.getHours();

    mins=myTime.getMinutes();

    sec=myTime.getSeconds();

    document.title=year+"ト・+month+"ヤツ"+date+"ネユ"  /ヤレラマア・簑クマヤハセハアシ・

    document.write(year+"ト・+month+"ヤツ"+date+"ネユ")/ヤレメウテ賁莎アシ・

    window.status=year+"ト・+month+"ヤツ"+date+"ネユ"   /ヤレラツマヤハセハアシ・

</script>

 

                            解决WEB开发中的中文问题

时间经常看到有人web开发中怎中文?号。原因其简单,因大家大多用的是tomcat器,而tomcat器的默认编码为 iso-8859-1(西欧字符)。就是因iso-8859-1(西欧字符)编码造成了我们经常看到?号。iso-8859-1(西欧字符)更多知识请《字节,字符和编码》篇文章。

方法一:最简单也是用的最多的方法。
<%@ page language="java" pageEncoding="GBK" %>
或者<%@ page contenttype="text/html;charset=gbk";%>

或者<%request.setCharacterEncoding("gbk");%>,里可以用gb2312或者gbk,只是gbkgb2312支持跟多的字符。

个方法用于jsp面中的中文示。

方法二:使用过滤器。
过滤器使用主要针对提交,插入数据的数据都是?号。也是应为tomcat不按request所指定的编码进编码是自作主的采用默认编码方式iso-8859-1编码
写一个SetCharacterEncodingFilter
importjava.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class SetCharacterEncodingFilter implements Filter {
protected String encoding = null;
protected FilterConfig filterConfig = null;
protected boolean ignore = true;

public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig=filterConfig;
this.encoding=filterConfig.getInitParameter("encoding");
String value=filterConfig.getInitParameter("ignore");
if(value==null)
this.ignore=true;
else if(value.equalsIgnoreCase("true"))
this.ignore=true;
else
this.ignore=false;
}

public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
// TODO
生成方法存根
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
chain.doFilter(request, response);
}

public void destroy() {
// TODO
生成方法存根
this.encoding = null;
this.filterConfig = null;
}

protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}

然后再web.xml加上
<!-- Set Character Encoding-->
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>com.struts.common.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
Set Character Encoding-->

使用过滤器的好很多,特目之中。
而且在使用国就更有用了,只要在面指定<%@ page language="java"pageEncoding="UTF-8" %>,服器就会根据本地Locale示正确的字符集。

所以我特推荐使用过滤器。

方法三:修改tomcatserver.xml文件中URIEncoding
<Connector
debug="0"
acceptCount="100"
connectionTimeout="20000"
disableUploadTimeout="true"
port="80"
redirectPort="8443"
enableLookups="false"
minSpareThreads="25"
maxSpareThreads="75"
maxThreads="150"
maxPostSize="0"
URIEncoding="GBK"
>
</Connector>
个方法主要针对url取字符串的问题
tomcat5.0及以上版本,postget方法在编码时有所不同。如果你在url取中文就会出?号。但在tomcat4.1版本没有问题,因tomcat4.1postget方法在编码时是一

你可能感兴趣的:(jsp笔记)