zoukankan      html  css  js  c++  java
  • JSTL、断点、JavaEE、DBUTils连接池

    summarize

    JSTL在jsp页面上用标签去写if语句for循环,jstl 出现目的和el一样,替代 jsp 页面上的脚本代码,JSTL有5个字库,目前常用核心库 Core库,其他4个库是jsp时代用,目的为了完成jsp上的增删改查。

     在使用JSTL时,第一步引入<%@taglib%> 指令,每个页面都要导一次 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

    域里面取集合 注意items一定要写el表达式. 编辑JSP页面 用el表达式和JSTL标签遍历 简单方便

     找错误:根据文件来找错误   1.页面找错  用f12找 ,例:jsp标签的错 2.  Debug断点找错

    javaEE的开发模式javaEE开发模式 就是JavaWeb的开发模式,套路!model1模式:jsp+javaBean 弊端:混乱复杂。  model2:jsp+Servlet+javaBean ,Servlet:处理java,jsp:做页面

     DBUtils:简化JDBC的,少些代码,apache commons组件一成员:DBUtils,它有三个核心功能 

    ① QueryRunner 对SQL操作 ② ResultSetHandler 接口,定义select操作后,封装结果集。 ③ DbUtils类,是一个工具类,关闭资源与事务处理方法

     连接池:在实际开发中,“获得连接”或“释放资源”非常消耗系统资源的两个过程,这时候我们采用连接池技术,提高程序执行效率和降低系统资源开销,共享Connection,这样就不需要每次创建、释放连接,这些操作都交给连接池。用池(pool)管理Connection,可以重复使用,当使用完后,调用的close方法不会真的关闭,Connection,而是把它归还池。

    JSTL技术

    1.JSTL概述

    JSTL(JSP Standard Tag Library),JSP标准标签库,可嵌入jsp页面中使用标签形式完成业务逻辑等功能,和el一样出现目的替代jsp页面中脚本代码,STL标准标签库有5个子库,JSTL标准标签库有5个子库,目前最常用核心库Core库,其他4个库都是jsp时代用,目的为了完成在jsp上完成增删改查,很麻烦。

    2.JSTL下载与导入

    JSTL下载:

    从Apache的网站下载JSTL的JAR包。进入  “http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/” 网址下载 JSTL的安装包。jakarta-taglibs-standard-1.1.2.zip,然后将下载好的JSTL安装包   进行解压,此时,在lib目录下可以看到两个JAR文件,分别为jstl.jar和standard.jar。jstl.jar 包含JSTL规范中定义的接口和相关类,standard.jar 包含用于  实现JSTL的.class文件以及JSTL中5个标签库描述符文件(TLD)

    将两个jar包导入我们工程的lib中,使用jsp的taglib指令导入核心标签库

    3.JSTL核心库的常用标签

    1)<c:if test=””>标签:test是返回boolean的条件

    1)<c:forEach>标签:使用方式有两种组合形式:

    代码演示

    <%@page import="java.util.HashMap"%>
    <%@page import="java.util.Map"%>
    <%@page import="java.util.ArrayList"%>
    <%@page import="com.oracle.domain.User"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <%-- <c:if test="${1==1 }"><!-- 判断是否正确 判断时必须在大括号里面判断 -->
        正确
        </c:if>
        <c:if test="${1!=1 }"><!-- 用取反判断这是错误 相当于else -->
        错误
        </c:if> --%>
        <!-- 普通for -->
        <c:forEach begin="0" end="10" var="i">
            ${i }   <!-- 这里加上$会显示0到5,只写i,就会显示5个i -->
        </c:forEach>
        <%
            User user1=new User();
            user1.setAge(8);
            user1.setName("袁一鸣");
            User user2=new User();
            user2.setAge(10);
            user2.setName("胸大");
            ArrayList<User> list=new ArrayList<User>();
            list.add(user1);
            list.add(user2);
            request.setAttribute("UserList",list);
            //创建Map <String,User
            Map<String,User> map=new HashMap<String,User>();
            map.put("1",user1);
            map.put("2",user2);
            //创建List<String>
            ArrayList<String> arr=new ArrayList<String>();
            arr.add("a");
            arr.add("b");
            session.setAttribute("str",arr);        
        %>
    </body>
    </html>

     示例:

    1)遍历List<String>的值

    2)遍历List<User>的值

    3)遍历Map<String,String>的值

    4)遍历Map<String,User>的值

    5)遍历Map<User,Map<String,User>>的值

    entry.key-----User

    entry.value------List<String,User>

     导包注意:jsp里面导包时,在代码下划线后面 alt+/ 导包

     先创建domain包创建实体类

    package com.oracle.domain;
    //创建一个class 并私有
    public class User {
        private String name;
        private int age;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "User [name=" + name + ", age=" + age + "]";
        }
        
    }
    <%@page import="java.util.HashMap"%>
    <%@page import="java.util.Map"%>
    <%@page import="java.util.ArrayList"%>
    <%@page import="com.oracle.domain.User"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
     <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>   
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <!-- 创建集合,并从域里面取出集合 -->
    <%
    /* 先向域里设置值 */
        User user1=new User();
        user1.setAge(8);
        user1.setName("袁一鸣");
        User user2=new User();
        user2.setAge(10);
        user2.setName("胸大");
        ArrayList<User> list=new ArrayList<User>();
        /*两个对象放入list集合 */
        list.add(user1);
        list.add(user2);
        request.setAttribute("UserList",list);
        /* 创建Map<String,User> */
        Map<String,User> map=new HashMap<String,User>();
        map.put("1",user1);
        map.put("2",user2);
        application.setAttribute("UserMap",map);
        /* 创建List<String> */
        ArrayList<String> arr=new ArrayList<String>();
        arr.add("a");
        arr.add("b");
        session.setAttribute("str",arr);
    %> 
    <!-- 从域里面取出集合 --> <!-- 遍历ListString 类型 --> <!-- 现在学的增强for--> <!-- 增强for用items属性,items要跟el表达式搭配使用,item:声明遍历的容器名,var:变量名 --> <c:forEach items="${str }" var="s"> ${s } </c:forEach> <!-- 之前学的增强for 这两个功能一样 --> <!-- for(String s:str){ System.out.println(s); } --> <!-- 遍历ListUser类型 --> <c:forEach items="${UserList}" var="user"> ${user.name}...${user.age} </c:forEach> <!-- 以前学过的 增强for遍历USer --> <!-- for(User user:UserList){ System.out.println(user.getName()+"..."+user.getAge()) } --> <!-- 遍历Map --><!-- entry就是map里的结婚证 --> <c:forEach items="${UserMap}" var="entry"> ${entry.key}...${entry.value.name}...${entry.value.age} </c:forEach> </body> </html>

    注意:每个jsp页面都要 引入一遍

    遍历结果: 

    用el表达式和JSTL标签 遍历 Shop

    步骤:先把页面改成EL和JSTL 一块遍历

    第一步:先导包 ,在jsp页面上 引入 <%@ taglib%> 展示部分代码和效果

    /* 增强for 循环遍历集合 */
            for(Product pro:list){
                out.write("<div class='col-md-2'>");
                out.write("<a href='product_info.htm'>");
                out.write("<img src='"+pro.getPimage()+"' "+
                "width='170' height='170' style='display: inline-block;'>");
                out.write("</a>");
                out.write("<p>");
                out.write("<a href='product_info.html'"
                        +"style='color: green'>"+pro.getPname()+"</a>");
                out.write("</p>");
                out.write("<p>");
                out.write("<font color='#FF0000'>商城价:&yen;"+pro.getMarket_price()+"</font>");
                out.write("</p>");
                out.write("</div>");
            }
    %> --%>
    <!-- 上面是老方法,麻烦,现在用forEach 来写增强for  -->
    <c:forEach items="${ProductList}" var="pro">
        <div class="col-md-2" style="height:250px"><!-- 这里style设置布局 -->
                <a href="product_info.htm"> <img src="${pro.pimage }"
                    width="170" height="170" style="display: inline-block;">
                </a>
                <p>
                    <a href="product_info.html" style='color: green'>${pro.pname }</a>
                </p>
                <p>
                    <font color="#FF0000">商城价:&yen;${pro.market_price }</font>
                </p>
            </div>
    </c:forEach>

    黄色代码就是用 </c:forEach>来替换以前的增强for.style="height:250px" 设置布局用的

     

     找错误:

     Debug断点找错: 代码错误看后台,要看第一条,看什么异常,找到那一行,在错误代码的下一行根部,双击加断点,断点可以无数个,启动Debug模式运行 ,在server 右击找 小爬虫,运行网页请求,这时会弹出询问框,“是否进入debug模式”  选yes。

    当进入Debug模式时,会自动切换这里。然后就看

    接下来看

      断点上面一行是错误代码

    跳到下一个断点 一行一行循环执行Debug

      取消断点

    pm

    javaEE的开发模式

    1.什么是模式   模式在开发过程中总结出的“套路”,总结出的一套约定俗成的设计模式

    2.javaEE经历的模式

    model1模式:不推荐

    技术组成:jsp+javaBean

    model1的弊端:随着业务复杂性 导致jsp页面比较混乱

    model2模式

    技术组成:jsp+servlet+javaBean

    model2的优点:开发中 使用各个技术擅长的方面

    servlet:处理java业务代码

    jsp:擅长页面的实现

    MVC:---- web开发的设计模式

    M:Model---模型 javaBean:封装数据

    V:View-----视图 jsp:单纯进行页面的显示

    C:Controller----控制器 Servelt:获取数据--对数据进行封装--传递数据--     指派显示的jsp页面

    3.javaEE的三层架构

    服务器开发时 分为三层

    web层:与客户端交互

    service层:复杂业务处理

    dao层:与数据库进行交互

    开发实践时 三层架构通过包结构体现

    MVC与JavaEE三层架构有什么关系?

    总结:

    EL表达式

    从域中取出数据 ${域中存储的数据的name}

    ${pageContext.request.contextPath}

    JSTL标签(核心库)

    <%@ taglib uri=”” prefix=”c”%>

    <c:if test=””>

    <c:forEach items=”数组或集合” var=”数组或集合中的每一个元素”>

    一、  DBUtils

    利用DBUtils进一步简化JDBC数据库的增删改查的代码,同时利用从连接池中接取连接,进而进行简化和减少资源的消耗!

    1.1   概述

    DBUtils

    1、JDBC简化开发工具包,需要导入 commons-dbutils-1.6.jar 工具包才能使用DBUtils工具

    2、是java编程中的数据库操作实用工具,小巧简单实用

    3、封装了对JDBC的操作,简化了JDBC,可以少写代码

    Dbutils三个核心功能介绍

    ①、QueryRunner对sql语句操作的API.

    ②、ResultSetHandler接口,定义select操作后,封装结果集.

    ③、DbUtils类,是一个工具类,关闭资源与事务处理的方法

    二   QueryRunner核心类

    update(Connection conn, String sql, Object... params) ,表数据的增加、删除、更新(“Object....” 意思是可变参数,有返回值  int )

    query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,表查询 

    三   QueryRunner实现添加、更新、删除操作update

    update的增删改展示代码:

    // 新增
        public int addSort(Integer sid, String sname) throws SQLException {
            // 获取连接对象
    //        Connection conn = JDBCUtils.getConn();
            // 创建QueryRunner对象
    //        QueryRunner qr = new QueryRunner();
            QueryRunner qr = new QueryRunner(MyDBUtils.getDataSource());
            String sql = "insert into sort values(?,?)";
    //        int row = qr.update(conn, sql, sid, sname);
            int row = qr.update(sql, sid, sname);
            return row;
        }
    
        // 修改
        public int updateSort(Integer sid, String sname) throws SQLException {
            // 获取连接对象
            Connection conn = JDBCUtils.getConn();
            // 创建QueryRunner对象
            QueryRunner qr = new QueryRunner();
            String sql = "update  sort set sname=? where sid=?";
            int row = qr.update(conn, sql, sname, sid);
            return row;
        }
    
        // 删除
        public int deleteSort(Integer sid) throws SQLException {
            // 获取连接对象
            Connection conn = JDBCUtils.getConn();
            // 创建QueryRunner对象
            QueryRunner qr = new QueryRunner();
            String sql = "delete from  sort  where sid=?";
            int row = qr.update(conn, sql, sid);
            return row;
        }

    四  QueryRunner 实现查询操作

     query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params),用来完成表数据的查询操作

    1、ResultSetHandler(是个接口,需要实现类)结果集处理类:

    2、JavaBean:(实体类---以前的domain包)

    JavaBean就是一个类,在开发中常用封装数据。具有如下特性:

    ①、需要实现接口:java.io.Serializable ,通常实现接口这步骤省略了,不会影响程序。

    ②、提供私有字段:private 类型 字段名;

    ③、提供getter/setter方法:

    ④、提供无参构造

    package com.oracle.dao;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.List;
    
    import javax.management.Query;
    
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.ArrayListHandler;
    import org.apache.commons.dbutils.handlers.BeanHandler;
    import org.apache.commons.dbutils.handlers.BeanListHandler;
    import org.apache.commons.dbutils.handlers.ColumnListHandler;
    import org.apache.commons.dbutils.handlers.ScalarHandler;
    
    import com.oracle.domain.Sort;
    import com.oracle.tools.JDBCUtils;
    import com.oracle.tools.MyDBUtils;
    
    public class SortDao {
    //    新增
        public int addSort(Integer sid,String sname) throws SQLException{
    /*//        获取连接对象
            Connection conn=JDBCUtils.getConn();*/
    //        创建QueryRunner对象
            QueryRunner qr=new QueryRunner(MyDBUtils.getDataSource());
            String sql="insert into sort values(?,?)";
            int row=qr.update(sql,sid,sname);
            return row;
        }
    //    修改
        public int update(Integer sid,String sname) throws SQLException{
    //        获取连接对象
            Connection conn=JDBCUtils.getConn();
    //        创建QueryRunner对象
            QueryRunner qr=new QueryRunner();
            String sql="update sort set sname=? where sid=?";
            int row=qr.update(conn,sql,sname,sid);
            return row;
        }
    //    删除
        public int delete(Integer sid) throws SQLException{
    //        获取连接对象
            Connection conn=JDBCUtils.getConn();
    //        创建QueryRunner对象
            QueryRunner qr=new QueryRunner();
            String sql="delete from sort where sid=?";
            int row=qr.update(conn,sql,sid);
            return row;
        }
    //    ArrayListHandler查询:结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中
        public List<Object[]> get1() throws SQLException{
    //        获取连接对象
            Connection conn=JDBCUtils.getConn();
    //        创建QueryRunner对象
            QueryRunner qr=new QueryRunner();
            String sql="select * from sort";
            List<Object[]> obj=qr.query(conn,sql,new ArrayListHandler());
            return obj;
        }
    //    BeanHandler查询:结果集中第一条记录封装到一个指定的javaBean
        public Sort get2(Integer sid,String sname) throws SQLException{
    //        获取连接对象
            Connection conn=JDBCUtils.getConn();
    //        创建QueryRunner对象 
            QueryRunner qr=new QueryRunner();
            String sql="select * from sort where sid=? and sname=?";
    //                                        BeanHandler<泛型>+类型字节码文件对象
            Sort sort=qr.query(conn,sql,new BeanHandler<Sort>(Sort.class),sid,sname);
            return sort;
        }
    //    BeanListHandler查询:结果集中每一条记录封装到一个指定的javaBean,将这些javaBean在封装到List集合中
        public List<Sort> get3() throws SQLException{
    //        获取连接对象
            Connection conn=JDBCUtils.getConn();
    //        创建QueryRunner对象
            QueryRunner qr=new QueryRunner();
            String sql="select * from sort";
            List<Sort> arr=qr.query(conn, sql,new BeanListHandler<Sort>(Sort.class));
            return arr;
        }
    //    ColumnListHandler查询 :指定的列的字段值,封装到一个List集合
        public List<String> get4() throws SQLException{
    //        获取连接对象
            Connection conn=JDBCUtils.getConn();
    //        创建QueryRunner对象
            QueryRunner qr=new QueryRunner();
            String sql="select * from sort";
    //                                                        这里写指定那一列的泛型,指定名字
            List<String> list=qr.query(conn,sql,new ColumnListHandler<String>("sname"));
            return list;
        }
        
    //    ScalarHandler查询 :单数据查询,例:count(*),默认Long类型
        public Integer get5() throws SQLException{
    /*        获取连接对象
           Connection conn=JDBCUtils.getConn();*/
    //        创建QueryRunner对象  这里用了连接池后,就不用在获取连接对象
            QueryRunner qr=new QueryRunner(MyDBUtils.getDataSource());
            String sql="select count(*) from sort";
            Long count=qr.query(sql,new ScalarHandler<Long>());
    //        这里需要转换,Long转Integer
            return count.intValue();//包装类型转换 intValue
            }
        }
    
    测试 ---------------------------------------- Demo
    
    package com.oracle.test;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.List;
    
    import org.apache.commons.dbutils.QueryRunner;
    
    import com.oracle.dao.SortDao;
    import com.oracle.domain.Sort;
    import com.oracle.tools.JDBCUtils;
    
    public class Demo {
        public static void main(String[] args) throws SQLException {
            SortDao sortDao=new SortDao();
            /*新增测试
            int row=sortDao.addSort(20, "服饰");
            System.out.println(row);*/
            
            /*修改测试
            int row1=sortDao.update(20, "香水");
            System.out.println(row1);*/
            
            /*删除测试
            int row=sortDao.delete(20);
            System.out.println(row);*/
            
            /*ArrayListHandler测试
            List<Object[]> obj=sortDao.get();
            //遍历
            for (Object[] o:obj) {
                for (Object oo:o) {
                    System.out.println(oo);
                }
            }*/
            /*BeanHandler查询
            Sort sort=sortDao.get2(9, "家电");
            System.out.println(sort);*/
            
            /*BeanListHandler查询
            List<Sort> arr=sortDao.get3();
            System.out.println(arr);*/
            
            /*ColumnListHandler查询
            List<String> arr=sortDao.get4();
            System.out.println(arr);*/
            
    //        ScalarHandler查询
            int count=sortDao.get5();
            System.out.println(count);
        }    
    }

    五、连接池

    1、概述:

      用池管理Connection,可以重复使用Connection。有了池,我们就不用自己来创建Connection,通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。(不调用的话自动归还)

    2、规范:

      Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!

    常见连接池:DBCP、C3P0。

    3、DBCP连接池:

    ①、导包:commons-dbcp-1.4.jar       commons-pool-1.5.6.jar

    ②、编写工具类:

    连接数据库表的工具类, 采用DBCP连接池的方式来完成,Java中提供了一个连接池的规则接口 :

      DataSource :是java中提供的连接池,作为 DriverManager 工具的替代项。在DBCP包中提供了DataSource接口的实现类,我们要用的具体的连接池 BasicDataSource类:

    先导包

     

    有了DBUtils后,我们以后就无需在写获取连接对象了 ,在创建 QueryRunner 对象时,直接从连接池里获取随机池就可以了 ,这样就省了不少代码 

    package com.oracle.tools;
    
    import javax.sql.DataSource;
    
    import org.apache.commons.dbcp.BasicDataSource;
    
    public class MyDBUtils {
        public static final String DRIVER = "com.mysql.jdbc.Driver";
        public static final String URL = "jdbc:mysql://localhost:3306/java0603?useUnicode=true&characterEncoding=UTF-8";
        public static final String USERNAME = "root";
        public static final String PASSWORD = "123456";
        /*
         * 创建连接池BasicDataSource
         */
        public static BasicDataSource dataSource = new BasicDataSource();
        //静态代码块(优先只执行一次)
        static {
            //对连接池对象 进行基本的配置
            dataSource.setDriverClassName(DRIVER); // 这是要连接的数据库的驱动
            dataSource.setUrl(URL); //指定要连接的数据库地址
            dataSource.setUsername(USERNAME); //指定要连接数据的用户名
            dataSource.setPassword(PASSWORD); //指定要连接数据的密码
        }
        /*
         * 返回连接池对象
         */
        public static DataSource getDataSource(){
            return dataSource;
        }
    }

    3、常见配置项:

  • 相关阅读:
    [转载]浅谈多态机制的意义及实现
    [转载]浅析Java虚拟机结构与机制
    为什么调用 FragmentPagerAdapter.notifyDataSetChanged() 并不能更新其 Fragment?
    Android-- FragmentStatePagerAdapter分页
    android-点击空白或点击除EditText之外的控件隐藏软键盘
    populating-next-right-pointers-in-each-node
    roman-to-integer
    same-tree
    palindrome-number
    best-time-to-buy-and-sell-stock
  • 原文地址:https://www.cnblogs.com/zs0322/p/11160697.html
Copyright © 2011-2022 走看看