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的内容为:

             

             

                    

                            first.jsp

                    

             

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

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

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

 

更改端口号:

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

       2。找到port="8080"

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

 

 

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

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

       2。在前加:

             

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

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

      

       比如:

 

 

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注释

      其实还是HTML注释,只不过是注释的内容是由jsp决定的

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

    <%

        //单行注释

        /*多行注释*/

    %>

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

    脚本元素:

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

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

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

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

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

    如:

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

 

        ">

 

 

    再如:

        <%!String color="green";

        publicString getColor()

        {

            return color;

        }

        %>

        ">

 

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

 

    表达式;

    用法:<%=表达式%>

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

   

    小脚本:

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

 

 

    指令元素:

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

 

    动作元素:

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

    特点:;有时可以写成

 

    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="我!张惠妹" %>

   

   

   

谁呀?

      <% String s=getServletInfo();

           out.print("
"+s);

      %>

   

   

 

 

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

 

    文件一:此文件会产生错误,使用指令: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" %>

   

   

    出错了!

   

   

   

    出错了!

    发生了以下的错误:

    1.除数不能为零。


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


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


   

   

   

 

 

    include指令:

   

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

   

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

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

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

   

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

    比如:

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

   

   

   

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

   

   

   

   

    jsp的动作标签:

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

   

    include动作:

   

    或者

   

    与include指令的区别:

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

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

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

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

       

 

    forward动作:

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

    格式:

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

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

   

 

 

    plugin动作:

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

    格式:

   

        type="bean|applet"

        code="文件名"

        codebase="文件目录"

    >

       

            

             多参,同上

       

   

   

 

 

    out对象及方法

 

 

    jsp内置对象谈讨之二:

    request对象

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

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

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

        第三:表单的格式:

            

                 <各表单对象>

                 <提交按钮>

            

             在单击提交按钮后,会自动执行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:

   


 

    <%

    out.println("
getMethod:");

    out.println(request.getMethod());

    out.println("
getParameter:");

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

 

    out.println("
getAttributeNames:");

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

    while(e.hasMoreElements())

    out.println(e.nextElement());

 

    out.println("
getCharacterEncoding:");

    out.println(request.getCharacterEncoding());

    out.println("
getContentLength:");

    out.println(request.getContentLength());

    out.println("
getContentType:");

    out.println(request.getContentType());

    out.println("
getLocale:");

    out.println(request.getLocale());

    out.println("
getProtocol:");

    out.println(request.getProtocol());

    out.println("
getRemoteAddr:");

    out.println(request.getRemoteAddr());

    out.println("
getRemoteHost:");

    out.println(request.getRemoteHost());

    out.println("
getRemoteUser:");

    out.println(request.getRemoteUser());

    out.println("
getServerName:");

    out.println(request.getServerName());

    out.println("
getServerPort:");

    out.println(request.getServerPort());

    out.println("
getSession:");

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

    out.println("
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)+"
");

    }

    %>

    通过这个例子,我们知道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+"
");

    }

    %>

 

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

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

   

    第一个文件:

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

   

   

      

            

           

            

          

          

   

   

    <%

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

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

    //实例化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("

");             //输出表格

              out.print("

");                           //以下八行输出表头

                 out.print("学号");

                 out.print(""+"姓名");

                 out.print(""+"数学成绩");

                 out.print(""+"英语成绩");

                 out.print(""+"物理成绩");

                 out.print(""+"出生日期");

              out.print("

");

 

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

           { out.print("

");

                  out.print("

");

                  out.print("

");

                  out.print("

");//getXXX()的参数是表中的字段名或者字段索引位置

                  out.print("

");

                  out.print("

");  

                  out.print("

");

             out.print("

");

             }

             out.print("

"+rs.getString(2)+" "+rs.getString(3)+" "+rs.getInt("数学成绩")+" "+rs.getInt("英语成绩")+" "+rs.getInt("物理成绩")+" "+rs.getDate("出生日期")+"
");

             con.close();

         }

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

     %>

   

   

 

 

 

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.*" %>

   

   

    <%

    //使用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("
现在逆序输出记录:");

              out.print("

");

              out.print("

");

                 out.print(""+"学号");

                 out.print(""+"姓名");

                 out.print(""+"数学成绩");

                 out.print(""+"英语成绩");

                 out.print(""+"物理成绩");

           out.print("

");

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

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

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

             {out.print("

");

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

                  out.print("

");

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

                  out.print("

");

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

                  out.print("

");

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

                  out.print("

");

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

                  out.print("

");  

              out.print("

") ;         

              }

           out.print("

"+number+" "+name+" "+math+" "+english+" "+physics+"
");

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

             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) {}

     %>

   

   

 

 

    实例:随机查询

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

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

   

   

     <% 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("

");

              out.print("

");

                  out.print(""+"学号");

                  out.print(""+"姓名");

                  out.print(""+"数学成绩");

              out.print("

");

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

                 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

                           {if(i==old_i[m])

                            boo=true;

                           }

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

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

                      out.print("

");

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

                      out.print("

");

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

                      out.print("

");

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

                      out.print("

");

                      out.print("

") ;

                      sum=sum+math;

                      抽取数目--;

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

                      j++;

         }

              out.print("

"+xuehao+" "+name+" "+math+"
");

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

              con.close();

         }

       catch(SQLException e1) {}

     %>

   

   

 

 

 

参数查询:

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

   

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

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

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

   

   

   

 

   

     

成绩查询

     

输入姓名:

     

     

   

 

   

     

根据分数查询名单:
  英语分数在

   

      和

     

      之间

     
数学分数在

   

      和

     

      之间

     
 

   

 

 

   

   

 

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

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

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

   

   

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

        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("

");

                   out.print("

");

                   out.print(""+"学号");

                   out.print(""+"姓名");

                   out.print(""+"数学成绩");

                   out.print(""+"英语成绩");

                   out.print(""+"物理成绩");

                   out.print("

");

                   while(rs.next())

                        { out.print("

");

                          out.print("

");

                          out.print("

");

                          out.print("

");

                          out.print("

");

                          out.print("

");  

                          out.print("

") ; 

                         }

                   out.print("

"+rs.getString("学号")+" "+rs.getString("姓名")+" "+rs.getInt("数学成绩")+" "+rs.getInt("英语成绩")+" "+rs.getInt("物理成绩")+"
");

                   con.close();

                }

        catch(SQLExceptione)

                {  }

    %>

   

   

 

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

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

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

   

   

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

        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("

");

                 out.print("

");

                 out.print(""+"学号");

                 out.print(""+"姓名");

                 out.print(""+"数学成绩");

                 out.print(""+"英语成绩");

                 out.print(""+"物理成绩");

                 out.print("

");

           while(rs.next())

                { out.print("

");

                  out.print("

");

                  out.print("

");

                  out.print("

");

                  out.print("

");

                  out.print("

");  

                  out.print("

") ;         

                 }

           out.print("

"+rs.getString("学号")+" "+rs.getString("姓名")+" "+rs.getInt("数学成绩")+" "+rs.getInt("英语成绩")+" "+rs.getInt("物理成绩")+"
");

          con.close();

         }

       catch(SQLException e)

               {}

    %>

   

   

 

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

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

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

   

   

   

查询成绩:

   

   

           按姓氏排序

           按总分排序

           按英语排序

   
 

   

   

   

 

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

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

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

   

   

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

        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("

");

                 out.print("

");

                 out.print(""+"学号");

                 out.print(""+"姓名");

                 out.print(""+"数学成绩");

                 out.print(""+"英语成绩");

                 out.print(""+"物理成绩");

                 out.print(""+"总成绩");

                 out.print("

");

                while(rs.next())

                  { out.print("

");

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

                    out.print("

");

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

                    out.print("

");

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

                    out.print("

");

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

                    out.print("

");

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

                    out.print("

");

                    int total=math+english+physics;

                    out.print("

");

                    out.print("

") ;

                   }

              out.print("

"+number+" "+xingming+" "+math+" "+english+" "+physics+" "+total+"
");

             con.close();

           }

        catch(SQLExceptione)

           {  }

     %>

   

   

 

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

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

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

   

   

   

查询成绩:

   

   

输入学生的姓氏:

   

          

   
 

   

   

   

 

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

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

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

   

   

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

        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("

");

                 out.print("

");

                 out.print(""+"学号");

                 out.print(""+"姓名");

                 out.print(""+"数学成绩");

                 out.print(""+"英语成绩");

                 out.print(""+"物理成绩");

                 out.print("

");

           while(rs.next())

                {

                     out.print("

");

                      out.print("

");

                      out.print("

");

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

                      out.print("

");

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

                      out.print("

");

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

                      out.print("

");

                      out.print("

") ; 

            

                 }

           out.print("

"+rs.getString("学号")+" "+rs.getString("姓名")+" "+math+" "+english+" "+physics+"
");

          con.close();

         }

        catch(SQLExceptione)

         {  }

    %>

   

   

 

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

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

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

   

   

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

        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("

");

                 out.print("

");

                 out.print(""+"学号");

                 out.print(""+"姓名");

                 out.print(""+"数学成绩");

                 out.print(""+"英语成绩");

                 out.print(""+"物理成绩");

                 out.print("

");

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

                { number=rs.getString(2);

                  xingming=rs.getString(3);               

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

                    { out.print("

");

                      out.print("

");

                      out.print("

");

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

                      out.print("

");

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

                      out.print("

");

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

                      out.print("

");

                      out.print("

") ; 

                    }

                 }

           out.print("

"+number+" "+xingming+" "+math+" "+english+" "+physics+"
");

          con.close();

         }

        catch(SQLExceptione)

         {  }

    %>

   

   

 

 

 

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

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

 

 

 

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

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

 

    实例一://修改

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

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

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

   

   

   

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

   

   
输入新的数学成绩:

   

   
输入新的英语成绩:

   

   
输入新的物理成绩:

   

   

   

数据库更新前的数据记录是:

     <% 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("

");

              out.print("

");

                 out.print(""+"学号");

                 out.print(""+"姓名");

                 out.print(""+"数学成绩");

                 out.print(""+"英语成绩");

                 out.print(""+"物理成绩");

              out.print("

");

           while(rs.next())

           { out.print("

");

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

                  out.print("

");

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

                  out.print("

");

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

                  out.print("

");

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

                  out.print("

");

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

                  out.print("

");  

             out.print("

");

             }

             out.print("

"+number+" "+name+" "+math+" "+english+" "+physics+"
");

             con.close();

         }

       catch(SQLException e1) {}

     %>

   

   

   

 

 

    文件二://newResult.jsp

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

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

   

   

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

        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);

           //显示更新后的表中的记录:

         %>

         

更新后的表的记录:

         <%

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

           out.print("

");

                 out.print("

");

                 out.print(""+"学号");

                 out.print(""+"姓名");

                 out.print(""+"数学成绩");

                 out.print(""+"英语成绩");

                 out.print(""+"物理成绩");

                 out.print("

");

           while(rs.next())

                {

                  out.print("

");

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

                      out.print("

");

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

                      out.print("

");

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

                      out.print("

");

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

                      out.print("

");

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

                      out.print("

");

                 out.print("

"); 

               }

           out.print("

"+number+" "+xingming+" "+math+" "+english+" "+physics+"
");

          con.close();

         }

        catch(SQLExceptione)

         { }

     %>

   

   

   

 

 

    实例二://插入记录

    文件一:

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

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

   

   

 

   

添加新的记录到数据库:

   

    同学学号:

   

   
同学姓名:

   

   
数学成绩:

   

   
英语成绩:

   

   
物理成绩:

   

   

   

数据库添加记录前的数据记录是:

     <% 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("

");

              out.print("

");

                 out.print(""+"学号");

                 out.print(""+"姓名");

                 out.print(""+"数学成绩");

                 out.print(""+"英语成绩");

                 out.print(""+"物理成绩");

              out.print("

");

           while(rs.next())

           { out.print("

");

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

                  out.print("

");

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

                  out.print("

");

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

                  out.print("

");

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

                  out.print("

");

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

                  out.print("

");  

             out.print("

");

             }

             out.print("

"+number+" "+name+" "+math+" "+english+" "+physics+"
");

             con.close();

         }

       catch(SQLException e1) {}

     %>

   

   

   

 

    //文件二:newDatabase.jsp

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

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

   

   

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

        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); //执行添加操作:

           //显示添加新记录后表中的记录:

         %>

         

添加新记录后的表:

         <%

           rs=sql.executeQuery("SELECT * FROMstudents ORDER BY 学号 ");

           out.print("

");

                 out.print("

");

                 out.print(""+"学号");

                 out.print(""+"姓名");

                 out.print(""+"数学成绩");

                 out.print(""+"英语成绩");

                 out.print(""+"物理成绩");

                 out.print("

");

           while(rs.next())

                {   out.print("

");

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

                      out.print("

");

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

                      out.print("

");

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

                      out.print("

");

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

                      out.print("

");

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

                      out.print("

");

                 out.print("

"); 

              }

           out.print("

"+n+" "+xingming+" "+math+" "+english+" "+physics+"
");

          con.close();

         }

        catch(SQLExceptionevent)

         { }

     %>

   

   

   

 

    实例三://删除记录

    文件一:

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

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

   

   

   

   

删除记录:

   

    输入被删除记录的学号:

   

   

   

   

   

数据库删除前的数据记录是:

     <% 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("

");

              out.print("

");

                 out.print(""+"学号");

                 out.print(""+"姓名");

                 out.print(""+"数学成绩");

                 out.print(""+"英语成绩");

                 out.print(""+"物理成绩");

              out.print("

");

           while(rs.next())

           { out.print("

");

                  number=rs.getString(2);

                  out.print("

");

                  name=rs.getString(3);

                  out.print("

");

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

                  out.print("

");

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

                  out.print("

");

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

                  out.print("

");  

             out.print("

");

             }

             out.print("

"+number+" "+name+" "+math+" "+english+" "+physics+"
");

             con.close();

         }

       catch(SQLException e1) {}

     %>

   

   

   

 

    文件二://delete.jsp

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

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

   

   

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

        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);

          %>

         

删除记录后的表:

         <%

           rs=sql.executeQuery("SELECT * FROMstudents ORDER BY 学号 ");

           out.print("

");

                 out.print("

");

                 out.print(""+"学号");

                 out.print(""+"姓名");

                 out.print(""+"数学成绩");

                 out.print(""+"英语成绩");

                 out.print(""+"物理成绩");

                 out.print("

");

           while(rs.next())

                {   out.print("

");

                     Stringn=rs.getString(2);

                      out.print("

");

                     Stringxingming=rs.getString(3);

                      out.print("

");

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

                      out.print("

");

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

                      out.print("

");

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

                      out.print("

");

                 out.print("

"); 

              }

           out.print("

"+n+" "+xingming+" "+math+" "+english+" "+physics+"
");

          con.close();

         }

        catch(SQLExceptionevent)

               {out.print(""+event);

               }

     %>

   

   

   

 

分页显示记录:

    假设总记录数为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.*" %>

   

   

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

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

     %>

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

   

     输入页码数

      

     

    <%  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;

             //告知客户总页数:

          %>

            

共有<%=pageCount%>页

            
每页显示<%=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;

                  }

          %>

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

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

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

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

               out.print("

");

               out.print("

");

                 out.print(""+"学号");

                 out.print(""+"姓名");

                 out.print(""+"数学成绩");

                 out.print(""+"英语成绩");

                 out.print(""+"物理成绩");

               out.print("

");

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

             {out.print("

");

                  out.print("

");

                  out.print("

");

                  out.print("

");

                  out.print("

");

                 out.print("

");  

              out.print("

") ;

               rs.next(); 

              }

           out.print("

"+rs.getString("学号")+" "+rs.getString("姓名")+" "+rs.getInt("数学成绩")+" "+rs.getInt("英语成绩")+" "+rs.getInt("物理成绩")+"
");

          con.close();

         }

       catch(SQLException e1) {}

     %>

   

   

 

 

课后作业:在上例基础上添加上一页,下一页,第一页,最后一页的链接;但第一页时无上一页,第一页链接;最后一页同理;

 

不使用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文件,在和之间增加如下描述:

      

          

                <----数据源名

                      

                     factory     ↓固定写法

                         org.apache.commons.dbcp.BasicDataSourceFactory     

                     

              

                      

                                driverClassName  ↓指写驱动  

                             com.microsoft.jdbc.sqlserver.SQLServerDriver       

                     

              

                  

                      url                     ↓数据库名

                      jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=jspdev

                

   

                           ↓提供访问数据库的名用户名和密码

                      username       

                          bn            

                 

              

                              

                 password                

                 bn   

                      

 

                              

                 maxActive               

                     20             

              

                          

                     maxIdle            

                 10             

                           

                  

                     maxWait            

                 -1             

                     

                

   

          

        第三:利用程序建立数据库的连接:

 

 <%@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("
");

    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("
");

    }

    }

    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动作标签:

   

    或者

   

    说明:

    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"%>

   

   

      

      

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

 

   

圆的半径是:

       <%=girl.getRadius()%>

   

圆的周长是:

       <%=girl.circlLength()%>

   

圆的面积是:

       <%=girl.circleArea()%>

   

   

 

/

使用getProperty(),setProperty()动作修改和获取beans的属性:

setProperty()有三种方式:

第一种:

    " />

    或者

 

    说明:上面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"%>

    <%

    //设置的属性值的数据类型必须与类中定义的类型一致。

    //但若设置的属性值的数据类型是字符串,则可以自动转化为对应的类型。

    %>

   

   

      

      

 

   

   

名字是:

   

   

   

学号是:

   

    <%double height=1.70;

    %>

   

   

身高是:

   

    米

   

   

体重是:

   

    公斤

   

   

   

 

 

 

 

 

 

setProperty()有三种方式:

第二种:(常用)

    如果需要通过HTTP表单的参数值来设置beans的相应的属性的值,则要求:

        第一:表单中的表单元素的名字必须与beans属性的名字相同;

        第二:使用动作标签:

 

    说明:

        第一:上种是通过

                 中的value="值",决定相应的属性的值;而此种的值来自表单;

        第二:beans属性的值对应表单中何元素,系统会自动按相同名字匹配;

 

实例:

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

        <%@page import="student.Student"%>

       

       

        <%

        /*

        表单的参数值用来设置beans的相应的属性的值.

        要求,表单的名字必须与beans的属性的名字相同.

        Jsp会自动将字符串转换为beans属性的类型.

       

        上面语句就实现了系统会自动根据表单中的名字来匹配beans的属性名.

        */

        %>

       

       

输入学生的姓名:

       

       

输入学生的学号:

         

       

输入学生的身高:

         

       

输入学生的体重:

       

       

       

 

 

       

       

 

 

       

 

 

       

名字是:

       

       

学号是:

       

       

身高是:

       

        米

       

体重是:

       

        公斤

       

       

       

 

//

setProperty()有三种方式:

第三种:

 

实例:

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

    <%@page import="student.Student"%>

   

   

   

   

输入学生的姓名:

   

   

输入学生的学号:

   

   

输入学生的身高:

   

   

输入学生的体重:

   

   

   

    <%

    /*

    可以使用value属性获取值.

    可以使用property=*

    可以使用param=value

    此例与上例功能相同,只是不是自动匹配,而是使用param=某域控件名

    */

    %>

   

   

 

 

   

   

名字是:

   

 

   

   

学号是:

   

 

 

    <%double height=1.70;%>

 

   

   

身高是:

   

 

    米

   

   

体重是:

   

    公斤

   

   

   

 

//

实例要求:输入一个整数,求出小于这个数的所有素数:

    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

               {if(i%j==0)

                  break;

               }

             if(j>=i)

              result.append(""+i+"
"); 

           }

      }

 

     public int getNumber()

      {return number;

      }

     public StringBuffer getResult()

      { return result;

      }

    }

 

    文件二:

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

    <%@page import="tom.jiafei.*" %>

    <%

    /*

    如果有包的话,则必须在classes文件下创建相应的文件夹.

    class文件要放于相应的目录下.

    必须在文件头引入此包.

    */

    %>

   

   

   

   

输入一个正整数:

 

   

   

 

     

     

 

   

   

小于

   

    这个数的全部素数是:

   
 

   

   

   

 

//

实例要求:输入三角形三条边,看看能不能形成一个三角形,并求出面积

    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

              triangle=true;

          else

              triangle=false;

          return triangle;

       }

     

    }

 

 

    文件二:

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

    <%@page import="triangle.Triangle"%>

   

   

 

   

 

   

输入三角形的边A:

   

   

输入三角形的边B:

   

   

输入三角形的边C:

   

   

 

   

你给出三角形的三边是:

 

   

   

 

   

 

   
边A是:

   

   
边B是:

   

   
边C是:

   

   

这三个边能构成一个三角形吗?

   

   

面积是:

   

   

 

 

   

   

//

课后作业:

作业一:显示访问量:页面上显示“你是第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("");

           out.println("Simple servlet");

           out.println(" ");

        }

    }

 

/编译:

    准备:将tomcat\common\lib\servlet-api.jar拷贝到jdk\jre\lib\ext

    说明:  因为jdk本身不具有servlet-api,则编译时找不到诸如HttpServlet类,所以不能编译;

            

 

部署:

    1。将编译好的class文件放于web-inf\classes下,如果有包,还要放于相应的包下;

    2。修改web.xml文件;此文件位于web-inf下;

   

   

   

         PUBLIC "-//Sun Microsystems, Inc.//DTDWeb Application 2.3//EN"

        "http://java.sun.com/dtd/web-app_2_3.dtd">

   

 

       

       

                

                 Hello

                

                 Hello

       

       

       

       

            

             Hello

            

             /hello

            

       

 

   

 

///访问:http://localhost:端口号/站名/serlet的url-pattern

 

OK

 

 

 

servlet获取表单提交数据:

 

实例一:

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

   

   

   

输入一个数,servlet求这个数的平方根:

   

     

     

   

 

   

输入一个数,servlet求这个数的平方根:

   

     

     

   

    <%

    //要注意:

    //网页中的地址/,都是相对于网址的,也就是相对于http://localhost:8888/

    //也可以理解为是相对于Tomcat下的WebApp目录。

    //但是:

    //Web.xml文件中配置servlet时,是相对于本站的,也即相对于http://localhost:8888/你的站点

    %>

    链接到hello那个servlet

 

   

   

 

    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("");

           Stringnumber=request.getParameter("number");     //获取客户提交的信息。

           double n=0;

             try{n=Double.parseDouble(number);

                  out.print("
"+Math.sqrt(n));

                }

             catch(NumberFormatExceptione)

                { out.print("

input numberletter please!

");

                }      

           out.println("");

        }

    }

 

    配置:

   

             sqrt

             Sqrt

   

   

       sqrt

       /StoneJsp/servlet/Sqrt

  

 

小结:

    第一:以前是表单提交的处理是由action属性指定一个jsp;现在可以指定为一个servlet;

    第二:注意:web.xml配置中的url-pattern中的/和,jsp页中的/相对不同的目录;如果用相对路径..则参照当前网页的目录;

    第三:servlet中也可以getParameter()方法获取提交信息;

 

doGet(),doPost()

实例二:

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

   

   

   

输入一个数,提交给servlet(Post方式):

   

     

     

   

    <%

    //注意上下表单的不同

    //提交方式一个是get,一个是post

    //servlet中用doGet和doPost分别处理

    %>

   

输入一个数,提交给servlet(Get方式):

   

     

     

   

   

   

 

    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("");

           out.println("");

 

           Stringnumber=request.getParameter("number");  //获取客户提交的信息。

           double n=0;

             try{n=Double.parseDouble(number);

                  out.println("

factors of"+n+" :

");

                  //求n的全部因数:

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

                      { if(n%i==0)

                        out.println(i);

                      }

                }

             catch(NumberFormatExceptione)

              { out.print("

input number letter please!

");

                }

        }

      public void  doGet(HttpServletRequestrequest,HttpServletResponse response)

                             throwsServletException,IOException

        {

           doPost(request,response);

        }

    }

 

配置:

   

            ComputerFactor

             ComputerFactor

   

  

                 ComputerFactor

                 /ComputerFactor

  

 

小结:

    第一:表单以post或者get方式提交,会自动执行servlet中的doPost()和doGet()方法;

    第二:如果希望表单不论以什么方式提交,都能执行相同的响应;则在doGet()中调用doPost();反之亦然;

    第三:注意:以超链接或者地址栏中直接请求servlet方式,是会自动执行doGet()方法;

 

/

实例三:doGet()与doPost()执行不同功能

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

   

   

   

输入一个数,提交给servlet(Post方式):

   

     

     

   

   

输入一个数,提交给servlet(Get方式):

   

     

     

   

   

   

 

    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("");

           out.println("");

 

           Stringnumber=request.getParameter("number");  //获取客户提交的信息。

           double n=0;

             try{n=Double.parseDouble(number);

                  out.println("

factors of"+n+" :

");

                  //求n的全部因数:

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

                      { if(n%i==0)

                        out.println(i);

                      }

                }

             catch(NumberFormatExceptione)

                { out.print("

input numberletter please!

");

                }

        }

      public void  doGet(HttpServletRequestrequest,HttpServletResponse response)

                             throwsServletException,IOException

        {  PrintWriter out=response.getWriter();

          response.setContentType("text/html;charset=GB2312");//设置响应的MIME类型。

           out.println("");

           out.println("");

 

           Stringnumber=request.getParameter("number");  //获取客户提交的信息。

           double n=0;

             try{n=Double.parseDouble(number);

                  out.println("

Primnumbers less"+n+" :

");

                  //求小于n的全部素数:

                  int j=1;

                  for(int i=1;i

                      { for(j=2;j

                         {if(i%j==0)

                             break;

                         }

                        if(j>=i)

                         {out.println(i);

                         }

                      }

                }

             catch(NumberFormatExceptione)

                { out.print("

input numberletter please!

");

                }

         

        }

    }

 

配置:

   

             ComputerFactorandPrimNumber

             ComputerFactorandPrimNumber

   

  

                 ComputerFactorandPrimNumber

                 /ComputerFactorandPrimNumber

  

//

 

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中的配置;比如:

            

                

                     encoding

                     gb2312

                                

            

        则,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("
");

                 }

                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中的部分配置:

    

       JDBCServlet

       com.jspdev.ch7.JDBCServlet

        

        DRIVER

        com.microsoft.jdbc.sqlserver.SQLServerDriver

       

       

        URL

        jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=jspdev

       

        

        USER

        bn

       

        

        PASSWORD

        bn

       

   

 

 

会话相关实例:

    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("");

           out.println("");

           HttpSessionsession=request.getSession(true);  //获取客户的会话对象

                       session.setAttribute("name","Zhoumin");    //设置属性

           out.println(session.getId());                  //获取会话的Id.

             out.println("");

           out.println("");

        }

      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("");

                out.println("");

              

                out.println(session.getId());                  //获取会话的Id.

                Strings=(String)session.getAttribute("name"); //获取会话中存储的数据。

                out.print("
"+s);

                out.println("");

                out.println("");

             }

          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("

");

           out.print("");

           out.print("");

           out.print("

");

        }

      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

             {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("
");

           out.print("");

           out.print("");

           out.print("");

        }

      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("
");

           out.print("");

           out.print("");

           out.print("");

        }

      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的处理方式:

   

   

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:

 

                            解决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
com.struts.common.SetCharacterEncodingFilter

encoding
UTF-8




Set Character Encoding
/*



使用过滤器的好很多,特目之中。
而且在使用国就更有用了,只要在面指定<%@ page language="java"pageEncoding="UTF-8" %>,服器就会根据本地Locale示正确的字符集。

所以我特推荐使用过滤器。

方法三:修改tomcatserver.xml文件中URIEncoding
debug="0"
acceptCount="100"
connectionTimeout="20000"
disableUploadTimeout="true"
port="80"
redirectPort="8443"
enableLookups="false"
minSpareThreads="25"
maxSpareThreads="75"
maxThreads="150"
maxPostSize="0"
URIEncoding="GBK"
>

个方法主要针对url取字符串的问题
tomcat5.0及以上版本,postget方法在编码时有所不同。如果你在url取中文就会出?号。但在tomcat4.1版本没有问题,因tomcat4.1postget方法在编码时是一

你可能感兴趣的:(Jsp/Servlet/SSH)