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'>商城价:¥"+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">商城价:¥${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、常见配置项: