view层 主要负责视图显示
model层 主要负责业务逻辑的处理
Login.java负责登录
LoginCl.java登录验证 wel负责界面的显示
UserBeanCl.java负责逻辑的处理,相当于model层
UserBean.java作为bean,ConnDB负责连接数据库,获得Connection
package com.tsinghua;
import javax.servlet.http.*;
import java.io.*;
public class Login extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
try{
res.setContentType("text/html;charset=gbk");
PrintWriter pw=res.getWriter();
pw.println("<html>");
pw.println("<body>");
pw.println("<h1>登录界面</h1>");
pw.println("<form action=LoginCl method=post>");
pw.println("用户名:<input type=text name=usrename><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=loing><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);
}
}
package com.tsinghua;
import javax.servlet.http.*;
import java.io.*;
import java.sql.*;
public class LoginCl extends HttpServlet {
//重写get请求
public void doGet(HttpServletRequest req,HttpServletResponse res){
Connection ct=null;
Statement sm=null;
ResultSet rs=null;
try{
//接收用户名和密码
String u=req.getParameter("usrename");
String p=req.getParameter("passwd");
//调用UserBeanCl
UserBeanCl ubc=new UserBeanCl();
//使用UserBeanCL的方法
if(ubc.checkUser(u,p)){
//说明用户名存在
String keep=req.getParameter("keep");
if(keep!=null){
//将用户名和密码保存在客户端中(cookie)
Cookie name=new Cookie("myname",u);
Cookie pass=new Cookie("mypasswd",p);
name.setMaxAge(14*24*60*60);
pass.setMaxAge(14*24*60*60);
//回写到客户端
res.addCookie(name);
res.addCookie(pass);
}
//真的合法
//合法
//跳转到wel
//将验证成功的信息写入session
//1、得到session
HttpSession hs=req.getSession(true);
//修改session的存在时间
//hs.setMaxInactiveInterval(20);
hs.setAttribute("pass","ok");
res.sendRedirect("wel?uname="+u+"&upasswd="+p);
}else{
//说明用户名不存在
res.sendRedirect("login");
}
}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();
}
}
}
//重写get请求
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
}
package com.tsinghua;
import javax.servlet.http.*;
import java.io.*;
import java.sql.*;
import java.util.*;
public class wel extends HttpServlet{
//重写get请求
public void doGet(HttpServletRequest req,HttpServletResponse res){
Connection ct=null;
PreparedStatement ps=null;
ResultSet rs=null;
//得到session
HttpSession hs=req.getSession(true);
String val=(String)hs.getAttribute("pass");
String name="";
String passwd="";
res.setCharacterEncoding("gbk");
//判断
if(val==null){
//如果session中没有用户信息,再看看有没有cookie信息
//非法登录
Cookie[] allCookies=req.getCookies();
int j=0;
if(allCookies!=null){
for(j=0;j<allCookies.length;j++){
Cookie temp=allCookies[j];
if(temp.getName().equals("myname")){
name=temp.getValue();
}else if(temp.getName().equals("mypasswd")){
passwd=temp.getValue();
}
}
System.out.println("myname="+name+" pas="+passwd);
if(!name.equals("")&&passwd.equals("")){
try{
res.sendRedirect("LoginCl?username="+name+"&passwd="+passwd);
}catch(Exception ex){
ex.printStackTrace();
}
return;
}
}else{
try{
res.sendRedirect("login");
}catch(Exception ex){
ex.printStackTrace();
}
}
}
//得到从logincl传递的用户名
String u=req.getParameter("uname");
String p=req.getParameter("upasswd");
try{
res.setCharacterEncoding("gbk");
PrintWriter pw=res.getWriter();
//在servlet中显示图片
pw.println("<html>");
pw.println("<body >");
pw.println("<center>");
//分页代码
int pageSize=3;//一页显示几条记录
int pageNow=1;//希望显示第几页
//动态的接受pageNow
String sPageNow=req.getParameter("pageNow");
if(sPageNow!=null){
//用户第一次进入wel页面
pageNow=Integer.parseInt(sPageNow);
}else{
}
UserBeanCl ubc=new UserBeanCl();
ArrayList al=ubc.getResultByPage(pageNow,pageSize);
pw.println("<table border=1>");
pw.println("<tr><th>id</th><th>name</th><th>passwd</th><th>mail</th><th>grade</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.getMail()+"</td>");
pw.println("<td>"+ub.getGrade()+"</td>");
pw.println("</tr>");
}
pw.println("</table>");
//上一页
if(pageNow!=1){
pw.println("<a href=wel?pageNow="+(pageNow-1)+">上一页</a>");
}
//显示超链接
for(int i=pageNow;i<=pageNow+4;i++){
pw.println("<a href=wel?pageNow="+i+">"+i+"</a>");
}
//下一页
int pageCount=ubc.getPageCount();
if(pageNow!=pageCount){
pw.println("<a href=wel?pageNow="+(pageNow+1)+">下一页</a>");
}
pw.println("<br/>");
pw.println("<a href=Login>点击返回</a>");
//pw.println("<img src=imgs/jing1.jpg><br>");
pw.println("wel hello "+u+" "+p);
pw.println("</center>");
pw.println("</body>");
pw.println("</html>");
}catch(Exception ex)
{
ex.printStackTrace();
}
}
//重写get请求
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
}
//这是一个UserBean对应users表映射
package com.tsinghua;
public class UserBean {
private int userId;
private String userName;
private String passwd;
private String mail;
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 setMail(String mail){
this.mail=mail;
}
public void setGrade(int grade){
this.grade=grade;
}
public String getUserName(){
return this.userName;
}
public String getPasswd(){
return this.passwd;
}
public String getMail(){
return this.mail;
}
public int getGrade(){
return this.grade;
}
}
package com.tsinghua;
import java.sql.*;
public class ConnDB {
private Connection ct=null;
public Connection getConn(){
try{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
ct=DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;databaseName=spdb","sa","123456");
}catch(Exception ex){
ex.printStackTrace();
}
return ct;
}
}
//这是一个处理类(处理users类),操作UserBean(面向对象,操作users表)
package com.tsinghua;
import java.sql.*;
import java.util.*;
public class UserBeanCl {
//业务逻辑
private Connection ct=null;
private PreparedStatement ps=null;
ResultSet rs=null;
private int pageCount=0;//共有几页(计算)
public int getPageCount(){
return this.pageCount;
}
//分页显示
public ArrayList getResultByPage(int pageNow,int pageSize){
ArrayList al=new ArrayList();
try{
int rowCount=0;//共有几条记录(查表)
ConnDB cd=new ConnDB();
ct=cd.getConn();
//得到rowCount
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)");
//给?赋值
//ps.setInt(1,pageSize);
//ps.setInt(2,pageSize*(pageNow-1));
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);
}
}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();
}
return b;
}
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 boolean checkUser(UserBean u){}
}
注:为什么在UserBeanCl中我们返回ArrayList集合,而不是直接返回ResultSet
(1)如果返回ResultSet,那么我们在使用ResultSet时,是不能关闭与该ResultSet相互关联的数据库连接等资源,从而造成资源浪费。
(2)如果返回ResultSet,我们只能使用rs.getInt(?),rs.getString(?)...这样的方法来得到结果,代码的可读性不好,维护不方便。