这是本次项目的最后一个问题了,把这个问题解决了,项目就彻底竣工了。先说说要达到的效果:点击一个关键字,使用URL重写传值给Servlet,然后从数据库中查出所有包含这个关键字的文章。
然而在JSP中我们点击这样一个超级链接:http://localhost:8080/wwwroot/tagservlet?tag=数据库
可是这样传递的值我们在Servlet中是没法获取到的,我们需要对这里的汉字进行URL编码,这样我们才能够在Servlet中使用request.getParameter("tag")获得我们传递过来的值。为此,我们需要导入java.net.URLEncoder这个包,接下来使用URLEncoder.encode("数据库")来将“数据库”这三个字进行转码得到的结果是“%CA%FD%BE%DD%BF%E2”,如此一来我们的链接就变为了:http://localhost:8080/wwwroot/tagservlet?tag=%CA%FD%BE%DD%BF%E2
然而,当用request.getParameter("tag")获取这个值并将其输出,你会发现是一堆“?”,这里还得在转码才能得到汉字:
String tag = request.getParameter("tag");
tag = new String(tag.getBytes("ISO-8859-1"),"GBK");
这下终于好了,为什么汉字总是这么麻烦,老要转来转去的,老外的字母就没有问题…
以前写的那个[jsp中实现分页显示数据] 方法不通用,得找个分页标签。关于pager-taglib的使用方法网上虽说一大堆,但是同样费我不少脑细胞去看。有的代码不齐全,有的根本就是错误的,有的写的很潦草,看的我是云里雾里的,经过本人耗费大量的脑细胞奋战N个小时终于搞出了点猫腻。
想明白了,写出来运行成功了,我才发现其实用法很简单,没那些人写的那么麻烦。
首先当然还是要导pager-taglib.jar包了,可以去http://jsptags.com/tags/navigation/pager/index.jsp下载,从下载下来的war文件中找到pager-taglib.jar包以及pager-taglib.tld文件。将pager-taglib.tld文件放在WEB-INF目录下,将pager-taglib.jar放在WEB-INF/lib目录下(JBuilder中的导入方法可以参考[Servlet中实现文件上传] )。
新建一个bean文件定义如下两个方法(不一定非要这个样子):
- /**
- * 该方法用于获得数据总数
- * @return int
- */
- public int getArticlesCount() {
- String sql = "SELECT COUNT(*) FROM blog_Article";
- dbc = new DataSource();
- stmt = dbc.getPreparedStatement(sql);
- rs = dbc.getResultSet(stmt);
- int count = 0;
- try {
- if(rs.next()){
- count = rs.getInt(1);
- }
- } catch (SQLException ex) {
- ex.printStackTrace();
- } finally {
- dbc.closeConnection();
- }
- return count;
- }
- /**
- * 该方法用于数据分页
- * @param begin int
- * @param end int
- * @return ArrayList
- */
- public ArrayList getArticlesAll(int begin,int end) {
- String sql = "select top "+end+" * from blog_Article where (log_ID <= (select min(log_ID) from (select top "+begin+" log_ID from blog_Article order by log_PostTime desc) as t)) order by log_PostTime desc";
- ArrayList list = new ArrayList();
- dbc = new DataSource();
- stmt = dbc.getPreparedStatement(sql);
- rs = dbc.getResultSet(stmt);
- try {
- while (rs.next()) {
- ArticleBean article = new ArticleBean();
- article.setId(rs.getInt(1));
- //赋值操作…
- article.setTag(rs.getString(10));
- article.setIsTop(rs.getByte(11));
- list.add(article);
- }
- } catch (SQLException ex) {
- ex.printStackTrace();
- } finally {
- dbc.closeCon
nection(); - }
- return list;
- }
接下来新建一个JSP页面(需要JSTL):
- <%@ page contentType="text/html; charset=GBK" import="java.util.*,com.nkblog.bean.ArticleBean,com.nkblog.dbc.*" %>
- <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
- <%@ taglib uri="WEB-INF/pager-taglib.tld" prefix="pg" %>
- <%
- request.setCharacterEncoding("GBK");
- String offset = request.getParameter("pager.offset");//pager.offset为此分页标签内置变量用于传递页数
- int page = 0;
- if(offset == null){
- //若offset为null则是第一次访问,所以显示第一页
- page= 1;
- }else{
- //反之,则按照传递来的页数来分
- page = Integer.parseInt(offset)+1;
- }
- //获取数据总数
- int dataTotal = ArticleManager.getArticlesCount();
- //查询分页数据,10为每页要显示的数据量,可自定义
- ArrayList articles = ArticleManager.getArticlesAll(page,10);
- %>
- <%
- for(int i=0;i<articles.size();i++)
- {
- //输出取出的10条数据…
- }
- %>
- <pg:pager scope="request" maxIndexPages="5" index="center" maxPageItems="10" url="index.jsp" items="<%=dataTotal%>" %>" export="currentPageNumber=pageNumber">
- <pg:first><a href="${pageUrl}">首页</a></pg:first>
- <pg:prev><a href="${pageUrl}">前页</a></pg:prev>
- <pg:page>
- </pg:page>
- <pg:pages>
- <c:choose>
- <c:when test="${pageNumber eq currentPageNumber }">
- <font color="red">${pageNumber }</font>
- </c:when>
- <c:otherwise>
- <a href="${pageUrl }">${pageNumber}</a>
- </c:
otherwise> - </c:choose>
- </pg:pages>
- <pg:next><a href="${pageUrl}">下页</a></pg:next>
- <pg:last><a href="${pageUrl}">尾页</a></pg:last>
- </pg:pager>
接下来具体说明上面的分页标签<pg:pager>
maxIndexPages为分页条个数,形如:< << 1 2 3 4 5 >> >
maxPageItems为每页要显示的数据量
url为处理分页请求的文件,可以是JSP或Servlet。当程序运行起来后,会以index.jsp?pager.offset=5的形式传递页数。
items为数据总数,pager-taglib会自动根据以上参数进行分页。
需要进行修改的也就上面这几个参数,起初看别人写的方法,我以为只要导入这个标签然后给定一个List数据集合,它就完全自动的跟也并显示数据了,汗~~也不知道我这么写会有几个看得懂的,估计懂的人有,但是能看明白我写的就少了…我发现原来代码写起来简单,但是要给别人将明白了真的好难啊。
在上一篇[jsp中实现分页显示数据] 中,我们提到了这段代码 import="java.util.ArrayList,com.dbc.DBC,com.jobs.JobsBean" 其中ArrayList是java自己本身的util包中的,DBC和JobsBean是我们自己创建的,下面我们来创建他们。
在我们上次创建的工程中,右键单击Project Source选择:new->package。写入我们的包名,例如:com.jobs 右键我们刚才创建的com.jobs包,选择:new->class->输入类名(如:JobsBean)->ok。接下来对JobsBean进行编码。双击JobsBean.java文件,选择:Bean->Properties->Add Property.Property Name中输入变量名,Type中输入变量的数据类型,输入完成之后单击ok按钮。回到Source中我们可以看到生成的代码如下:
package com.jobs;
public class JobsBean {
private int id;
private String desc;
private int min;
private int max;
public int getId() {
return id;
}
public String getDesc() {
return desc;
}
public int getMin() {
return min;
}
public int getMax() {
return max;
}
public void setId(int id) {
this.id = id;
}
public void setDesc(String desc) {
this.desc = desc;
}
public void setMin(int min) {
this.min = min;
}
public void setMax(int max) {
this.max = max;
}
}
创建dbc数据库连
本例目的:实现分页查询mssql中自带的pubs数据库中的jobs表。
首先打开JBuilder2006创建一个web模块。新建一个jsp文件,例如:list.jsp用于显示数据。
<%@page contentType="text/html; charset=GBK" import="java.util.ArrayList,com.dbc.DBC,com.jobs.JobsBean"%>
<html>
<head>
<title>list</title>
</head>
<body bgcolor="#ffffff">
<%
int pageNum = 0;
try {
pageNum = Integer.parseInt(request.getParameter("page"));//接收url重写参数
}
catch (Exception ex) {
pageNum = 0;
}
int a = 0;
if (pageNum <= 0) {//判断是否小于最小页数
a = 1;
pageNum = 0;
}
else {
a = pageNum * 10 + 1;
}
ArrayList array = new ArrayList();
JobsBean job = new JobsBean();
DBC db = new DBC();
int count = db.getCount();//获取最大页数
if(pageNum > count){//判断是否超过最大页数
&nbs
p; a = count*10+1;
pageNum = count;
}
array = db.getJobs(a);//查询数据
%>
<center>
<table border="1" bgcolor="green">
<tr>
<td>id</td>
<td>desc</td>
<td>min</td>
<td>max</td>
<td colspan="2"> 操
作
</td>
<%
for (int i = 0; i < array.size(); i++) {//迭代array
job = (JobsBean) array.get(i);//强制转换成JobsBean类型
%>
<tr>//使用get()方法取值
<td><%=job.getId() %> </td>
<td><%=job.getDesc() %> </td>
<td><%=job.getMin() %> </td>
<td><%=job.getMax() %> </td>
<td>//以下用于url重写实现后面将要实现的修改,删除等操作
<a href="edit.jsp?id=<%=job.getId()%>">修改</a>
</td>
<td>
<a href="del.jsp?id=<%=job.getId()%>">删除</a>
</td>
</tr>
<%} %>
<tr>
<td>
<a href="list.jsp?page=0">首页</a>
</td>
<td>
<a href="list.jsp?page=<%=pageNum-1%>">上一页</a>
</td>
<td>
<a href="list.jsp?page=<%=pageNum+1%>">下一页</a>
</td>
<td>
<a href="list.jsp?page=<%=count%>">末页</a>
</td>
</tr>
</table>
</center>
</body>
</html>
接下来我们对上面这段代码进行分析。 import="java.util.ArrayList,com.dbc.DBC,com.jobs.JobsBean" 用于导入我们需要的包和bean
,具体将在下一篇讲到。
int pageNum = 0;
try {
pageNum = Integer.parseInt(request.getParameter("page"));
}
catch (Exception ex) {
pageNum = 0;
}
int a = 0;
if (pageNum <= 0) {
a = 1;
pageNum = 0;
}
else {
a = pageNum * 10 + 1;
}
ArrayList array = new ArrayList();
JobsBean job = new JobsBean();
DBC db = new DBC();
int count = db.getCount();
if(pageNum > count){
a = count*10+1;
pageNum = count;
}
array = db.getJobs(a);
上面这段代码中我们声明一个int型的pageNum并使用pageNum = Integer.parseInt(request.getParameter("page"))来接收list.jsp在进行url重写的时候传递来的参数。int型的a用于计算出我们要查询从第几条记录开始的10条记录。 int count = db.getCount(); if(pageNum > count){ a = count*10+1; pageNum = count; } array = db.getJobs(a); db.getCount()将返回数据按每10条一页可分出的页数,并将其与url重写时传递的参数进行比较,若pageNum大于count(即:所要查看的页数超过最大页数)则始终查询最后1页数据。使用array存储查询出的数据。
<table border="1" bgcolor="green">
<tr>
<td>id</td>
<td>desc</td>
<td>min</td>
<td>max</td>
<td colspan="2">操作</td>
<%
for (int i = 0; i < array.size(); i++) {
job = (JobsBean) array.get(i);
%>
<tr>
<td><%=job.getId() %> </td>
<td><%=job.getDesc() %> </td>
<td><%=job.getMin() %> </td>
<td><%=job.getMax() %> </td>
<td>
<a href="edit.jsp?id=<%=job.getId()%>">修改</a>
</td>
<td>
<a href="del.jsp?id=<%=job.getId()%>">删除</a>
</td>
</tr>
<%} %>
<tr>
<td>
<a href="list.jsp?page=0">首页</a>
</td>
<td>
<a href="list.jsp?page=<%=pageNum-1%>">上一页</a>
</td>
<td>
<a href="list.jsp?page=<%=pageNum+1%>">下一页</a>
</td>
<td>
<a href="list.jsp?page=<%=count%>">末页</a>
</td>
</tr>
</table> 上面这段代码使用for循环输出array中存储的数据。下面的首页,上一页等均使用url重写进行查询。