2.21 Java基础44
1. JavaEE下的debug
debug思路


常见错误可分为500,404和其他错误。举几个典型的错误例子:

这是典型的数据库密码错误(DBUtil里写的String password写错了)

空指针错误,很可能是参数漏了。

Tomcat启动就出错了,这个错误很常见,需要具体分析。

细看是非法参数异常,映射错误(一个servlet不能有相同的映射名)。

这个是连接数据库失败(很可能是服务没开)。

数据库不存在,很可能是数据库名输错了。

没有该方法异常,实体类创建时漏了无参构造。
2.EL(表达式语言)
EL被用来简化JSP的输出<%= %>,毕竟java代码属于后端部分,写在前端页面不合适。
EL表达式 ${对象.[属性范围内]变量}
如:
<%=request.getParameter("username")%>等价于${param.username}
param是EL的内置对象
内置对象
4个内置对象为了方便输出各个范围的属性:
pageScope/ requestScope /sessionScope /applicationScope
检索顺序:当不指定范围时,例如,${user.username},将自动从pageScope开始查找,requestScope,sessionScope直到applicationScope,如果没查到,则什么也不显示。


获得名字为user的请求属性的pwd属性值,EL为:
{requestScope.user.pwd} 等价于<%=((User)request.getAttribute(“user")).getPwd()%>
EL比较运算符
有6种比较运算符,可以对值进行比较,返回值为true或fasle。
= = 或eq表示等于(equals)
!= 或ne表示不等于 (not equals)
< 或lt表示小于
> 或gt表示大于
<= 或le表示小于等于
>= 或ge表示大于等于
3.JSTL(JSP标准标签库)
标签库:标签处理器类+tld文件
作用1:简化JSP文件,不需在JSP中写大量的Java脚本
作用2:标签可以重复使用,利于维护;

tld文件中,c.tld是核心标签库,最常用的部分。
指令标签
<!-- jsp中指令 prefix 前缀 uri要用1.2版本的core 不统一使用会出问题-->
<!-- 一般如果使用c.tld标签库,前缀就用c,可增强可读性。-->
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
条件分支标签
|
标签名字 |
所在标签库 |
作用 |
属性 |
|
if |
c.tld |
实现if逻辑,当条件为true,执行标签体内容; |
test:返回值为布尔值的表达式,作为分支的条件; |
|
choose |
c.tld |
实现if/else if/else逻辑,需要与when,otherwise结合使用 |
|
|
when |
c.tld |
实现else if逻辑,与choose、otherwise配合使用; |
test:返回值为布尔值的表达式,作为分支的条件;
|
|
otherwise |
c.tld |
实现else逻辑,与 choose、when配合使用; |
|
..........
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c"%>
.........
<center>
<c:set var = "name" value = "Brain"/>
<c:if test= "${not empty name }">
<c:out value = "${name }"/>
</c:if>
</center>

迭代标签
|
标签名字 |
所在标签库 |
作用 |
属性 |
|
forEach |
c.tld |
迭代集合或数组; |
items:需要迭代的数组或集合对象,可以使用EL表达式; var:迭代过程中的临时变量; |
|
forToken |
c.tld |
迭代字符串; |
items:指定需要迭代的字符串 delims:表示分隔符 var:表示使用分隔符分割items产生的字符串 |
<c:forEach var="varName" items="items" varStatus="varStatus">
……
</c:forEach>

4.分页
放在原有DBUtil.java工具类后面的代码:
/**
* 查询单个记录
*
* @param sql
* @param params
* @return
*/
public static int exCountQuery(String sql, Object... params) {
int totalCount = 0;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 2获取连接
conn = getConn();
// 3得到一个PrepardStatement
pstmt = conn.prepareStatement(sql);
// 设置占位符的参数
setPreparedStatement(pstmt, params);
// 4执行具体操作 (ResultSet 结果集)
rs = pstmt.executeQuery();
// 5遍历rs
if (rs.next()) {
//
totalCount = rs.getInt("c");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
closeAll(rs, pstmt, conn);
}
return totalCount;//
}
/**
* 分页查询
*
* @param sql
* @param cla
* @param pageNo 当前页页码
* @param pageSize 当前页显示的记录数
* @param params
* @return
*/
public static PageData exQueryByPage(String sql, Class cla, int pageNo, int pageSize, Object... params) {
List list = new ArrayList();
// 1 先查询sql,注意没有拼接limit之前,目的只是得到"总记录数"
// select count(*) from (select * from blog where blogtitle like '%程序%' ) as t
String totalCountSql = " select count(*) as c from ( " + sql + " ) as t";
int totalCount = exCountQuery(totalCountSql, params);
// 起始位置
int start = (pageNo - 1) * pageSize;
// 2 查询要返回数据集 "select * from blog where blogtitle like ? " + " limit 0," +pageSize
sql = sql + " limit " + start + "," + pageSize;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 2获取连接
conn = getConn();
// 3得到一个PrepardStatement
pstmt = conn.prepareStatement(sql);
// 设置占位符的参数
setPreparedStatement(pstmt, params);
// 4执行具体操作 (ResultSet 结果集)
rs = pstmt.executeQuery();
// 5遍历rs
while (rs.next()) {
Object obj = convert(rs, cla);
// 得到一个obj ,将其加入list
list.add(obj);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
closeAll(rs, pstmt, conn);
}
PageData pd = new PageData<Object>();
pd.setPageNo(pageNo);
pd.setPageSize(pageSize);
pd.setList(list);
// 总记录数
pd.setTotalCount(totalCount);
return pd;
}
新增的用于分页的PageData类
package com.etc.util;
import java.util.List;
/**
* 分页有关的数据
*
* @author Administrator
*
*/
public class PageData<T> {
// 页码
private int pageNo;
// 当前页面的记录数
private int pageSize;
// 总记录数
private int totalCount;
// 总页数
private int totalPage;
// 当前页的数据
private List<T> list;
/**
* 自定义计算总页数的方法
* @return
*/
public int getTotalPage() {
// 总页数和总记录数关系
totalPage = totalCount / pageSize;
if (totalCount % pageSize != 0) {
totalPage = totalPage + 1;
}
return totalPage;
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
@Override
public String toString() {
return "PageData [pageNo=" + pageNo + ", pageSize=" + pageSize + ", totalCount=" + totalCount + ", totalPage="
+ getTotalPage() + ", list=" + list + "]";
}
//注意,上面已经对totalPage的获取方法作了分类,因此toString方法里的totalPage应等于的是getTotalPage()方法。
}
Dao层里的分页方法
/**
* 分页加模糊查询
*/
public PageData<Users>queryUsersByPageAndLike(String keywords,int pageNo,int pageSize);
实现
@Override
public PageData<News> queryNewsByPageAndLike(String keywords, int pageNo, int pageSize) {
String sql="select * from news where newstitle like? or newscontent like?";
PageData<News>pd=DBUtil.exQueryByPage(sql, News.class, pageNo, pageSize, keywords,keywords);
return pd;
}
测试类

posted on 2022-02-21 19:38 heyiyang1312 阅读(13) 评论(0) 收藏 举报
浙公网安备 33010602011771号