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)    收藏  举报

导航