JSP系统开发学习之二用户登录系统改进的model1模式(jsp+java class版)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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>


猜你喜欢

转载自blog.csdn.net/JCY1009015337/article/details/53646716