zoukankan      html  css  js  c++  java
  • jsp标准数据库

    JSP标准标签库

        Pass by xkk and author is not clear

     

    1. JSTL简介

      JSTL全名JspServer Pages Standdard Tag Library(Jsp标准标签库),它是sun公司发布的一个针对JSP开发的新组件,它允许使用标签开发Jsp页面.

       JSTL是一个标准的已制定好的标签库,它可以应用到很多领域. 如:基本输入输出、流程控制、循环、XML文件剖析、数据库查询及国际化和文字格式标准化的应用等。

      JSTL所提供的标签库主要分为五大类:

    JSTL

    前置名称

    URI

    范例

    核心标签库

    c

    http://java.sun.com/jsp/jstl/core

    <c:out>

    I18N格式标签库

    fmt

    http://java.sun.com/jsp/jstl/fmt

    <fmt:formatDate>

    SQL标签库

    sql

    http://java.sun.com/jsp/jstl/sql

    <sql:query>

    XML标签库

    Xml

    http://java.sun.com/jsp/jstl/xml

    <x:forEach>

    函数标签库

    fn

    http://java.sun.com/jsp/jstl/functions

    <fn:split>

     

    2.核心标签库

     

    功能分类

    标签名称

    表达式操作

    out、set、remove、catch

    流程控制

    if、choose、when、otherwise

    迭代操作

    forEach、forTokens

    URL操作

    import、param、url、redirect

           2.1<c:out>

             功能: <c:out>主要用来显示数据的内容

               属性列表:

    名称

    说明

    必须

    默认值

    value

    需要显示出来的值

    default

    如果value的值为null,则显示default的值

    escapeXml

    是否转换特殊字符,如:<转换成&lt;

    true

     

           实例:使用核心标签库,并输出数据

           步骤一:将标签库中所有的.jar(内部是所有的标签处理器)放到/WEB_INF/lib,将所有的.tld(内部是所有的标签库描述)放到/WEB-INF/tlds

    步骤二:Jsp页面中引用核心标签(c_out.jsp)

    <%@ page contentType="text/html;charset=gbk" language="java"%>

    <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>

     

    <%--default的两种使用方式--%>

    <%--如果在uri中输入参数name=jgl,则显示输入的value中的值,否则显示默认信息(default)--%>

    <c:out value="${param.name}" default="welecome jgl to my website!"/>

    <c:out value="${param.name}">welecome jgl to my website!</c:out>

     

    <%--value属性是必添的,escapeXml属性是true时,不解析特殊字符,false时,解析特殊字符--%>

    <c:out value="${param.name}" ecapeXml="false">&lt;c:out&gt;</c:out>

    2.2<c:set>

    功能: <c:set>主要用来将变量存储至JSP范围中 或是JavaBean的属性或Map对象中。

    属性列表:

     

    名称

    说明

    必须

    默认值

    value

    要被存储的值

    var

    欲存入的变量名称

    scope

    var变量的JSP范围

    page

    target

    JavaBean或Map对象

    property

    指定target对象的属性

          

     实例1:将变量设置到Jsp范围内,并输出

    <%--将变量定义在Jsp范围内--%>

    <%--value属性的两钟使用方式--%>

    <c:set var="username" value="jack" scope="session"/>

    <c:set var="pwd" scope="session">000</c:set>

    <%--通过el表达式语言输出--%>

    ${sessionScope.username}

    ${sessionScope.pwd}

    <%--通过jstl中<c:out>标签输出--%>

    <c:out value="${sessionScope.username}"/>

    实例2:将变量设置到javaBean对象内,并输出

    <jsp:useBean id="stu" class="net.pcedu.student"/>

    <%--通过<c:set>标签给javaBean对象的age属性设值--%>

    <c:set value="16" target="${stu}" property="age"/>

    <%--输出javaBean对象的属性值--%>

    年龄:<c:out value="${stu.age}"/>

    2.3<c:remove>

    功能:主要负责移除变量

    属性列表:

    名称

    说明

    必须

    默认值

    var

    欲移出的变量名称

    scope

    Var变量的JSP范围

    page

     

    :

    <c:remove var="username" scope="session"/>

    ${sessionScope.username}—输不出结果

    2.4<c:catch>

    功能:主要用于捕获异常

    属性列表:

    名称

    说明

    必须

    默认值

    var

    用来储存错误信息的变量

    <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

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

    <%--捕获异常,并将异常信息存储在var变量中--%>

    <c:catch var="myexp">

    <%

    int i=0;

    int j=3/0;

    %>

    </c:catch>

    <h1>异常</h1>

    <hr>

    <c:out value="${myexp}"></c:out><%--输出异常--%>

    <hr>

    <h1>异常信息</h1>

    <c:out value="${myexp.message}"/><%--获取异常信息--%>

    <hr>

    <h1>引起原因</h1>

    <c:out value="${myexp.cause}"/><%--获取引起异常的原因--%>

    2.5<c:if>

    功能:主要用于进行if判断,如果为true,则输出标签体中的内容

    名称

    说明

    必须

    默认值

    test

    如果表达式的结果为true,则执行体内容,false则相反

    var

    用来存储test运算的结果(true或false)

    scope

    Var变量的JSP范围

    page

    实例:利用<c:set>标签设置javaBean的属性age,在jsp页面中获取age,如果age<18,输出相应信息

    <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>

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

    <%--jsp页面默认是true,EL表达式被忽略--%>

    <%@ page isELIgnored="false"%>

    <%--定义一个javaBean对象--%>

    <jsp:useBean id="stu" class="net.pcedu.student"/>

    <%--通过<c:set>标签给javaBean对象的age属性设值--%>

    <c:set value="16" target="${stu}" property="age"/>

    <%--输出javaBean对象的属性值--%>

    年龄:<c:out value="${stu.age}"/>

    <%--当if判断为true时,输出标签体的内容--%>

    <c:if test="${stu.age<18}" var="young" scope="session">对不起,未成年,不能访问这个网站...</c:if>

    <%--输出if语句的判断结果--%>

    判断结果:<c:out value="${sessionScope.young}"/>

    2.6<c:choose>,<c:when>,<c:otherwise>

    <c:when>中属性列表:

    名称

    说明

    必须

    默认值

    test

    如果表达式的结果为true,则执行本体内容,false则相反

    实例:javaBean中获取color属性,并根据不同的属性值显示不同的颜色

    <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>

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

    <%@ page isELIgnored="false"%>

    <%--定义一个Color对象--%>

    <jsp:useBean id="c" class="net.pcedu.Color"/>

    <%--为Color对象设置属性--%>

    <c:set value="blue" target="${c}" property="color"/>

    <%--获取Color对象的属性值,并根据不同的属性值显示不同的颜色--%>

    <c:out value="${c.color}"></c:out>

    <c:choose>

        <c:when test="${c.color eq 'red'}">

           <font color=red face="华文行楷">你选择的颜色是:<c:out value="${c.color}"/></font>

        </c:when>

        <c:when test="${c.color eq 'blue'}">

           <font color=blue face="华文行楷">你选择的颜色是:<c:out value="${c.color}"/></font>

        </c:when>

        <c:otherwise>

           <font color=green face="华文行楷">你选择的颜色是:<c:out value="${c.color}"/>

        </c:otherwise>

    </c:choose>

    2.7<c:forEach>

    功能: <c:forEach>为循环控制,它可以将数组,集合(Collection)中的成员循序浏览一遍。

    属性列表:

     

    名称

    说明

    必须

    默认值

    var

    用来存放现在指定的成员

    items

    被迭代的集合对象

    varStatus

    用来存放现在指的相关成员信息

    begin

    开始的位置

    0

    end

    结束的位置

    最后一个成员

    step

    每次迭代的间隔数

    1

    实例:

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

    <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>

    <%@ page import="java.util.*,net.pcedu.core.UserInfo" %>

    <%--将javabean对象存放到集合中--%>

    <%

    List users=new ArrayList();

    for(int i=0;i<5;i++)

    {

    UserInfo u=new UserInfo();

    u.setName("jack-"+i);

    u.setPwd("00"+i);

    users.add(u);

    session.setAttribute("users",users);

    }

    %>

    <%--注意:EL中只可通过11个隐含对象来输出表达式中的内容(因此直接将List对象添加到EL表达式中不可用)--%>

    <%--通过<c:forEach>迭代出集合中的信息>--%>

    <h1>用户信息</h1>

    <table>

      <tr>

        <th>用户名</th>

        <th>密码</th>

        <th>当前行的索引</th>

        <th>已遍历的行数</th>

        <th>是否第一行</th>

        <th>是否最后一行</th>

      </tr>

      <c:forEach var="user" items="${users}" varStatus="status"><%--加上begin="1" end="3" step="1"属性,将只显示前三条记录--%>

      <tr>

        <td><c:out value="${user.name}"/></td>

        <td><c:out value="${user.pwd}"/></td>

        <td><c:out value="${status.index}"/></td><%--输出当前行的索引号--%>

        <td><c:out value="${status.count}"/></td><%--输出已遍历的行数--%>

        <td><c:out value="${status.first}"/></td><%--输出当前行是否是第一行--%>

        <td><c:out value="${status.last}"/></td><%--输出当前行是否是最后一行--%>

      </tr>

      </c:forEach>

    </table>

     

    <%--通过<c:forEach>输出从1到10的数据--%>

    <c:forEach var="num" begin="1" end="10" step="2">

    <c:out value="->${num}"></c:out>

    </c:forEach>

     

    <%--通过<c:forEach>遍历数组,枚举,集合等--%>

    <%

    int[]intarr=new int[]{10,20,30,40,50};

    String[]strarr=new String[]{"I","am","a","handsome","boy"};

    Vector v=new Vector();

    v.add("This");

    v.add("is");

    v.add("a");

    v.add("Enumeration");

    v.add("example");

    Enumeration e=v.elements();

    HashMap h=new HashMap();

    h.put("hello","0");

    h.put("hello1","1");

    h.put("hello2","2");

    h.put("hello3","3");

    h.put("hello4","4");

    request.setAttribute("intarr",intarr);

    request.setAttribute("strarr",strarr);

    request.setAttribute("e",e);

    request.setAttribute("h",h);

    %>

    <br>

    <h1>--遍历整形数组--</h1>

    <%--遍历整形数组--%>

    <c:forEach var="i" items="${intarr}">

    <c:out value="${i}"></c:out>

    </c:forEach>

     

    <br>

    <h1>--遍历字符串数组--</h1>

    <%--遍历字符串数组--%>

    <c:forEach var="s" items="${strarr}">

    <c:out value="${s}"></c:out>

    </c:forEach>

     

    <br>

    <h1>--遍历枚举--</h1>

    <%--遍历枚举--%>

    <c:forEach var="ee" items="${e}">

    <c:out value="${ee}"></c:out>

    </c:forEach>

     

    <br>

    <h1>--遍历HashMap--</h1>

    <%--遍历HashMap--%>

    <c:forEach var="hh" items="${h}">

    <c:out value="${hh.key}"/>=<c:out value="${hh.value}"/>

    </c:forEach>

     

    2.8<c:forTokens>

    功能:将字符串以指定的一个或多个字符分割开来

    属性列表

     

    名称

    说明

    必须

    默认值

    var

    用来存放现在的成员

    items

    被迭代的字符串

    delims

    定义用来分割字符串的字符

    varStatus

    用来存放现在指定的相关成员信息

    begin

    开始位置

    0

    end

    结束位置

    最后一个成员

    step

    每次迭代的间隔数

    1

     

    实例:

    <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>

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

     

    <%--通过一个分割符将字符串划分为数组,并遍历出来--%>

    <c:forTokens var="ele" items="blue,red,green|yellow|pink,black|white" delims="|">

    <c:out value="${ele}"/>||

    </c:forTokens>

    <br>

    <%--通过多个分割符将字符串划分问数组,并遍历出来--%>

    <c:forTokens var="ele" items="blue,red!green|yellow;pink;black|white" delims="|;,!">

    <c:out value="${ele}"/>||

    </c:forTokens>

    2.9<c:import>

    功能: <c:import>可以把其他静态或动态文件包含至本身JSP网页。

    属性列表:

    名称

    说明

    必须

    默认值

    url

    文件被包含的地址

    context

    相同容器下,其它web必须以“/”开头

    var

    储存被包含文件的内容

    scope

    var变量的JSP范围

    page

    charEncoding

    被包含文件内容的编码格式

    varReader

    储存被包含的文件的内容

    注意:<c:import>与<jsp:include>的区别

    <jsp:include>只能包含和自己同一个Web应用程序下的文件;而<c:import>除了能包含和自己同一个Web应用程序的文件外,亦可以包含不同Web应程序或者是其它网站的文件。

           实例:包含同一个web应用程序的文件和不同webweb应用程序的文件

    <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>

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

     

    <%--引入绝对路径的文件--%>

    <%--注意:被引入的文件将被解析为html的形式嵌入引用文件--%>

    <h1>引入绝对路径的文件</h1>

    <c:import url="http://127.0.0.1:8080/test/c_beimported.jsp" var="file" charEncoding="gbk"/>

    <blockquote>

    <pre>

    <c:out value="${file}"></c:out>

    </pre>

    </blockquote>

     

    <%--引入相对路径的文件--%>

    <h1>引入相对路径的文件</h1>

    <blockquote>

    <pre>

    <c:import url="c_beimported.jsp" var="f"/>

    <c:out value="${f}"></c:out>

    </pre>

    </blockquote>

     

    <%--传递参数到被引入文件--%>

    <h1>传递参数到被引入文件</h1>

    <blockquote>

    <pre>

    <c:import url="c_beimported.jsp" var="ff">

    <c:param name="name" value="jack"/>

    </c:import>

    <c:out value="${ff}"></c:out>

    </pre>

    </blockquote>

     

           2.10.<c:url>

    功能: <c:url>主要用来产生一个URL

     

    名称

    说明

    必须

    默认值

    value

    执行的URL

    context

    相同容器下,必须以“/”开头

    var

    储存被包含文件的内容

    scope

    var变量的JSP范围

    page

     

    实例将一个url存放到一个变量中,并输出url

    <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>

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

    <%--将一个url存放到一个变量中,并输出url--%>

    <c:url var="myurl" value="c_beimported.jsp" scope="session">

    <c:param name="name" value="jgl"/>

    </c:url>

    <c:out value="${myurl}"/>

     

    2.11<c:redirect>

    功能: <c:redirect>可以将客户端的请求从一个JSP网页导向到其它文件。

    属性列表:

     

    名称

    说明

    必须

    默认值

    url

    导向的目标地址

    context

    相同容器下,必须以“/”开头

     

     

    <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>

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

     

    <%--通过<c:url>获得url--%>

    <c:url value="c_beimported.jsp" var="test"><c:param name="name" value="jgl"/></c:url>

    <%--通过<c:redirect>重定向到获得的url上--%>

    <c:redirect url="${test}"/>

     

    <%--通过<c:url>获得url--%>

    <c:url value="c_beimported.jsp" var="t"></c:url>

    <%--通过<c:redirect>重定向到获得的url上(在<c:redirect>内部传参)--%>

    <c:redirect url="${t}">

    <c:param name="name" value="admin"/>

    </c:redirect>

     

    3.SQL标签库

    实例:通过数据源来连接数据库

    步骤一:配置上下文中的<Resource>(test.xml)

    <Context docBase="G:jstlProWebRoot" path="/test" reloadable="true">

    <Resource

    name="jdbc/mydb"

    auth="Container"

    type="javax.sql.DataSource"

    maxActive="100"

    maxIdle="30"

    maxWait="10000"

    username="root"

    password="admin"

    driverClassName="com.mysql.jdbc.Driver"

    url="jdbc:mysql://localhost:3306/mydb"

    />

    </Context>

    步骤二:编写DbHelper.java来进行连接

    package net.pcedu.util;

    import java.sql.Connection;

    import java.sql.ResultSet;

    import java.sql.SQLException;

    import java.sql.Statement;

    import javax.naming.Context;

    import javax.naming.InitialContext;

    import javax.naming.NamingException;

    import javax.sql.DataSource;

     

    public class DbHelper {

        DataSource ds;

        Connection conn;

        Statement stmt;

        ResultSet rs;

        public DataSource getDataSource()

        {

           //定义一个Context接口类型的变量

           Context context;

           try {

               //通过InitialContext(实现了Context接口的类)来实例化一个Context类型对象

               context=new InitialContext();

               //通过字符串名字查找到数据源对象

               ds=(DataSource)context.lookup("java:comp/env/jdbc/mydb");

           } catch (NamingException e) {

               e.printStackTrace();

           }     

           return ds;

        }

        public Connection getConnection()

        {

           if(ds==null)

           ds=getDataSource();

           try {

               //通过数据源来获得连接

               conn=ds.getConnection();

           } catch (SQLException e) {

               e.printStackTrace();

           }

           return conn;

        }

        public Statement getStatement()

        {

           if(conn==null)

           conn=getConnection();

           try {

               //通过连接来创建一个会话

               stmt=conn.createStatement();

           } catch (SQLException e) {

               e.printStackTrace();

           }

           return stmt;

        }

        public ResultSet getResultSet(String sql)

        {

           try {

               if(stmt==null)

               //通过会话来执行sql语句,并返回结果集

               rs=stmt.executeQuery(sql);

           } catch (SQLException e) {

               e.printStackTrace();

           }

           return rs;

        }

        public static void main(String[]args)

        {

           DbHelper db=new DbHelper();

           System.out.println(db.getConnection());

        }

    }

    步骤三:在Jsp页面中判断是否连接成功(index.jsp)

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

    <jsp:useBean class="net.pcedu.util.DbHelper" id="db"/>

    <%

    out.println(db.getConnection());

    %>

    3.1Javax.naming.Context 接口:

    Javax.naming.Context 接口表示一个命名上下文,定义了将对象(把连接数据库的资源封装成一个对象)和名字绑定,以及通过名字查询对象的方法。查询一个命名的对象,是通过调用Context接口的lookup方法。

     

      资源文件的属性列表

    属性

    描述

    name

    指定资源相对于JAVA:COMP/ENV上下文的JNDI

    auth

    指定资源的管理者,它有两个选项APPLICATIONContainer

    type

    指定资源所属java类的完整限定名

    maxActive

    指定在连接池中数据库连接的最大数目,指定这个值需要参照使用的数据库所配置的最大连接数。取值为0,表示没有限制

    maxIdle

    指定连接池中保留的空闲的数据库连接的最大数目。取值-1表示没有限制

    maxWait

    指定等待一个数据库连接成为可用状态的最大时间,以毫秒为单位。如果设-1,表示没有限制

    username

    连接数据库用户名

    password

    连接数据库密码

    driverClassName

    指定JDBC驱动程序类名

    url

    指定数据库的URL

     

    实例:SQL标签库中标签的使用

     

    <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>

    <%@ taglib prefix="sql" uri="http://java.sun.com/jstl/sql_rt" %>

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

    <%--从jndi名称空间中获得一个数据源--%>

    <sql:setDataSource

      var="sc"

      dataSource="jdbc/mydb"

    />

    <c:out value="${sc}"></c:out>

    <%--创建普通的数据源--%>

    <sql:setDataSource

      var="shopcart"

      driver="com.mysql.jdbc.Driver"

      url="jdbc:mysql://localhost:3306/shopcart"

      user="root"

      password="admin"

    />

    <c:out value="ok"/>

     

    <%--使用数据源进行更新--%>

    <sql:update var="up" dataSource="${sc}">

        update user set pwd='123' where name='jack'

    </sql:update>

     

    <%--含参数的更新--%>

    <sql:update var="up1" sql="update user set name=? where pwd=?" dataSource="${sc}">

       <sql:param value="rose"/>

       <sql:param value="123"/>

    </sql:update>

     

    <%--增加记录--%>

    <sql:update var="up2" sql="insert into user values(1002,'jgl','jgl')" dataSource="${sc}"/>

    <c:out value="${up2}"></c:out><%--var中存放的是影响的行数--%>

     

    <%--删除记录--%>

    <sql:update var="up3" sql="delete from user" dataSource="${sc}"/>  

     

    <%--创建表

    <sql:update var="up3" sql="create table student(name varchar(20))" dataSource="${sc}"/>

    <c:out value="${up3}"></c:out>

    --%>

     

    <%--删除表--%>

    <sql:update var="up4" sql="drop table student" dataSource="${sc}"/>

     

    <%--使用数据源进行查询--%>

    <sql:query var="query1" dataSource="${sc}">

        SELECT * FROM user

    </sql:query>

    <table border="1">

      <c:forEach var="row" items="${query1.rows}">

      <tr>

        <td>name: <c:out value="${row.name}"/></td>

        <td>pwd: <c:out value="${row.pwd}"/></td>

      </tr>

      </c:forEach>

    </table>

     

    <%--使用事务处理方式创建一个表--%>

    <%--使用事务处理方式可以将要执行的sql语句放到<sql:transaction>元素中--%>

    <sql:transaction dataSource="${sc}">

      <sql:update var="newTable">

        create table usertable (

          nameid int primary key,

          name varchar(80)

        )

      </sql:update>

    </sql:transaction>

    4.Jsp页面中出现el不能解析的异常时的解决方式

    方式一: <web-app xmlns="http://java.sun.com/xml/ns/j2ee"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"

        version="2.4">

    改成

    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

     

           方式二: <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

    改为<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>

    前提必须有c-rt.tld文件才可以

  • 相关阅读:
    【视频开发】EasyIPCamera通过RTSP协议接入海康、大华等摄像机,摒弃私有SDK接入弊端
    【视频开发】EasyIPCamera通过RTSP协议接入海康、大华等摄像机,摒弃私有SDK接入弊端
    【视频开发】RTSP SERVER(基于live555)详细设计
    【视频开发】RTSP SERVER(基于live555)详细设计
    【C/C++开发】C++编译指令#pragma pack的配对使用
    【C/C++开发】C++编译指令#pragma pack的配对使用
    【视频开发】【Live555】通过live555实现H264 RTSP直播
    【视频开发】【Live555】通过live555实现H264 RTSP直播
    【视频开发】【Live555】live555实现h264码流RTSP传输
    【视频开发】【Live555】live555实现h264码流RTSP传输
  • 原文地址:https://www.cnblogs.com/VCandy/p/5479789.html
Copyright © 2011-2022 走看看