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;
}
}