(一)用户登录系统框架改进
纯jsp、jsp+class
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>
This is my JSP page. <br>
<form action=loginCl.jsp>
用户名<input type="text" name="username"><br>
密 码<input type="password" name="passwd"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
loginCl.jsp
<%@ page language="java" import="java.util.*,java.sql.*,com.tingwei.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
<%@ page language="java" import="java.util.*,java.sql.*,com.tingwei.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>
登录成功!<%=request.getParameter("user") %><br>
<a href="login.jsp">返回重新登录</a>
<hr>
<h1>用户信息列表</h1>
<%
//定义分页需要用到的变量
int pageNow=1;
//接收用户希望显示第几页
String s_pageNow=request.getParameter("pageNow");
if(s_pageNow!=null)
{
//接收到pageNow
pageNow=Integer.parseInt(s_pageNow);
}
//调用UserBeanCl方法,完成分页显示
UserBeanCl ubc=new UserBeanCl();
ArrayList al=ubc.getUsersByPage(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);
%>
<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-6)+">上一页</a>");
//得到pageCount
int pageCount=ubc.getPageCount();
//显示超链接
for(int i=pageNow;i<=pageNow+5;i++){
out.println("<a href=wel.jsp?pageNow="+i+">["+i+"]</a>");
}
//下一页
if(pageNow!=pageCount)
out.println("<a href=wel.jsp?pageNow="+(pageNow+6)+">下一页</a>");
%>
</body>
</html>
UserBean.java
//javabean,映射users表,一个对象对应一个user记录
package com.tingwei.model;
public class UserBean {
private int userId;
private String username;
private String passwd;
private String email;
private int grade;
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;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
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;
}
}
UserBeanCl.java
//这是一个处理类,也称BO(business object),主要是封装对users表的各种操作
//无非是增删改查
package com.tingwei.model;
import java.sql.*;
import java.util.*;
public class UserBeanCl {
private Statement sm=null;
private Connection ct=null;
private ResultSet rs=null;
private int pageSize=3;
private int rowCount=0;
private int pageCount=0;
//验证用户是否合法
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 e) {
// TODO: handle exception
e.printStackTrace();
}finally{
this.close();
}
return b;
}
//分页
public ArrayList getUsersByPage(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));
al.add(ub);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
this.close();
}
return al;
}
public void close(){
try {
if(rs!=null)rs.close();
if(sm!=null)sm.close();
if(ct!=null)ct.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
//返回分页总页数
public int getPageCount(){
try {
//得到连接
ct=new ConnDB().getConn();
sm=ct.createStatement();
//查询表中记录总数
rs=sm.executeQuery("select count(*) from users");
if(rs.next()){
rowCount=rs.getInt(1);
}
if(rowCount%pageSize==0){
pageCount=rowCount/pageSize;
}else{
pageCount=rowCount/pageSize+1;
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
this.close();
}
return pageCount;
}
}
ConnDB.java
//得到数据库连接
package com.tingwei.model;
import java.sql.*;
public class ConnDB {
private Connection ct=null;
public Connection getConn(){
try {
String url="jdbc:microsoft:sqlserver://127.0.0.1:1433;databaseName=spdb";
String user="sa";
String pass="tingwei";
String driver="com.microsoft.jdbc.sqlserver.SQLServerDriver";
//1.加载驱动
Class.forName(driver);
//2.得到连接
ct=DriverManager.getConnection(url,user,pass);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return ct;
}
}
(二)用户登录系统框架再改进
mvc模式
1.jsp技术主要是做界面的,但loginCl.jsp\wel.jsp调用了java class模型,并没有完全MV分离,代码的维护性还是不那么好
MVC强行让程序的输入输出和处理分开,
Model 主要由java class来做,也可以使用javabean ebj等
View由jsp来做
Controller用Servlet来做
通俗理解MVC
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><center>
<form action="LoginClServlet" method="post">
用户名<input type="text" name="username"><br>
密 码<input type="password" name="passwd"><br>
<input type="submit" value="登录">
</form>
</center>
</body>
</html>
loginCl.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><center>
<form action="LoginClServlet" method="post">
用户名<input type="text" name="username"><br>
密 码<input type="password" name="passwd"><br>
<input type="submit" value="登录">
</form>
</center>
</body>
</html>
wel.jsp
<%@ page language="java" import="java.util.*,java.sql.*,com.tingwei.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><center>
登录成功!<%=request.getParameter("user") %><br>
<a href="login.jsp">返回重新登录</a>
<hr>
<h1>用户信息列表</h1>
<%
//调用UserBeanCl方法,完成分页显示
//UserBeanCl ubc=new UserBeanCl();
//ArrayList al=ubc.getUsersByPage(pageNow);
//要显示的用户信息从request中取
ArrayList al=(ArrayList)request.getAttribute("result");
%>
<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);
%>
<tr><td><%=ub.getUserId()%></td><td><%=ub.getUsername()%></td>
<td><%=ub.getPasswd()%></td><td><%=ub.getEmail()%></td><td><%=ub.getGrade()%></td></tr>
<%
}
%>
</table>
<%
//从request中得到pageNow
int pageNow=Integer.parseInt((String)request.getAttribute("pageNow"));
//上一页
if(pageNow!=1)
out.println("<a href=UserClServlet?pageNow="+(pageNow-6)+">上一页</a>");
//得到pageCount
String s_pageCount=(String)request.getAttribute("pageCount");
int pageCount=Integer.parseInt(s_pageCount);
//显示超链接
for(int i=pageNow;i<=pageNow+5;i++){
out.println("<a href=UserClServlet?pageNow="+i+">["+i+"]</a>");
}
//下一页
if(pageNow!=pageCount)
out.println("<a href=UserClServlet?pageNow="+(pageNow+6)+">下一页</a>");
%>
</center>
</body>
</html>
ConnDB.java
//得到数据库连接
package com.tingwei.model;
import java.sql.*;
public class ConnDB {
private Connection ct=null;
public Connection getConn(){
try {
String url="jdbc:microsoft:sqlserver://127.0.0.1:1433;databaseName=spdb";
String user="sa";
String pass="tingwei";
String driver="com.microsoft.jdbc.sqlserver.SQLServerDriver";
//1.加载驱动
Class.forName(driver);
//2.得到连接
ct=DriverManager.getConnection(url,user,pass);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return ct;
}
}
UserBean.java
//javabean,映射users表,一个对象对应一个user记录
package com.tingwei.model;
public class UserBean {
private int userId;
private String username;
private String passwd;
private String email;
private int grade;
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;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
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;
}
}
UserBeanCl.java
//这是一个处理类,也称BO(business object),主要是封装对users表的各种操作
//无非是增删改查
package com.tingwei.model;
import java.sql.*;
import java.util.*;
public class UserBeanCl {
private Statement sm=null;
private Connection ct=null;
private ResultSet rs=null;
private int pageSize=6;
private int rowCount=0;
private int pageCount=0;
//验证用户是否合法
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 e) {
// TODO: handle exception
e.printStackTrace();
}finally{
this.close();
}
return b;
}
//分页
public ArrayList getUsersByPage(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));
al.add(ub);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
this.close();
}
return al;
}
public void close(){
try {
if(rs!=null)rs.close();
if(sm!=null)sm.close();
if(ct!=null)ct.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
//返回分页总页数
public int getPageCount(){
try {
//得到连接
ct=new ConnDB().getConn();
sm=ct.createStatement();
//查询表中记录总数
rs=sm.executeQuery("select count(*) from users");
if(rs.next()){
rowCount=rs.getInt(1);
}
if(rowCount%pageSize==0){
pageCount=rowCount/pageSize;
}else{
pageCount=rowCount/pageSize+1;
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
this.close();
}
return pageCount;
}
}
LoginClServlet .java
//控制器,用于完成对用户身份的验证
//控制器本身不完成业务逻辑,而是负责去调用模型
package com.tingwei.controller;
import com.tingwei.model.*;
import javax.servlet.http.*;
import javax.servlet.ServletException;
import java.io.IOException;
import java.util.ArrayList;
public class LoginClServlet extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException{
// 得到用户名和密码
String u=req.getParameter("username");
String p=req.getParameter("passwd");
// 使用模型完成对用户的验证
UserBeanCl ubc=new UserBeanCl();
try {
if(ubc.checkUser(u, p)){
//res.sendRedirect("wel.jsp");
//因为sendRedirect()不高,常常使用转发方式
//准备要显示的数据
ArrayList al=ubc.getUsersByPage(1);
int pageCount=ubc.getPageCount();
req.setAttribute("result", al);
req.setAttribute("pageCount", pageCount+"");
req.setAttribute("pageNow","1");
req.getRequestDispatcher("wel.jsp").forward(req, res);
//这种方法效率高,同时req中的对象还可以在下一页面使用
}else{
//res.sendRedirect("login.jsp");
req.getRequestDispatcher("login.jsp").forward(req, res);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException{
this.doGet(req, res);
}
}
UserClServlet.java
//此控制器用于处理用户的分页显示,增删改查的调用
package com.tingwei.controller;
import java.io.IOException;
import java.io.PrintWriter;
import com.tingwei.model.*;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class UserClServlet 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 {
//得到用户期望显示的pageNow
String s_pageNow=request.getParameter("pageNow");
try {
int pageNow=Integer.parseInt(s_pageNow);
//调用userbeanCl中的分页方法
UserBeanCl ubc=new UserBeanCl();
ArrayList al=ubc.getUsersByPage(pageNow);
int pageCount=ubc.getPageCount();
request.setAttribute("result", al);
request.setAttribute("pageCount", pageCount+"");
request.setAttribute("pageNow", pageNow+"");
//重新跳转回wel.jsp
request.getRequestDispatcher("wel.jsp").forward(request,response);
} catch (Exception e) {
// TODO: handle exception
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 {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out
.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" This is ");
out.print(this.getClass());
out.println(", using the POST method");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}