MVC模型之用户登录系统


1、什么是MVC模型



2、用户登录系统的MVC模型





3、用户登录系统详解

3.1 登录界面 login.jsp

它主要完成用户登录界面,只是完成MVC中的V(view),也就是他只完成登录界面。
当提交登录按钮以后,把用户验证交给一个servlet去完成,因servlet的效率较高。
跳转的servlet通过loginClServlet完成。

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML>
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>用户登录</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="login">
	<meta http-equiv="description" content="login page">

  </head>
  
  <body bgcolor=pink>
	<center>
		<h1>用户登录</h1>
		<form action="LoginClServlet" 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>

3.2 用户欢迎界面welcome.jsp

它也是MVC中的V(view)层。
他的数据来源分为两个servlet,分别是loginClServlet获取首次登录数据,UsersClServlet获取翻页后数据。

<%@ page language="java" import="java.util.*,java.sql.*,com.controller.*,com.ms.*" pageEncoding="gbk"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML>
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>欢迎界面</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="welcome">
	<meta http-equiv="description" content="welcome page">

  </head>
  
  <body bgcolor=pink>
    <h1>恭喜您,登录成功</h1>
	<a href="login.jsp">返回重新登录</a>
	<hr>
	<h1>用户信息列表</h1>
	<%
		//获取数据
        Vector<UsersBean> v = (Vector<UsersBean>)request.getAttribute("result");     
        int pageCount = Integer.parseInt((String)request.getAttribute("pageCount"));
        int pageNow = Integer.parseInt((String)request.getAttribute("pageNow"));
%>
<table border=1>
	<tr><th>用户id</th><th>姓名</th><th>密码</th><th>Email</th><th>级别</th></tr>	
