之前写的程序基本上完成了想要的功能
但是若回头去看,会有一种凌乱的感觉,网页的框架设计和业务逻辑杂糅在一起,降低了可读性和代码复用性,不符合JAVA的封装特性
这里对sevlet网页的整体框架进行重排, 运用MV模式,使业务逻辑和网页页面分开,实现低耦合,体现java封装特性
这里先对之前网页的功能进行抽取
使之单独封装在类的方法中以便调用。
//从数据库中得到连接
package com.jxust.reven;
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://localhost:1433;DatabaseName=数据库名","用户名","密码");
}
catch(Exception ex)
{
ex.printStackTrace();
}
return ct;
}
}
//这是一个UserBean <----->users表映射
//他的一个对象 <----->users表的一条记录对应
//数据
package com.jxust.reven;
public class UserBean
{
private int userId;
private String userName;
private String passwd;
private String email;
private int grade;
public void setUserId(int userId)
{
this.userId = userId;
}
public int getUserId()
{
return this.userId;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public void setEmail(String email) {
this.email = email;
}
public void setGrade(int grade) {
this.grade = grade;
}
public String getUserName() {
return (this.userName);
}
public String getPasswd() {
return (this.passwd);
}
public String getEmail() {
return (this.email);
}
public int getGrade() {
return (this.grade);
}
}
//这是一个处理类(处理users表)<---->操作UserBean
package com.jxust.reven;
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;//一共有几页
//返回pageCount的方法
public int getPageCount()
{
return this.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 ex)
{
ex.printStackTrace();
}
}
//分页显示
public ArrayList getResultByPage(int pageNow,int pageSize)
{
ArrayList al=new ArrayList();
try
{
int rowCount = 0;//一共有几条记录(查表)
//得到rowCount
ConnDB cd= new ConnDB();
ct = cd.getConn();
ps = ct.prepareStatement("select count(*) from users");
rs = ps.executeQuery();
if(rs.next())
{
rowCount = rs.getInt(1);
}
//计算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.setEmail(rs.getString(4));
ub.setGrade(rs.getInt(5));
//将ub,放入到ArrayList集合中
al.add(ub);
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
finally
{
this.close();
}
return al;
}
//验证用户
public boolean checkUser(String u,String p)
{
boolean b=false;
try
{
//得到链接
ConnDB cd = new ConnDB();
ct = cd.getConn();
ps = ct.prepareStatement("select top 1 passwd from users where username=?");
ps.setString(1,u);
rs = ps.executeQuery();
if(rs.next())
{
String dbPasswd=rs.getString(1);
if(dbPasswd.equals(p))
{
b = true;
}
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
finally
{
this.close();
}
return b;
}
}
实现上述方法后,只需在页面中调用方法即可
重新修改后的代码变得简洁明了
//登录界面的servlet
package com.jxust.reven;
import java.io.*;
import javax.servlet.http.*;
public class Login extends HttpServlet{
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
public void doGet(HttpServletRequest req,HttpServletResponse res){
//res:页面向控制台回应,页面发出信息。req:控制台向页面要求,控制台接收页面信息。
try
{
res.setContentType("text/html;charset=gbk");//中文防止乱码
PrintWriter pw = res.getWriter();
pw.println("<html>");//html文件体
pw.println("<body>");//body体
pw.println("<hr />");//分割线
pw.println("<h1>登陆界面</h1>");
pw.println("<form action = logincl method=post>");//该段组件体和logincl体进行关联
pw.println("用户名:<input type = text name = username><br />");//用户名组件体
pw.println("密码:<input type = password name = passwd><br />");//密码组件体
pw.println("<input type=checkbox name=keep valu=2>两周内不再重新登录<br />");//cookie
pw.println("<input type = submit value = '登录'><br />");
pw.println("<hr />");
pw.println("<form>");
//得到error信息
String info = (String)req.getParameter("info");
if(info.equals("error1") )
{
pw.println("您的名或密码输入错误");
}
if(info.equals("error2") )
{
pw.println("您的session超时请重新登录");
}
pw.println("</center></body>");//body体
pw.println("</html>");//html文件体
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
//登录控制文件的servlet
package com.jxust.reven;
import javax.servlet.http.*;
import java.io.*;
import java.sql.*;
public class LoginCl extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
this.doPost(req,res);
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
Connection ct = null;
ResultSet rs = null;
Statement sm = null;
try{
//服务器接收login页面发来的用户名和密码,要用到req。
String u = req.getParameter("username");//此处填写组件名
String p = req.getParameter("passwd");//此处填写组件名
System.out.println("name = "+u+",passwd="+p);
//调用UserBeanCl,1创建一个对象
UserBeanCl ubc = new UserBeanCl();
//使用UserBeanCl的方法
if(ubc.checkUser(u,p))
{
//密码和数据库中的一致,用户合法
String keep = req.getParameter("keep");
if(keep!=null)
{
//将用户名和密码保存在客户端
Cookie name = new Cookie("myname",u);
Cookie pass = new Cookie("mypasswd",p);
//设置时间
name.setMaxAge(14*24*3600);
pass.setMaxAge(14*24*3600);
//回写到客户端
res.addCookie(name);
res.addCookie(pass);
}
HttpSession hs = req.getSession(true);
//得到和req相关联的session,如果没有就创建session
hs.setMaxInactiveInterval(20);
//hs.setAttribute("pass","ok");
hs.setAttribute("pass",u);
//连接登录后的欢迎界面
//sendRedirect的作用是跳转界面
res.sendRedirect("wel?username="+u+"&passwd="+p);//该处填写域名
}
else
{
//说明连用户名不合法
res.sendRedirect("login?info=error1");
}
}
catch(Exception ex){
ex.printStackTrace();
}
finally
{
try
{
if(rs!=null)
{
rs.close();
}
if(sm!=null)
{
sm.close();
}
if(ct!=null)
{
ct.close();
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}
}
//登入后界面
package com.jxust.reven;
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){
this.doPost(req,res);
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
//打开操作数据库必要的变量
Connection ct = null;
ResultSet rs = null;
PreparedStatement ps = null;
Statement sm = null;
try{
//得到session
res.setContentType("text/html;charset=gbk");//中文防止乱码
PrintWriter pw = res.getWriter();
HttpSession hs = req.getSession(true);
String valu = (String)hs.getAttribute("pass");//得到键值取对值(用户名)
String u = req.getParameter("username");
String p = req.getParameter("passwd");
String name="";
String passwd="";
if(valu == null)//防止非法登登录
{
//如果session中没有用户信息,看看有没有用户的cookie信息
//从客户端得到所有cookie信息
Cookie [] allCookies = req.getCookies();
int i = 0;
//如果allCookies不为空,遍历
if(allCookies!=null)
{
//从中取出cookie
for(i=0;i<allCookies.length;i++)
{
//依次取出
Cookie temp = allCookies[i];
if(temp.getName().equals("myname"))
//得到cookie的值
name = temp.getValue();
else if(temp.getName().equals("mypasswd"))
passwd = temp.getValue();
}
if(!name.equals("")&&!passwd.equals(""))
{
//到logincl去验证
res.sendRedirect("logincl?username="+name+"&passwd="+passwd);
System.out.println("name = "+name+",passwd="+passwd);
return ;
}
}
//返回登录界面
res.sendRedirect("login?info=error2");
return ;
}
else
{
//在sevlet中显示图片
pw.println("<body><center>");//body体,让html文字在网页中间显示
pw.println("<img src=imgs/welcome.gif><br />");//在tomcat/webapps/自己的网页文件夹 创立imgs文件夹,放入图片然后在html语句中插入图片路径即可
pw.println("<h1>欢迎光临!用户"+valu+"</h1><br />");
//pw.println("<p>您的密码是"+p+"</p><br />");
pw.println("<a href='http://localhost:8080/RevenWebsite/login'>返回重新登录</a><br />");
//==================分页功能==============//
int pageSize = 3; //一页显示3条记录
int pageNow = 1;//当前显示页数
int pageSize2 = 5;
//动态地接受pageNow
String sPageNow = req.getParameter("pageNow");
if(sPageNow != null)
{
pageNow = Integer.parseInt(sPageNow);
}
//调用UserBeanCl
UserBeanCl ubc = new UserBeanCl();
ArrayList al = ubc.getResultByPage(pageNow,pageSize);
//表格
pw.println("<table border = 1");
pw.println("<tr><th>id</th><th>账户名</th><th>密码</th><th>邮箱</th><th>权限等级</th></tr>");
for(int i=0;i<al.size();i++)
{
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.getEmail()+"</td>");
pw.println("<td>"+ub.getGrade()+"</td>");
pw.println("</tr>");
}
pw.println("</table>");
//显示超链接
//显示上一页
if(pageNow!=1)
pw.println("<a href=wel?pageNow="+(pageNow-pageSize2)+">上一页</a>");
for(int i = pageNow;i <= pageNow+pageSize2-1;i++)
{
pw.println("<a href=wel?pageNow="+i+">"+i+"</a>");
}
int pageCount = ubc.getPageCount();
//显示下一页
if(pageNow!=pageCount)
pw.println("<a href=wel?pageNow="+(pageNow+pageSize2)+">下一页</a>");
}
//=======实现跳转页(待调试)=======//
//pw.println("<form action=wel method=post>");
//pw.println("跳转到第<input type=text name=SpageNow >页");
//pw.println("<form>");
//String s =req.getParameter("SpageNow");
//pw.println(s);
//int t = Integer.parseInt(s);
//pw.println(t);
//pw.println("<a href=wel?pageNow=1>Go</a>");//req.getIntHeader()
//=======实现跳转页(待调试)=======//
pw.println("</center></body>");//body体,让html文字在网页中间显示
}
catch(Exception ex){
ex.printStackTrace();
}
}
}
功能和界面与之前相同,注意到package换了一个包名
package com.jxust.reven;
这里为了模仿真实开发中,工作区的划分。