您的位置:首页 > 运维架构 > 网站架构

用户管理系统之网站框架的改进

2017-03-27 16:33 435 查看
之前的用户管理系统在设计上有很多不合理的地方,这种方法是将界面和业务逻辑放在一起(model1模式),存在以下问题:

在loginCl.java文件和wel.java文件中都操作了数据库,它们的逻辑相似,有重复的代码
整个框架没有清晰的逻辑结构,显得比较乱
代码不够优雅,可读性差,可维护性差
通过对问题的分析,我们可以对程序进行改进:

进行分层,分为界面层和逻辑层(MV模式,M:model模型,V:view视图)
将常用的代码(比如说连接数据库),封装到类
改进后的框架图如下所示:



下面是修改后的代码:
ConnDB.java:
/**
* @(#)ConnDB.java
*
*连接到数据库
* @author
* @version 2.00 2017/3/26
*/
package com.chongqing;

import java.sql.*;

public class ConnDB {

private Connection ct = null;

public Connection getConn(){

try {
//连接到数据库
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
ct = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;DatabaseName=TestServlet","sa","293313");
}
catch (Exception ex) {
ex.printStackTrace();
}

//不用关闭资源

return ct;
}

}


UserBean.java:
/**
* @(#)UserBean.java
*
*映射到数据库中的users表,它的一个对象与users表的一条记录相对应,操作UserBean就相当于操作数据库
* @author
* @version 2.00 2017/3/26
*/
package com.chongqing;

public class UserBean {

private int userId;
private String userName;
private String passwd;
private String mail;
private int grade;

//userId的方法
public void setUserId(int userId){

this.userId = userId;
}

public int getUserId(){

return this.userId;
}

//userName的方法
public void setUserName(String userName){

this.userName = userName;
}

public String getUserName(){

return this.userName;
}

//passwd的方法
public void setPasswd(String passwd){

this.passwd = passwd;
}

public String getPasswd(){

return this.passwd;
}

//mail的方法
public void setMail(String mail){

this.mail = mail;
}

public String getMail(){

return this.mail;
}

//grade的方法
public void setGrade(int grade){

this.grade = grade;
}

public int getGrade(){

return this.grade;
}

4000
}


UserBeanCl.java:

/**
* @(#)UserBeanCl.java
*业务逻辑和处理类,用来处理users表,即操作UserBean
*
* @author
* @version 2.00 2017/3/26
*/
package com.chongqing;

import java.sql.*;
import java.util.*;

public class UserBeanCl {

private Connection ct = null;
private PreparedStatement ps = null;
private ResultSet rs = null;
private int pageCount = 0; //一共有多少页(通过计算获得)

//验证用户
public boolean checkUser(String u,String p){
boolean flag = false;

try {
//得到连接
ConnDB cd = new ConnDB();
ct = cd.getConn();

ps = ct.prepareStatement("select * from users where username = ? and passwd = ?");
ps.setString(1,u);
ps.setString(2,p);
rs = ps.executeQuery();

if(rs.next()){
flag = true;
}

}
catch (Exception ex) {
ex.printStackTrace();
}
finally {
this.close();
}

return flag;

}

//分页显示结果
//不能返回ResultSet,因为关闭数据库资源的时候ResultSet也将消失,这里是返回ArrayList
public ArrayList getResultByPage(int pageNow,int pageSize){

ArrayList al = new ArrayList();

try {
int rowCount = 0;  //一共有多少行记录(通过查表获得)

//连接数据库
ConnDB cd = new ConnDB();
ct = cd.getConn();
ps = ct.prepareStatement("select count(*) from users");
rs = ps.executeQuery();

if(rs.next()){
rowCount = rs.getInt(1);//获得rowCount的值
}

//计算pageCount的值
if(rowCount%pageSize == 0){
pageCount = rowCount/pageSize;
}else{
pageCount = rowCount/pageSize + 1;
}

ps = ct.prepareStatement("select top "+pageSize+" *  from users where userID not in (select top "+pageSize*(pageNow-1)+" userID from users)");
rs = ps.executeQuery();

while(rs.next()){

//将rs中的每条记录封装到UserBean ub中
UserBean ub = new UserBean();

ub.setUserId(rs.getInt(1));
ub.setUserName(rs.getString(2));
ub.setPasswd(rs.getString(3));
ub.setMail(rs.getString(4));
ub.setGrade(rs.getInt(5));

al.add(ub);  //将ub添加到ArrayList中

}
}
catch (Exception ex) {
ex.printStackTrace();
}
finally {
this.close();
}

return al;
}

//返回pageCount
public int getPageCount(){

return this.pageCount;
}

//关闭资源
public void close(){
try {
if(null != rs){
rs.close();
rs = null;
}
if(null != ps){
ps.close();
ps = null;
}
if(null != ct){
ct.close();
ct = null;
}
} catch (SQLException e) {
e.printStackTrace();
}

}

}


登录界面:
/**
* @(#)Login.java
*
*登录界面
* @author
* @version 2.00 2017/3/26
*/
package com.chongqing;

import javax.servlet.http.*;
import java.io.*;