<%
		
		for(int i = 0; i < v.size(); i++) {
		UsersBean ub = (UsersBean)v.get(i);
%>
<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=UsersClServlet?pageNow="+(pageNow-1)+">上一页</a>");
	 //显示超链接
     for(int i = 1; i <= pageCount; i++){
		out.println("<a href=UsersClServlet?pageNow="+i+">["+i+"]</a>");
     }
     //下一页
     if(pageNow != pageCount)
	 	out.println("<a href=UsersClServlet?pageNow="+(pageNow+1)+">下一页</a>");
	
	%>	
  </body>
</html>

3.3 用户登录处理loginClServlet

用于验证用户是否合法,属于MVC中的C(controller)。
通过查询数据库验证,因此它需要调用MVC中的M(model),UsersBeanCl

/**
 * 控制器,完成对用户身份的验证
 * 本身不完成业务逻辑(调用适当的model模型完成验证)
 */
package com.controller;

import com.ms.*;

import java.io.IOException;
import java.util.Vector;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginClServlet extends HttpServlet {

	/**
	 * The doGet method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		//得到用户名和密码
		String u = request.getParameter("username");
		String p = request.getParameter("passwd");
		//使用模型(UsersBeanCl)完成对用户的验证
		//1 创建一个对象
		UsersBeanCl ubc = new UsersBeanCl();
		//2 调用方法
		if(ubc.checkUser(u, p)){			
			Vector<UsersBean> v = ubc.getUsersByPage(1);
			int pageCount = ubc.getPageCount();
			request.setAttribute("result", v);
			request.setAttribute("pageCount", pageCount+"");
			request.setAttribute("pageNow", "1");
			//合法
			//转向的方法,效率不是很高
			//response.sendRedirect("welcome.jsp");
			//常常使用转发的方法,效率高并且request中对象还可以在下一页面使用
			request.getRequestDispatcher("welcome.jsp").forward(request, response);
		}else{
			request.getRequestDispatcher("login.jsp").forward(request, response);
		}
	}

	/**
	 * The doPost method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to post.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}


3.4 用户跳转处理UsersClServlet

它主要用于获取数据库中的分页数据,属于MVC中的C(controller)。
因为要获取数据库中的数据,因此也要调用UsersBeanCl。

package com.controller;

import com.ms.*;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Vector;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UsersClServlet extends HttpServlet {

	/**
	 * The doGet method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		try {
			int pageNow = Integer.parseInt(request.getParameter("pageNow"));
			UsersBeanCl ubc = new UsersBeanCl();
			//在跳转到welcome.jsp之前把显示数据准备好
			Vector<UsersBean> v = ubc.getUsersByPage(pageNow);
			int pageCount = ubc.getPageCount();
			request.setAttribute("result", v);
			request.setAttribute("pageCount", pageCount+"");
			request.setAttribute("pageNow", pageNow+"");
			request.getRequestDispatcher("welcome.jsp").forward(request, response);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * The doPost method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to post.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		this.doGet(request, response);
	}

}

3.5 用户处理类UsersBeanCl

他主要完成数据库的数据查询,完成于数据库有关的操作。
属于MVC中的M(model)。
/**
 * 主要分装对users表的操作
 */

package com.ms;

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

public class UsersBeanCl {
	private Connection ct = null;
	private PreparedStatement ps = null;
	private ResultSet rs = null;
	//分页显示的功能
    private int pageSize = 3;	//一页显示几条记录
    private int pageNow = 1;	//希望显示第几页
    private int rowCount = 0;	//共有几条记录
    private int pageCount = 0;	//一共有几页
    
    
	//验证用户是否合法
	public boolean checkUser(String u,String p) {
		boolean b = false;	
		try {
			ct = new ConnDB().getConn();
	    	//4查询
			ps = ct.prepareStatement("select passwd from users where userName='"+u+"'");
	    	rs = ps.executeQuery();
	    	//根据情况判断
	    	if(rs.next()) {
	    		//用户名存在
	    		if(rs.getString(1).equals(p)) {
	    			b = true;
	    		}
	    	}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//关闭资源
			this.close();
		}
		return b;
	}
	
	//返回数据库内数据
	public Vector<UsersBean> getUsersByPage(int pageNow) {
		Vector<UsersBean> v = new Vector<UsersBean>();
		try {
			ct = new ConnDB().getConn();
			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()){
	        	UsersBean ub = new UsersBean();
	        	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));
	        	//将UsersBean放入Vector
	        	v.add(ub);
	        }
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			this.close();
		}
		
		return v;
	}
	
	//返回数据库数据数量
	public int getPageCount() {
		//.....
		try {
			ct = new ConnDB().getConn();
	    	//4查询
			ps = ct.prepareStatement("select count(*) from users");
	    	rs = ps.executeQuery();
	    	//根据情况判断
	    	if(rs.next()) {
	    		//用户名存在
	    		rowCount = rs.getInt(1);
	    	}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			this.close();
		}
		//计算pageCount
        if(rowCount%pageSize == 0) {
             pageCount = rowCount/pageSize;
        }else {
             pageCount = rowCount/pageSize + 1;
        }
		return pageCount;
	}
	
	//关闭资源函数
	public void close() {
		//关闭资源
		try {
			if(rs!=null) {
				rs.close();
				rs = null;
			}
			if(ps!=null) {
				ps.close();
				ps = null;
			}
			if(ct!=null) {
				ct.close();
				ct = null;
			}
		} catch (Exception e2) {
			e2.printStackTrace();
		}
	}
}

3.6 用户类 UsersBean

他主要完成对用户数据的封装,实现一个用户类。

package com.ms;

public class UsersBean {
	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;
	}
}

3.7 数据库连接ConnDB

他主要用于完成数据库的连接。

package com.ms;
import java.sql.*;
public class ConnDB {

	private Connection ct = null;

	public Connection getConn() {
		try {
			//1加载驱动
	    	Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
	    	//2得到连接
	    	ct = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;databaseName=spdb1","sa","****");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return ct;
	}
}

4、演示









评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值