版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/JCY1009015337/article/details/53646716
model1(纯jsp开发,就是上一节中所描述的开发方式)存在问题:
1、loginCl.jsp文件和wel.jsp文件中都去操作了数据库,它们的逻辑相似,有重复代码
2、整个框架没有清晰的层次关系,显得非常乱
3、代码一点也不优雅,可读性差,可维护性差
因此,我们把纯jsp的model1模式改为jsp+java class的model1模式(界面用jsp、业务逻辑层用java class)
该模式下,可以将常用代码(比如连接数据库),封装到类中。
为什么在UserBeanCl中我们返回ArrayList集合,而不是直接返回ResultSet
1、如何返回ResultSet,那么我们在使用ResultSet时,是不能关闭与该ResultSet相互关联的数据库连接等资源,从而造成浪费。
2、如果返回ResultSet,我们只能使用rs.getInt(?),这样的方法得到结果,代码的可读性不好,维护不方便。
下面是整个系统的相关代码:
ConnDB.java:获取数据库的连接
//得到数据库的
package com.jingchenyong.model;
import java.sql.*;
public class ConnDB {
private Connection ct=null;
public Connection getConn(){
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
ct=DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;databaseName=spdb","sa","123456");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ct;
}
}
UserBean.java:负责和数据库字段的映射
//这是一个javabean,对应users表,代表数据
package com.jingchenyong.model;
public class UserBean {
private int userId;
private String username;
private String passwd;
private String email;
private int grade;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
}
UserBeanCl.java:负责一些业务处理逻辑
//这是一个处理类,有些人把它叫做bo,主要是封装对users表的各种操作
package com.jingchenyong.model;
import java.sql.*;
import java.util.ArrayList;
//他的一个实例,就对应users表的一条记录
public class UserBeanCl {
private Statement sm = null;
private ResultSet rs = null;
private Connection ct = null;
private int pageSize = 3;
private int rowCount = 0;// 该值从数据库查询 这
private int pageCount = 0;// 该值是通过计算得来
// 再写一个函数,返回分页的总页数
public int getPageCount() {
// 处理...
try {
// 得到链接
ct = new ConnDB().getConn();
// 计算结果
sm=ct.createStatement();
rs = sm.executeQuery("select count(*) from users");
if (rs.next())// r.next()指向指标所指的记录
{
rowCount = rs.getInt(1);
}
// 计算pageCount
if (rowCount % pageSize == 0) {
pageCount = rowCount / pageSize;
} else {
pageCount = rowCount / pageSize + 1;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
this.close();
}
return pageCount;
}
// 得到用户需要显示的用户信息(分页)
public ArrayList getUserByPage(int pageNow) {
ArrayList al = new ArrayList();
try {
ct= new ConnDB().getConn();
// 创建Statement
sm = ct.createStatement();
// 查询出需要显示的记录
rs = sm.executeQuery("select top " + pageSize
+ " * from users where userId not in (select top "
+ pageSize * (pageNow - 1) + " userId from users)");
//开始将rs封装到ArrayList中去
while(rs.next()){
UserBean ub=new UserBean();
ub.setUserId(rs.getInt(1));
ub.setUsername(rs.getString(2));
ub.setPasswd(rs.getString(3));
ub.setEmail(rs.getString(4));
ub.setGrade(rs.getInt(5));
//将ub放入到al中去
al.add(ub);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
this.close();
}
return al;
}
// 验证用户名和密码
public boolean checkUser(String u, String p) {
boolean b = false;
try {
ct = new ConnDB().getConn();
sm = ct.createStatement();
rs = sm.executeQuery("select passwd from users where username='"
+ u + "'");
if (rs.next()) {
// 说明用户名存在
if (rs.getString(1).equals(p)) {
// 一定合法
b = true;
}
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
close();
}
return b;
}
public void close() {
// 关闭打开的各种资源,这个很重要!!!
try {
if (rs != null) {
rs.close();
rs = null;
}
if (sm != null) {
sm.close();
sm = null;
}
if (ct != null) {
ct.close();
ct = null;
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
login.jsp:登陆界面
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'login.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body bgcolor="pink">
<center>
用户登录<br>
<hr>
<form action="loginCl.jsp" method="post">
用户名:<input type="text" name="username"/><br>
密 码:<input type="password" name="passwd"/><br>
<input type="submit" value="登录"/>
<input type="reset" value="重置"/>
</form>
</center>
</body>
</html>
loginCl.jsp:负责登陆验证的操作,负责调用UserBeanCl相关的处理逻辑(这里需要import相关的类包)
<%@ page language="java" import="java.util.*,java.sql.*,com.jingchenyong.model.*" pageEncoding="gb2312"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'loginCl.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
//接收用户名和密码,完成对用户的验证
String u=request.getParameter("username");
String p=request.getParameter("passwd");
//调用UserBeanCl处理的方法,完成对用户的验证
UserBeanCl ubc=new UserBeanCl();
if(ubc.checkUser(u,p)){
response.sendRedirect("wel.jsp");
}else{
response.sendRedirect("login.jsp");
}
%>
</body>
</html>
wel.jsp:界面显示,负责调用UserBeanCl相关的处理逻辑(这里需要import相关的类包)
<%@ page language="java" import="java.util.*,java.sql.*,com.jingchenyong.model.*" pageEncoding="gb2312"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'wel.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<br>登录成功!恭喜你!<%=request.getParameter("user") %>
<a href="login.jsp">返回重新登录</a>
<hr>
<h1>用户信息列表</h1>
<%
//定义四个分页会用到的变量
int pageNow=1;//默认显示第一页
//接收用户希望显示的页数(pageNow)
String s_pageNow=request.getParameter("pageNow");
//当用户是从初始登录进去的话就可能为空
if(s_pageNow!=null){
//确实接收到pageNow
pageNow=Integer.parseInt(s_pageNow);
}
//调用UserBeanCl的方法(创建一个UserBeanCl的方法,然后完成处理),完成分页显示
UserBeanCl ubc=new UserBeanCl();
ArrayList al=ubc.getUserByPage(pageNow);
%>
<table border="1">
<tr><td>用户id</td><td>用户名字</td><td>密码</td><td>电邮</td><td>级别</td></tr>
<%
for(int i=0;i<al.size();i++)
{
//从al中取出UserBean
UserBean ub=(UserBean)al.get(i);//这里要强转一下,因为al.get(i)返回的是一个object类型
%>
<tr>
<td><%=ub.getUserId() %></td>
<td><%=ub.getUsername()%></td>
<td><%=ub.getPasswd() %></td>
<td><%=ub.getEmail() %></td>
<td><%=ub.getGrade() %></td>
</tr>
<%
}
%>
</table>
<%
//上一页
if(pageNow!=1){
out.println("<a href=wel.jsp?pageNow="+(pageNow-1)+">上一页</a>");
}
//显示超链接
for(int i=pageNow;i<=pageNow+4;i++){
out.println("<a href=wel.jsp?pageNow="+i+">["+i+"]</a>");
}
//得到pageCount
int pageCount=ubc.getPageCount();
//下一页
if(pageNow!=pageCount)
out.println("<a href=wel.jsp?pageNow="+(pageNow+1)+">下一页</a>");
%>
</body>
</html>