JSP实现添加功能和分页显示实例分析
本文实例讲述了JSP实现添加功能和分页显示的方法。分享给大家供大家参考。具体如下:
学习目标:
①进一步掌握MVC设计模式;
②掌握添加功能的实现;
③掌握分页显示功能的实现。
主要内容:
①通过用户信息添加功能进一步介绍MVC模式;
②通过用户信息的分页显示介绍分页显示功能的原理和实现。
1、如何采用MVC模式完成用户添加?
首先考虑与人如何交互:应该有一个输入用户信息的界面,包含用户名和口令,另外需要一反馈的界面。
然后考虑功能如何实现:需要在User类中添加一个方法,完成用户信息的添加。
最后考虑控制器:获取信息;调用JavaBean;传值;选择界面响应。
2、添加用户的界面
实际应用中的信息项比较多,并且需要对用户输入信息进行验证。这里重点强调添加过程,所以对问题进行简化。可以在登录界面的基础上修改,参考代码如下:
<%@pagecontentType="text/html;charset=gb2312"%> 添加用户<br> <formname="form1"method="post"action="addUser"> 用户ID:<inputtype="text"name="username"><br> 口令:<inputtype="password"name="userpass"><br> <inputtype="submit"value="添加"><inputtype="reset"value="重置"> </form> <%@includefile="contact.jsp"%>
3、在User中增加方法
publicbooleanaddUser()
{
Connectioncon=null;
Statementstmt=null;
booleanb;//表示添加成功与否
try{
//指出连接数据库所需要的驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");
//建立与数据库之间的连接
//需要把myserver修改为自己的数据库服务器的IP地址
//把mydb修改成自己的数据库)
con=DriverManager.getConnection("jdbc:oracle:thin:@myserver:1521:mydb","scott","tiger");
//编写查询数据库信息的SQL语句
Stringsql="insertintousertable(username,userpass)values('"+username+"','"+userpass+"')";
//创建语句对象,用于执行SQL语句
stmt=con.createStatement();
//执行没有结果集返回的语句,返回的是影响数据库表中记录的个数
intn=stmt.executeUpdate(sql);
if(n>0)
b=true;
else
b=false;
}catch(Exceptione){
b=false;
}
finally{
//关闭相关对象
if(stmt!=null)try{stmt.close();}catch(Exceptionee){}
if(con!=null)try{con.close();}catch(Exceptionee){}
}
returnb;
}
4、使用Servlet进行控制
参考代码如下:
packageservlet;
importjava.io.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjavabean.*;
importjava.util.*;
publicclassAddUserextendsHttpServlet
{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsIOException,ServletException
{
request.setCharacterEncoding("gb2312");
//第一步:获取用户的输入信息
Stringusername=request.getParameter("username");
Stringuserpass=request.getParameter("userpass");
//第二步:调用JavaBean
Useruser=newUser();
user.setUsername(username);
user.setUserpass(userpass);
booleanb=user.addUser();
//第三步:传值
Stringinfo;
if(b)
info="添加成功!";
else
info="添加失败!";
request.setAttribute("addinfo",info);
//第四步:选择一个界面对用户进行响应
Stringforward="getAllUser";
RequestDispatcherrd=request.getRequestDispatcher(forward);
rd.forward(request,response);
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsIOException,ServletException
{
doGet(request,response);
}
}
此处添加完成之后跳转到userlist.jsp文件处理,但是在显示之前需要获取数据,所以需要先执行Servlet,所以专向了getAllUser控制器。
5、修改配置文件
<servlet> <servlet-name>addUser</servlet-name> <servlet-class>servlet.AddUser</servlet-class> </servlet> <servlet-mapping> <servlet-name>addUser</servlet-name> <url-pattern>/addUser</url-pattern> </servlet-mapping>
6、在列表界面显示提示信息
修改userlist.jsp代码如下,红色部分为增加的内容:
<%@pagecontentType="text/html;charset=gb2312"%>
<%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%>
<fontcolor="red">
${addinfo}
</font>
<br>
<c:forEachvar="user"items="${users}">
用户名:${user.username}口令:${user.userpass}<br>
</c:forEach>
7、运行测试
输入正确的用户名和口令测试;
输出已经存在的用户名进行测试。
8、添加分页显示
经过不断的添加,数据库表中已经有大量的记录。当记录比较多的时候就应该进行分页显示。分页显示可以采用多种方式:
①在SQL中进行控制,只查询需要的记录;
②在遍历结果集的时候,只封装相关的记录;
③在显示的时候进行控制。
第一种方式对开发人员的SQL水平要求比较高,第三种方式传递的数据量比较大,所以我们介绍第二种。
要完成分页显示,需要做3个方面的修改:
①界面上增加分页显示的超链接;
②修改User.java,在遍历结果集的时候进行控制,另外需要增加获取页码数的方法;
③在控制器中传递需要的页码和总页码。
9、在界面上增加分页显示功能
<%@pagecontentType="text/html;charset=gb2312"%>
<%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%>
<fontcolor="red">
${addinfo}
</font>
<br>
<ahref="getAllUser?pageNo=1">第一页</a>
<ahref="getAllUser?pageNo=${pageNo-1}">上一页</a>
<ahref="getAllUser?pageNo=${pageNo+1}">下一页</a>
<ahref="getAllUser?pageNo=${pageCount}">最后一页</a>
<br>
<c:forEachvar="user"items="${users}">
用户名:${user.username}口令:${user.userpass}<br>
</c:forEach>
其中,pageNo表示当前页码,pageCount表示总页数。
10、在User.java中增加获取总页码的方法
publicintgetPageCount()
{
Connectioncon=null;
Statementstmt=null;
ResultSetrs=null;
try{
//指出连接数据库所需要的驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");
//建立与数据库之间的连接
con=DriverManager.getConnection("jdbc:oracle:thin:@myserver:1521:mydb","scott","tiger");
//编写查询数据库信息的SQL语句
Stringsql="selectcount(*)fromusertable";
//创建语句对象,用于执行SQL语句
stmt=con.createStatement();
//执行SQL语句得到结果集
rs=stmt.executeQuery(sql);
rs.next();
//得到总的记录数
intnumber=rs.getInt(1);
return(number-1)/10+1;
}catch(Exceptione){
return0;
}
finally{
//关闭相关对象
if(rs!=null)try{rs.close();}catch(Exceptionee){}
if(stmt!=null)try{stmt.close();}catch(Exceptionee){}
if(con!=null)try{con.close();}catch(Exceptionee){}
}
}
11、增加按照页码获取信息的方法
publicArrayListgetUserByPage(intpageNo)
{
intnumber=10;
//每一页显示的记录数
intbegin=(pageNo*number)-9;
intend=pageNo*number;
intindex=1;
Connectioncon=null;
Statementstmt=null;
ResultSetrs=null;
ArrayListusers=newArrayList();
try{
//指出连接数据库所需要的驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");
//建立与数据库之间的连接
con=DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.170:1521:fhdn","scott","tiger");
//编写查询数据库信息的SQL语句
Stringsql="select*fromusertable";
//创建语句对象,用于执行SQL语句
stmt=con.createStatement();
//执行SQL语句得到结果集
rs=stmt.executeQuery(sql);
//遍历结果集
while(rs.next())
{
//在begin之前的记录是不显示的
if(index<begin){
index++;
continue;
}
//在end之后的记录也不显示
if(index>end)
break;
index++;
Stringusername=rs.getString(1);
Stringuserpass=rs.getString(2);
//java.util.Datebirthday=rs.getDate(3);
//intage=rs.getInt(4);
Useruser=newUser();
user.setUsername(username);
user.setUserpass(userpass);
users.add(user);
}
}catch(Exceptione){
System.out.println(e.getMessage());
}
finally{
//关闭相关对象
if(rs!=null)try{rs.close();}catch(Exceptionee){}
if(stmt!=null)try{stmt.close();}catch(Exceptionee){}
if(con!=null)try{con.close();}catch(Exceptionee){}
}
returnusers;
}
12、修改控制器
packageservlet;
importjava.io.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjavabean.*;
importjava.util.*;
publicclassGetAllUserextendsHttpServlet
{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsIOException,ServletException
{
//第一步:获取用户的输入信息
StringpageNo=request.getParameter("pageNo");
intiPageNo=1;
if(pageNo!=null)
{
iPageNo=Integer.parseInt(pageNo);
}
//第二步:调用JavaBean
Useruser=newUser();
ArrayListusers=null;
users=user.getUserByPage(iPageNo);
intpageCount=user.getPageCount();
//第三步:传值
request.setAttribute("users",users);
request.setAttribute("pageNo",newInteger(iPageNo));
request.setAttribute("pageCounter",newInteger(pageCount));
//第四步:选择一个界面对用户进行响应
Stringforward="userlist.jsp";
RequestDispatcherrd=request.getRequestDispatcher(forward);
rd.forward(request,response);
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsIOException,ServletException
{
doGet(request,response);
}
}
13、之后再进行测试运行
14、增加对第一页和最后一页的控制
如果已经在第一页,就不能再点击第一页或者首页。如果已经在最后一页,就不能再点击最后一页或者下一页。修改userlist.jsp中代码如下(部分代码):
<c:iftest="${pageNo!=1}">
<ahref="getAllUser?pageNo=1">第一页</a>
<ahref="getAllUser?pageNo=${pageNo-1}">上一页</a>
</c:if>
<c:iftest="${pageNo!=pageCounter}">
<ahref="getAllUser?pageNo=${pageNo+1}">下一页</a>
<ahref="getAllUser?pageNo=${pageCounter}">最后一页</a>
</c:if>
这里设置为不显示,也可以设置为不添加超链接。
15、增加对异常的处理
如果用户按照这样的方式访问:http://127.0.0.1:8080/ch8/getAllUser?pageNo=aaa,将产生异常。因为页码不是数字,所以需要进行异常处理。修改:
iPageNo=Integer.parseInt(pageNo);
为:
try{iPageNo=Integer.parseInt(pageNo);}catch(Exceptione){}
希望本文所述对大家的JSP程序设计有所帮助。