public class Login extends HttpServlet {

//处理get请求
public void doGet(HttpServletRequest req,HttpServletResponse res){

//业务逻辑
try {

//中文乱码
res.setContentType("text/html;charset=gbk");
PrintWriter pw = res.getWriter();

//登录界面
pw.println("<html>");
pw.println("<body>");

//接收wel.java的错误信息
String info = req.getParameter("info");
if(null != info)
{
pw.println("<h1>用户名或者密码错误!</h1><br/>");
}

pw.println("<h1>登录界面</h1>");
pw.println("<form action= logincl method=post>");
pw.println("用户名:<input type=text name=username><br>");
pw.println("密码:<input type=password name=passwd><br>");
pw.println("<input type=checkbox name=keep value=2>两周内不重复登录<br> ");
pw.println("<input type=submit value=login><br>");
pw.println("</form>");
pw.println("</body>");
pw.println("</html>");
}
catch (Exception ex) {
ex.printStackTrace();
}
}

public void doPost(HttpServletRequest req,HttpServletResponse res){

this.doGet(req,res);
}
}


登录验证界面:
/**
* @(#)LoginCl.java
*
*验证页面
* @author
* @version 2.00 2017/3/26
*/
package com.chongqing;

import javax.servlet.http.*;

public class LoginCl extends HttpServlet {

//处理get请求
public void doGet(HttpServletRequest req,HttpServletResponse res){

//接收用户名和密码
String u = req.getParameter("username");
String p = req.getParameter("passwd");

try {
//验证用户
UserBeanCl ubc = new UserBeanCl();

if(ubc.checkUser(u,p)){

//合法
//接收Login.java的checkbox的值
String keep = req.getParameter("keep");

if(null != keep){

//将用户名和密码通过Cookie保存到客户端
//创建Cookie
Cookie name = new Cookie("myname",u);
Cookie passwd = new Cookie("passwd",p);

//设置时间,保存两周
name.setMaxAge(2*7*24*3600);
passwd.setMaxAge(2*7*24*3600);

//回写到客户端
res.addCookie(name);
res.addCookie(passwd);
}

//合法,添加Session并跳转到欢迎界面
HttpSession mySession = req.getSession(true);
mySession.setMaxInactiveInterval(30);                   //指定Session存活的时间,单位是秒
mySession.setAttribute("usname",u);                       //在Session中添加一个属性

res.sendRedirect("wel");//转到wel界面
}else{

//不合法
res.sendRedirect("login");//返回login界面
}

}
catch (Exception ex) {
ex.printStackTrace();
}
}

public void doPost(HttpServletRequest req,HttpServletResponse res){

this.doGet(req,res);
}
}


欢迎界面:
/**
* @(#)wel.java
*
*欢迎界面
* @author
* @version 2.00 2017/3/26
*/
package com.chongqing;

import javax.servlet.http.*;
import java.io.*;
import java.sql.*;
import java.util.*;

public class wel extends HttpServlet {

public void doGet(HttpServletRequest req,HttpServletResponse res){

Connection ct = null;
PreparedStatement ps = null;
ResultSet rs = null;

//首先判断Session中是否有登录时添加的属性
HttpSession mySession = req.getSession(true);

String val = (String)mySession.getAttribute("usname");

try{
if(null == val){

//如果session中没有用户信息,再看看Cookie中有没有
String name = null;
String passwd = null;

//从客户端获得所有Cookie
Cookie[] allCookies = req.getCookies();
if(null != allCookies){
for(int i=0; i < allCookies.length; ++i){

//依次取出Cookie
Cookie myCookie = allCookies[i];

if(myCookie.getName().equals("myname")){

//得到Cookie的值
name = myCookie.getValue();
}else if(myCookie.getName().equals("passwd")){

passwd = myCookie.getValue();
}
}
}

//如果用户名和密码都不为空
if(!name.equals("")&&!passwd.equals("")){

//到loginCl中进行验证是否用户名和密码合法
res.sendRedirect("logincl?username="+name+"&passwd="+passwd);

return;
}
//返回登录界面
res.sendRedirect("login?info=error");
return;
}

//欢迎界面
//中文乱码
res.setContentType("text/html;charset=gbk");
PrintWriter pw = res.getWriter();

//把所有内容放在中间
pw.println("<body><center>");
pw.println("Welcom!");

//分页的功能
int pageSize = 3;   //每页显示3条记录
int pageNow = 1;   //首先显示第一页的内容

//动态的接收pageNow
String sPageNow = req.getParameter("pageNow");

if(null != sPageNow){

pageNow = Integer.parseInt(sPageNow);
}

UserBeanCl ubc = new UserBeanCl();
ArrayList al = ubc.getResultByPage(pageNow,pageSize);

//用表格显示用户的信息
pw.println("<table border = 1>");
pw.println("<tr><td>userID</td><td>username</td><td>passwd</td><td>email</td><td>grade</td></tr>");
for(int i=0; i<al.size();++i){

//读取每个UserBean中的值
UserBean ub = (UserBean)al.get(i);

pw.println("<tr>");
pw.println("<td>"+ub.getUserId()+"</td>");
pw.println("<td>"+ub.getUserName()+"</td>");
pw.println("<td>"+ub.getPasswd()+"</td>");
pw.println("<td>"+ub.getMail()+"</td>");
pw.println("<td>"+ub.getGrade()+"</td>");
pw.println("</tr>");
}
pw.println("</table>");

//显示超链接
if(1 != pageNow){
pw.println("<a href=wel?pageNow="+1+">首页</a>");
}

int pageCount = ubc.getPageCount();
for(int i=1; i<=pageCount; ++i ){

pw.println("<a href=wel?pageNow="+i+">"+i+"</a>");
}

if(pageCount != pageNow){
pw.println("<a href=wel?pageNow="+pageCount+">尾页</a>");
}

pw.println("</body></center>");
}
catch (Exception ex) {
ex.printStackTrace();
}
}

public void doPost(HttpServletRequest req,HttpServletResponse res){

this.doGet(req,res);
}
}


程序的功能值之前修改前的功能一样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