Java-Java基础12之Servlet开发用户管理系统
主要内容有:Java Servlet的应用,开发一个用户管理系统。
文件结构——(纯servlet开发网页)
tomcat配置数据源
<!--将数据源的配置加入到server.xml文件中的Host树枝下-->
<Context path="/myWebSite" docBase="D:/Workspace/servlet/myWebSite" debug="0">
<!--name:给数据源设置名字(jndi) auth:表示该数据源是谁管理 type:类型-->
<Resource name="luowei" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="shunping">
<!--工厂设置-->
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<!--驱动设置-->
<parameter>
<name>driverClassName</name>
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</parameter>
<!--设置url-->
<parameter>
<name>url</name>
<value>jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=test_user</value>
</parameter>
<!--设置连接数据库的用户名-->
<parameter>
<name>username</name>
<value>sa</value>
</parameter>
<!--设置连接数据库的密码-->
<parameter>
<name>password</name>
<value>luowei</value>
</parameter>
<!--设置连接池中最大的激活连接数-->
<parameter>
<name>maxActive</name>
<value>200</value>
</parameter>
<!--设置连接池中最大的保留(空闲)连接数-->
<parameter>
<name>maxIdle</name>
<value>10</value>
</parameter>
<!--客户端在队列池中最大等待时间,按秒计算;当设置为-1时,表示一直等待-->
<parameter>
<name>maxIdle</name>
<value>10</value>
</parameter>
</ResourceParams>
</Context>
<!--
如果使用连接池的方式来连接数据库,那么就要这样:
Context ctt=new javax.naming.InitalContext();
DataSource ds=(DataSource)ctt.lookup("java:comp/env/数据源的名字");
ct=ds.getConnection();
-->
ServletContext介绍
开发servlet的三种方法:
1.实现servlet接口(Hello.java)
/*
* 第一个Servlet,使用实现servlet接口的方式来开发
*
*/
package com.test1;
import javax.servlet.*;
import java.io.*;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class Hello implements Servlet {
//该函数用于初始化该servlet(类似于类的构造函数)
//该函数只会被调用一次(当用户第一次访问该servlet时被调用)
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
System.out.println("init it");
}
//这个函数用于处理业务逻辑
//程序员应当把业务逻辑代码写在这里
//当用户每访问该servlet时,都会被调用
//req:用于获得客户端(浏览器)的信息,res:用于向客户端(浏览器)返回信息
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
System.out.println("service it");//向控制台打印
//从res中得到PrintWriter(向浏览器打印)
PrintWriter pw=res.getWriter();
pw.println("hello,world");
}
//该函数用于得到servlet配置文件
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
//销毁servlet实例(释放内存),以下情况该函数被调用
//1.reload 该servlet(webApps)
//2.关闭tomcat
//3.关机
public void destroy() {
System.out.println("destroy!");
// TODO Auto-generated method stub
}
}
2. 继承GenericServlet(HelloGen.java)
//这是第二种开发servlet的方法(继承GenericServlet开发)
package com.test2;
import javax.servlet.GenericServlet;
import javax.servlet.*;
import java.io.*;
public class HelloGen extends GenericServlet
{
//重写service方法即可
public void service(ServletRequest req, ServletResponse res)
{
//返回hello,world!generic
try{
PrintWriter pw=res.getWriter();
pw.println("hello,world! generic");
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
3. 通过继承HttpServlet(HelloHttp.java)
//这是第三种开发servlet的方法(通过继承HttpServlet)
package com.test3;
import javax.servlet.http.*;
import java.io.*;
public class HelloHttp extends HttpServlet
{
//处理get请求
//req:用于获得浏览器的信息
//res:用于向浏览返回的信
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
//业务逻辑
try{
PrintWriter pw=res.getWriter();
pw.println("hello,HttpServlet");
}
catch(Exception e)
{
e.printStackTrace();
}
}
//处理post请求
//req:用于获得浏览器的信息
//res:用于向浏览返回的信
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req,res);
}
}
用户管理系统model1开发
用户表设计
--run:
--sqlcmd -U sa -P luowei -d master
create database test_user;
use test_user;
create table users(
useId int primary key identity(1,1),--用户id号
username varchar(20),
passwd varchar(20),
email varchar(30),
grade int --用户的级别
);
insert into users(username,passwd,email,grade) values("admin","admin","admin@sohu.com","1");
insert into users(username,passwd,email,grade) values("luowei","luowei","luowei@163.com","1");
insert into users(username,passwd,email,grade) values("test1","test1","test1@sina.com","5");
insert into users(username,passwd,email,grade) values("test2","test2","test2@sina.com","5");
select * from users;
1. 登录界面(Login.java)
//登录界面
package com.usermanage;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
public class Login extends HttpServlet
{
//处理get请求
//req:用于获得浏览器的信息
//res:用于向浏览返回的信
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
//业务逻辑
try{
//解决中文乱码
res.setContentType("text/html;charset=GB2312");
PrintWriter pw=res.getWriter();
//返回登录界面
pw.println("<html>");
pw.println("<body><center>");
//得到error信息
String info=req.getParameter("info");
if(info!=null)
{
pw.println("<h2>你的用户名或密码出错</h2>");
}
pw.println("<h1>登录界面</h1>");
pw.println("<form action=loginCl method=post>");
pw.println("用户名:<input type=text name=username height=30 weight=200><br>");
pw.println(" 密码: <input type=password name=passwd height=30 weight=220><br>");
pw.println("<input type=checkbox name=keep value=2>两周内不再登录<br>");
pw.println("<input type=submit value=login><br>");
pw.println("</form>");
pw.println("</center></body>");
pw.println("</html>");
}
catch(Exception e)
{
e.printStackTrace();
}
}
//处理post请求
//req:用于获得浏览器的信息(向浏览器请求信息)
//res:用于向浏览器返回的信息(向浏览器发送信息)
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req,res);
}
}
2. 登录处理界面(LoginCl.java)
//用户验证
/**
*同一用户的不同页面共享数据(四种方式):
* 1.通过sendRedirect("welcome?uname=name&passwd=password),
其中welcome表示要跳转到的页面,uname,passwd表示要传递的参数,
当有多个参数时要用 & 符号隔开,name和password表示参数的值
2.利用隐藏表单
<form action=login>
<input type=hidden name=a value=b>
</form>
3.通过服务器端为浏览器分配的Session空间
1.得到session
HttpSession hs=request.getSession(true);
2.向session添加属性
hs.setAttribute(String name,Object val);
3.从session得到某个属性
String name=hs.getAttribute(String name);
4.从session删除某个属性
hs.removeAttribute(String name);
4.利用cookie
1.在服务器端创建:Cookie c=new Cookie(String name,String val);
2.添加到客户端:response.addCookie(c)
3.从客户端读到服务器:requestCookies();
*/
package com.usermanage;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import java.sql.*;
public class LoginCl extends HttpServlet
{
//处理get请求
//req:用于获得浏览器的信息
//res:用于向浏览返回的信
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
Connection ct=null;
Statement sm=null;
ResultSet rs=null;
//业务逻辑
try
{
//接收用户用户名和密码
String u=req.getParameter("username");
String p=req.getParameter("passwd");
//PrintWriter pw=res.getWriter();
System.out.println("username="+u+" passwd="+p);
//连接数据库
// Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
// 得到连接
// ct=DriverManager.getConnection(
// "jdbc:microsoft:sqlserver://127.0.0.1:1433;databaseName=test_user",
// "sa","luowei");
ct=DriverManager.getConnection("jdbc:mysql://localhost:3306/test_user",
"root","root");
// 创建Statement
sm=ct.createStatement();
// rs=sm.executeQuery("select top 1 * from users where username='"
// +u+"' and passwd='"+p+"'");
rs=sm.executeQuery("select username,passwd from users where username='"
+u+"' and passwd='"+p+"'");
//验证
if(rs.next())
{
//说明用户是存在的(合法)
String dbPasswd=rs.getString(2);
if(dbPasswd.equals(p)) //这样可以消除注入漏洞
{
String keep=req.getParameter("keep");
System.out.println("keep="+keep);
if(keep!=null)//是否选中了checkbox
{
//将用户名和密码保存在客户端
//创建cookie
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);
}
//将验证成功的信息,写入session
//得到session
HttpSession hs=req.getSession(true);
//修改session的存在时间(这里改成20秒)
hs.setMaxInactiveInterval(20);
//向session添加属性
hs.setAttribute("pass","ok");
//将用户名传到welcome页面(可以在浏览器中看到值)
res.sendRedirect("welcome?uname="+u+"&passwd="+p);
}
}
else
{
//不合法
//跳转
res.sendRedirect("login?info=error1");//写要跳转到的servlet的url
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
try
{
if(null!=rs) rs.close();
if(null!=sm) sm.close();
if(null!=ct) ct.close();
}catch(Exception e)
{
e.printStackTrace();
}
}
/* //验证
if(p.equals("123"))
{
//合法
//将验证成功的信息,写入session
//得到session
HttpSession hs=req.getSession(true);
//修改session的存在时间(这里改成40秒)
hs.setMaxInactiveInterval(40);
//向session添加属性
hs.setAttribute("pass","ok");
//将用户名传到welcome页面(可以在浏览器中看到值)
res.sendRedirect("welcome?uname="+u+"&passwd="+p);
}
else
{
//不合法
//跳转
res.sendRedirect("login?info=error1");//写要跳转到的servlet的url
}
}
catch(Exception e)
{
e.printStackTrace();
} */
}
//处理post请求
//req:用于获得浏览器的信息
//res:用于向浏览返回的信
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req,res);
}
}
3. 欢迎界面(Wel.java)
//欢迎界面
package com.usermanage;
import javax.servlet.http.*;
import javax.servlet.*;
import java.sql.*;
import java.io.*;
public class Wel extends HttpServlet
{
//处理get请求
//req:用于获得浏览器的信息
//res:用于向浏览返回的信
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
Connection ct=null;
PreparedStatement ps=null;
ResultSet rs=null;
//业务逻辑
try{
//得到session
HttpSession hs=req.getSession(true);
String val=(String)hs.getAttribute("pass");
if(val==null)//判断
{
//如果客户端session中没有用户信息,再看有没有cookie信息
//客户端得到所有cookie信息
Cookie [] allCookies=req.getCookies();
int i=0;
String name="";
String passwd="";
//如果allCookies不为空
if(allCookies!=null)
{
//从中取出cookie
for(i=0;i<allCookies.length;i++)
{
//依次取出
Cookie temp=allCookies[i];
if(temp.getName().equals("myname"))
{
name=temp.getValue();//得到cookie的值
}
else if(temp.getName().equals("mypasswd"))
{
passwd=temp.getValue();//得到cookie的值
System.out.println("passwd="+passwd);
}
}
//System.out.println("myname="+name+" passwd="+passwd);
if(!name.equals("")&&!passwd.equals(""))
{
//到logincl去验证
res.sendRedirect("loginCl?username="+name+"&passwd="+passwd);
System.out.println("myname="+name+" passwd="+passwd);
return;
}
}
//非法登录,跳转到登录界面并提示出错
res.sendRedirect("login?info=error1");
return;
}
//解决中文乱码
res.setContentType("text/html;charset=GB2312");
PrintWriter pw=res.getWriter();
pw.println("<body><center>");
//=====================分页的功能=============================
int pageSize=5; //一页显示几条记录
int pageNow=1; //希望显示第几页
int rowCount=0; //共有几条记录(查表)
int pageCount=0; //一共有几页(计算)
//动态接收pageNow
String sPageNow=req.getParameter("pageNow");
if(sPageNow!=null)
{
//用户不是第一次进入welcome页面
pageNow=Integer.parseInt(sPageNow);
}
//得到rowCount
//加载驱动
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
// 得到连接
ct=DriverManager.getConnection("jdbc:mysql://localhost:3306/test_user",
"root","root");
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 * from users limit "+pageSize*(pageNow-1)
+","+pageSize);
//给?赋值
//ps.setInt(1,pageSize*(pageNow-1));
//ps.setInt(2,pageSize);
rs=ps.executeQuery();
//表头
pw.println("<table border=1>");
pw.println("<tr><th>id</th><th>name</th><th>passwd</th>"
+"<th>email</th><th>grade</th><tr>");
while(rs.next())
{
pw.println("<tr>");
pw.println("<td>"+rs.getInt(1)+"</td>");
pw.println("<td>"+rs.getString(2)+"</td>");
pw.println("<td>"+rs.getString(3)+"</td>");
pw.println("<td>"+rs.getString(4)+"</td>");
pw.println("<td>"+rs.getInt(5)+"</td>");
pw.println("</tr>");
}
pw.println("</table>");
if(1!=pageNow)//上一页
{
pw.println("<a href=welcome?pageNow="+(pageNow-1)+">上一页</a>");
}
//显示超链接(页面)
for(int i=pageNow;i<=pageNow+pageSize&&i<=pageCount;i++)
{
pw.println("<a href=welcome?pageNow="+i+">"+i+"</a>");
}
if(pageCount!=pageNow)//下一页
{
pw.println("<a href=welcome?pageNow="+(pageNow+1)+">下一页</a>");
}
pw.println("<br><br>");
pw.println("<a href=welcome?pageNow="+1+">第一页</a> ");
pw.println("<a href=welcome?pageNow="+(pageCount-pageSize)+">最后页</a>");
pw.println("<br>");
//得到从loginCl传递的 用户名
String u=req.getParameter("uname");
//得到从loginCl传递的 密码
String p=req.getParameter("passwd");
//在servlet中显示图片
pw.println("<img src=imgs/1.gif><br>");
pw.println("welcome,hello!"+u+" password="+p+"<br>");
pw.println("<a href=login>返回重新登录</a>");
pw.println("</center></body>");
}
catch(Exception e)
{
e.printStackTrace();
}
}
//处理post请求
//req:用于获得浏览器的信息
//res:用于向浏览返回的信
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req,res);
}
}
servlet用户管理系统模型图
Model2模式开发servlet用户管理系统
WEB-INF下的配置文件(web.xml)
<?xml version="1.0" encoding="gb2312"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>Welcome to myWebSite</display-name>
<description>
Welcome to myWebSite
</description>
<!-- JSPC servlet mappings start -->
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.test1.Hello</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/servlet/Hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>hellogen</servlet-name>
<servlet-class>com.test2.HelloGen</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hellogen</servlet-name>
<url-pattern>/hellogen</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>hellohttp</servlet-name>
<servlet-class>com.test3.HelloHttp</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hellohttp</servlet-name>
<url-pattern>/hellohttp</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.user_mng.Login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>loginCl</servlet-name>
<servlet-class>com.user_mng.LoginCl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginCl</servlet-name>
<url-pattern>/loginCl</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>main</servlet-name>
<servlet-class>com.user_mng.Main</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>main</servlet-name>
<url-pattern>/main</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>wel</servlet-name>
<servlet-class>com.user_mng.Wel</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>wel</servlet-name>
<url-pattern>/welcome</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>delUserCl</servlet-name>
<servlet-class>com.user_mng.DelUserCl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>delUserCl</servlet-name>
<url-pattern>/delUserCl</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ok</servlet-name>
<servlet-class>com.user_mng.Ok</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ok</servlet-name>
<url-pattern>/ok</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>err</servlet-name>
<servlet-class>com.user_mng.Err</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>err</servlet-name>
<url-pattern>/err</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>update</servlet-name>
<servlet-class>com.user_mng.Update</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>update</servlet-name>
<url-pattern>/update</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>updateCl</servlet-name>
<servlet-class>com.user_mng.UpdateCl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>updateCl</servlet-name>
<url-pattern>/updateCl</url-pattern>
</servlet-mapping>
<!-- JSPC servlet mappings end -->
</web-app>
界面层_登录界面(Login.java)
//登录界面
package com.user_mng;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
public class Login extends HttpServlet
{
//处理get请求
//req:用于获得浏览器的信息
//res:用于向浏览返回的信
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
//业务逻辑
try{
//解决中文乱码
res.setContentType("text/html;charset=GB2312");
PrintWriter pw=res.getWriter();
//返回登录界面
pw.println("<html>");
pw.println("<body bgcolor=#CEDEFF >");
pw.println("<center>");
pw.println("<img src=imgs/1.gif>");
pw.println("<hr>");
//得到error信息
String info=req.getParameter("info");
if(info!=null)
{
pw.println("<h2>你的用户名或密码出错</h2>");
}
pw.println("<h1>登录界面</h1>");
pw.println("<form action=loginCl method=post>");
pw.println("用户名:<input type=text name=username height=30 width=160><br>");
pw.println(" 密码: <input type=password name=passwd height=30 width=160><br>");
pw.println("<input type=checkbox name=keep value=2>两周内不再登录<br>");
pw.println("<input type=submit value=login><br>");
pw.println("</form>");
pw.println("</center><hr>");
pw.println("<img src=imgs/logo.gif>");
pw.println("</body>");
pw.println("</html>");
}
catch(Exception e)
{
e.printStackTrace();
}
}
//处理post请求
//req:用于获得浏览器的信息(向浏览器请求信息)
//res:用于向浏览器返回的信息(向浏览器发送信息)
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req,res);
}
}
界面层_验证用户(LoginCl.java)
//用户验证
/**
*同一用户的不同页面共享数据(四种方式):
* 1.通过sendRedirect("welcome?uname=name&passwd=password),
其中welcome表示要跳转到的页面,uname,passwd表示要传递的参数,
当有多个参数时要用 & 符号隔开,name和password表示参数的值
2.利用隐藏表单
<form action=login>
<input type=hidden name=a value=b>
</form>
3.通过服务器端为浏览器分配的Session空间
1.得到session
HttpSession hs=request.getSession(true);
2.向session添加属性
hs.setAttribute(String name,Object val);
3.从session得到某个属性
String name=hs.getAttribute(String name);
4.从session删除某个属性
hs.removeAttribute(String name);
4.利用cookie
1.在服务器端创建:Cookie c=new Cookie(String name,String val);
2.添加到客户端:response.addCookie(c)
3.从客户端读到服务器:requestCookies();
*/
/*
*多个用户共享同一数据:
1.利用ServletContext,它是在服务器端分配供多个用户共享的数据区域
2.得到ServletContext实例:this.getServletContext();
3.可以把它想像成一张表,和session非常相似,每一行是一个属性:
1.添加属性:setAttribute(String name,Object ob)
2.得到值:getAttribute(String name) 返回Object
3.删除属性:removeAttribute(String name)
4.生命周期:从创建开始,到服务器关闭而结束
*/
package com.user_mng;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import java.sql.*;
public class LoginCl extends HttpServlet
{
//添加网页访问次数的功能
//重写init函数(init函数会在访问这个servlet文件时,会被调用一次)
public void init()
{
try{
//这个函数只会被调用一次
//从文件中读取次数
FileReader fr=new FileReader("f:/myCounter.txt");
BufferedReader br=new BufferedReader(fr);
//读出一行数据
String numVal=br.readLine();
//关闭文件流
br.close();
//将numVal值放入到servletContext
this.getServletContext().setAttribute("visitTime",numVal+"");
System.out.println("init被调用");
}catch(Exception e){
e.printStackTrace();
}
}
//重写destroy函数(destroy函数在服务器被关闭时,会自动调用)
public void destroy()
{
try{
//再将新的次数写回文件
FileWriter fw=new FileWriter("f:/myCounter.txt");
BufferedWriter bw=new BufferedWriter(fw);
//写入一行数据
bw.write(this.getServletContext().getAttribute("visitTime").toString());
//关闭文件流
bw.close();
System.out.println("destroy函数被调用");
}catch(Exception e){
e.printStackTrace();
}
}
//处理get请求
//req:用于获得浏览器的信息
//res:用于向浏览返回的信
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
// Connection ct=null;
// Statement sm=null;
// ResultSet rs=null;
//业务逻辑
try
{
//接收用户用户名和密码
String u=req.getParameter("username");
String p=req.getParameter("passwd");
//PrintWriter pw=res.getWriter();
System.out.println("username="+u+" passwd="+p);
//调用UserBeanCl,创建一个UserBeanCl对象
UserBeanCl ubc=new UserBeanCl();
//验证,使用UserBeanCl的方法
if(ubc.checkUser(u,p))
{
String keep=req.getParameter("keep");
System.out.println("keep="+keep);
if(keep!=null)//是否选中了checkbox
{
//将用户名和密码保存在客户端
//创建cookie
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);
}
//将验证成功的信息,写入session
//得到session
HttpSession hs=req.getSession(true);
//修改session的存在时间(这里改成20秒)
hs.setMaxInactiveInterval(20);
//向session添加属性
hs.setAttribute("pass","ok");
hs.setAttribute("uname",u);
hs.setAttribute("passwd",p);
//将servletContext中的visitTime中的值++
String times=this.getServletContext().getAttribute("visitTime").toString();
//对times++再重新放回servlet
this.getServletContext().setAttribute("visitTime",(Integer.parseInt(times)+1)+"");
//将用户名传到welcome页面(可以在浏览器中看到
//res.sendRedirect("welcome?uname="+u+"&passwd="+p);
res.sendRedirect("main");
}
else
{
//不合法
//跳转
res.sendRedirect("login?info=error1");//写要跳转到的servlet的url
}
}
catch(Exception e)
{
e.printStackTrace();
}
/* //验证
if(p.equals("123"))
{
//合法
//将验证成功的信息,写入session
//得到session
HttpSession hs=req.getSession(true);
//修改session的存在时间(这里改成40秒)
hs.setMaxInactiveInterval(40);
//向session添加属性
hs.setAttribute("pass","ok");
//将用户名传到welcome页面(可以在浏览器中看到值)
res.sendRedirect("welcome?uname="+u+"&passwd="+p);
}
else
{
//不合法
//跳转
res.sendRedirect("login?info=error1");//写要跳转到的servlet的url
}
}
catch(Exception e)
{
e.printStackTrace();
} */
}
//处理post请求
//req:用于获得浏览器的信息
//res:用于向浏览返回的信
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req,res);
}
}
界面层_主界面(Main.java)
//主界面//登录界面
package com.user_mng;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
public class Main extends HttpServlet
{
//处理get请求
//req:用于获得浏览器的信息
//res:用于向浏览返回的信
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
//业务逻辑
try{
//解决中文乱码
res.setContentType("text/html;charset=GB2312");
PrintWriter pw=res.getWriter();
//返回登录界面
pw.println("<html>");
pw.println("<body bgcolor=#CEDEFF >");
pw.println("<center>");
pw.println("<img src=imgs/1.gif>");
pw.println("<hr>");
pw.println("<h1>主界面</h1><br>");
pw.println("<a href=welcome>管理用户</a><br>");
pw.println("<a href=?>添加用户</a><br>");
pw.println("<a href=?>查找用户</a><br>");
pw.println("<a href=?>安全退出</a><br>");
pw.println("</center><hr>");
pw.println("<img src=imgs/logo.gif>");
pw.println("</body>");
pw.println("</html>");
}
catch(Exception e)
{
e.printStackTrace();
}
}
//处理post请求
//req:用于获得浏览器的信息(向浏览器请求信息)
//res:用于向浏览器返回的信息(向浏览器发送信息)
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req,res);
}
}
界面层_欢迎界面(Wel.java)
//欢迎界面
package com.user_mng;
import javax.servlet.http.*;
import javax.servlet.*;
import java.util.*;
import java.sql.*;
import java.io.*;
public class Wel extends HttpServlet
{
//处理get请求
//req:用于获得浏览器的信息
//res:用于向浏览返回的信
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
Connection ct=null;
PreparedStatement ps=null;
ResultSet rs=null;
//业务逻辑
try{
//得到session
HttpSession hs=req.getSession(true);
String val=(String)hs.getAttribute("pass");
//从Session中得到用户名和密码
String u=(String)hs.getAttribute("uname");
String p=(String)hs.getAttribute("passwd");
if(val==null)//判断
{
//如果客户端session中没有用户信息,再看有没有cookie信息
//客户端得到所有cookie信息
Cookie [] allCookies=req.getCookies();
int i=0;
String name="";
String passwd="";
//如果allCookies不为空
if(allCookies!=null)
{
//从中取出cookie
for(i=0;i<allCookies.length;i++)
{
//依次取出
Cookie temp=allCookies[i];
if(temp.getName().equals("myname"))
{
name=temp.getValue();//得到cookie的值
}
else if(temp.getName().equals("mypasswd"))
{
passwd=temp.getValue();//得到cookie的值
System.out.println("passwd="+passwd);
}
}
//System.out.println("myname="+name+" passwd="+passwd);
if(!name.equals("")&&!passwd.equals(""))
{
//到logincl去验证
res.sendRedirect("loginCl?username="+name+"&passwd="+passwd);
System.out.println("myname="+name+" passwd="+passwd);
return;
}
}
//非法登录,跳转到登录界面并提示出错
res.sendRedirect("login?info=error1");
return;
}
//解决中文乱码
res.setContentType("text/html;charset=GB2312");
PrintWriter pw=res.getWriter();
pw.println("<body bgcolor=#CEDEFF >");
pw.println("<center>");
pw.println("<img src=imgs/1.gif>");
pw.println(" 欢迎您:"+u+"<img src=imgs/luowei.gif>");
pw.println("<hr>");
//=====================分页的功能=============================
int pageSize=5; //一页显示几条记录
int pageNow=1; //希望显示第几页
//int jumpPage=0; //跳转的页面
//动态接收pageNow
String sPageNow=req.getParameter("pageNow");
if(sPageNow!=null)
{
//用户不是第一次进入welcome页面
pageNow=Integer.parseInt(sPageNow);
}
//调用UserBeanCl的方法
UserBeanCl ubc=new UserBeanCl();
ArrayList al=ubc.getResultByPage(pageNow,pageSize);
pw.println("<h1>管理用户</h1><br>");
//表头
pw.println("<table border=1>");
pw.println("<tr bgcolor=pink><th>用户id</th><th>用户名</th><th>密码</th>"
+"<th>邮箱</th><th>级别</th><th>修改用户</th><th>删除用户</th><tr>");
//定义一个颜色数组
String [] mycol={"silver","pink"};
for(int i=0;i<al.size();i++)
{
//取出UserBean
UserBean ub=(UserBean)al.get(i);
pw.println("<tr bgcolor="+mycol[i%2]+">");
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("<td><a href=update?uId="+ub.getUserId()+"&uName="+ub.getUserName()+
"&uPass="+ub.getPasswd()+"&uEmail="+ub.getMail()+"&uGrade="+ub.getGrade()+">修改用户</a></td>");
pw.println("<td><a href=delUserCl?userid="+ub.getUserId()+
" onClick=\"return window.confirm('您确认要删除该用户吗?')\">删除用户</a></td>");
//弹出删除确认对话框,其中\"是转义符
pw.println("</tr>");
}
pw.println("</table>");
//接收jumpPae
//jumpPage=Integer.parseInt(req.getParameter("jumpPage"));
//pageNow=jumpPage;
int pageCount=ubc.getPageCount();
if(1!=pageNow)//上一页
{
pw.println("<a href=welcome?pageNow="+(pageNow-1)+">上一页</a>");
}
//显示超链接(页面)
for(int i=pageNow;i<=pageNow+pageSize&&i<=pageCount;i++)
{
pw.println("<a href=welcome?pageNow="+i+">"+i+"</a>");
}
if(pageCount!=pageNow)//下一页
{
pw.println("<a href=welcome?pageNow="+(pageNow+1)+">下一页</a>");
}
pw.println("<br>");
//指定跳转到某页
pw.println("<form action=welcome>");
pw.println("跳转到:<input type=text name=pageNow height=30 width=50>");
pw.println("<input type=submit value=Go>");
pw.println("</form>");
pw.println("<br>");
pw.println("<a href=welcome?pageNow="+1+">第一页</a> ");
pw.println("<a href=welcome?pageNow="+(pageCount-pageSize)+">最后页</a>");
pw.println("<br>");
/* //得到从loginCl传递的 用户名
String u=req.getParameter("uname");
//得到从loginCl传递的 密码
String p=req.getParameter("passwd");
*/
pw.println("welcome,hello! "+u+" Your password:"+p+"<br>");
pw.println("<a href=login>返回重新登录</a>");
pw.println("<br>该网页被访问了"+Integer.parseInt(this.getServletContext().
getAttribute("visitTime").toString())+"次<br>");
pw.println("您的ip="+req.getRemoteAddr()+"<br>");
pw.println("您的主机名为:"+req.getRemoteHost()+"<br>");
pw.println("</center><hr>");
pw.println("<img src=imgs/logo.gif>");
pw.println("</body>");
}
catch(Exception e)
{
e.printStackTrace();
}finally{
try
{
if(null!=rs) {rs.close();rs=null;}
if(null!=ps) {ps.close();ps=null;}
if(null!=ct) {ct.close();ct=null;}
}catch(Exception e)
{
e.printStackTrace();
}
}
}
//处理post请求
//req:用于获得浏览器的信息
//res:用于向浏览返回的信
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req,res);
}
}
界面层_修改用户(Update.java)
//修改用户界面
package com.user_mng;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
public class Update extends HttpServlet
{
//处理get请求
//req:用于获得浏览器的信息
//res:用于向浏览返回的信
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
//业务逻辑
try{
//解决中文乱码
res.setContentType("text/html;charset=GB2312");
PrintWriter pw=res.getWriter();
//返回登录界面
pw.println("<html>");
pw.println("<body bgcolor=#CEDEFF >");
pw.println("<center>");
pw.println("<img src=imgs/1.gif>");
pw.println("<hr>");
pw.println("<h1>修改用户信息</h1>");
pw.println("<form action=updateCl>");
pw.println("<table border=1>");
pw.println("<tr><td>用户id</td><td><input readonly name=uId type=text value="
+req.getParameter("uId")+"></td></tr>");
pw.println("<tr><td>用户名</td><td><input readonly name=uName type=text value="
+req.getParameter("uName")+"></td></tr>");
pw.println("<tr><td>密码</td><td><input name=uPass type=text value="
+req.getParameter("uPass")+"></td></tr>");
pw.println("<tr><td>邮箱</td><td><input name=uEmail type=text value="
+req.getParameter("uEmail")+"></td></tr>");
pw.println("<tr><td>级别</td><td><input name=uGrade type=text value="
+req.getParameter("uGrade")+"></td></tr>");
//提交按钮
pw.println("<tr><td colspan=2><input type=submit value=修改用户"+
" onClick=\"return window.confirm('您确认要修改该用户吗?')\"></td></tr>");
pw.println("</table></form>");
pw.println("</center><hr>");
pw.println("<img src=imgs/logo.gif>");
pw.println("</body>");
pw.println("</html>");
}
catch(Exception e)
{
e.printStackTrace();
}
}
//处理post请求
//req:用于获得浏览器的信息(向浏览器请求信息)
//res:用于向浏览器返回的信息(向浏览器发送信息)
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req,res);
}
}
界面层_修改用户处理(UpdateCl.java)
//处理修改某个用户界面
package com.user_mng;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
public class UpdateCl extends HttpServlet
{
//处理get请求
//req:用于获得浏览器的信息
//res:用于向浏览返回的信
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
//业务逻辑
try{
//解决中文乱码
res.setContentType("text/html;charset=GB2312");
PrintWriter pw=res.getWriter();
//调用userBeanCl的删除用户的方法,完成删除任务
UserBeanCl ubc=new UserBeanCl();
//接收从Update.java中传递的值
String id=req.getParameter("uId");
String uPass=req.getParameter("uPass");
String uEmail=req.getParameter("uEmail");
String uGrade=req.getParameter("uGrade");
if(ubc.updateUser(id,uPass,uEmail,uGrade))
{
//删除成功
res.sendRedirect("ok");
}else
{
//删除失败
res.sendRedirect("err");
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
//处理post请求
//req:用于获得浏览器的信息(向浏览器请求信息)
//res:用于向浏览器返回的信息(向浏览器发送信息)
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req,res);
}
}
界面层_删除用户(DelUserCl.java)
//处理删除某个用户界面
package com.user_mng;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
public class DelUserCl extends HttpServlet
{
//处理get请求
//req:用于获得浏览器的信息
//res:用于向浏览返回的信
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
//业务逻辑
try{
//解决中文乱码
res.setContentType("text/html;charset=GB2312");
PrintWriter pw=res.getWriter();
//调用userBeanCl的删除用户的方法,完成删除任务
UserBeanCl ubc=new UserBeanCl();
//接收从Wel.java中传递的id
String id=req.getParameter("userid");
if(ubc.delUser(id))
{
//删除成功
res.sendRedirect("ok");
}else
{
//删除失败
res.sendRedirect("err");
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
//处理post请求
//req:用于获得浏览器的信息(向浏览器请求信息)
//res:用于向浏览器返回的信息(向浏览器发送信息)
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req,res);
}
}
界面层_操作失败(Err.java)
//操作失败界面
package com.user_mng;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
public class Err extends HttpServlet
{
//处理get请求
//req:用于获得浏览器的信息
//res:用于向浏览返回的信
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
//业务逻辑
try{
//解决中文乱码
res.setContentType("text/html;charset=GB2312");
PrintWriter pw=res.getWriter();
//返回登录界面
pw.println("<html>");
pw.println("<body bgcolor=#CEDEFF >");
pw.println("<center>");
pw.println("<img src=imgs/1.gif>");
pw.println("<hr>");
pw.println("<h1>很遗憾,操作不成功!</h1>");
pw.println("<a href=main>返回主界面</a> "
+"  <a href=welcome>返回上一页面</a>");
pw.println("</center><hr>");
pw.println("<img src=imgs/logo.gif>");
pw.println("</body>");
pw.println("</html>");
}
catch(Exception e)
{
e.printStackTrace();
}
}
//处理post请求
//req:用于获得浏览器的信息(向浏览器请求信息)
//res:用于向浏览器返回的信息(向浏览器发送信息)
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req,res);
}
}
界面层_操作成功(Ok.java)
//操作成功界面
package com.user_mng;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
public class Ok extends HttpServlet
{
//处理get请求
//req:用于获得浏览器的信息
//res:用于向浏览返回的信
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
//业务逻辑
try{
//解决中文乱码
res.setContentType("text/html;charset=GB2312");
PrintWriter pw=res.getWriter();
//返回登录界面
pw.println("<html>");
pw.println("<body bgcolor=#CEDEFF >");
pw.println("<center>");
pw.println("<img src=imgs/1.gif>");
pw.println("<hr>");
pw.println("<h1>恭喜你,操作成功!</h1>");
pw.println("<a href=main>返回主界面</a> "
+"  <a href=welcome>返回上一页面</a>");
pw.println("</center><hr>");
pw.println("<img src=imgs/logo.gif>");
pw.println("</body>");
pw.println("</html>");
}
catch(Exception e)
{
e.printStackTrace();
}
}
//处理post请求
//req:用于获得浏览器的信息(向浏览器请求信息)
//res:用于向浏览器返回的信息(向浏览器发送信息)
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req,res);
}
}
model层_表示User表(UserBean.java)
//这是一个UserBean <-----> users表映射
//他的一个 对象 <-----> users表的一条记录对应
//数据
package com.user_mng;
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 String getUserName()
{
return this.userName;
}
public void setPasswd(String passwd)
{
this.passwd=passwd;
}
public String getPasswd()
{
return this.passwd;
}
public void setMail(String mail)
{
this.mail=mail;
}
public String getMail()
{
return this.mail;
}
public void setGrade(int grade)
{
this.grade=grade;
}
public int getGrade()
{
return this.grade;
}
}
model层_业务逻辑(UserBeanCl.java)
//这是一个处理类(处理users表) <----->操作UserBean
//业务逻辑
package com.user_mng;
import java.sql.*;
import java.util.*;
public class UserBeanCl
{
//业务逻辑
private Connection ct=null;
private PreparedStatement ps=null;
private ResultSet rs=null;
private int rowCount=0; //共有几条记录(查表)
private int pageCount=0; //一共有几页(计算)
//public static UserBean ub=new UserBean();
/* public UserBeanCl(UserBean ub)
{
this.ub=ub;
} */
//验证用户
public boolean checkUser(String u,String p)
{
boolean b=false;
try{
//得到连接
ConnDB cd=new ConnDB();
ct=cd.getConn();
// ps=ct.prepareStatement("select userName,passwd from users where userName='"
// +ub.getUserName()+"' limit 1");
ps=ct.prepareStatement("select userName,passwd from users where userName=? limit 1");
ps.setString(1,u);
rs=ps.executeQuery();
if(rs.next())
{
String dbPasswd=rs.getString(2);
if(dbPasswd.equals(p))
{
b=true;
}
}
}catch(Exception e){
e.printStackTrace();
}finally{
this.close();
}
return b;
}
/*1.如果返回ResultSet,那么在使用ResultSet时是不能关闭与该ResultSet
* 相互关联的数据库连接等资源,从而造成资源浪费。
*2.如果返回ResultSet,只能使用rs.getInt(?),rs.getString(?)...这样的
* 方法来得到结果,代码的可读性不好,维护不方便。
*3.利用集合:比如ArrayList作为中转,这样,我们就可以尽快的关闭rs,数据库连接
* 同时更能体现面向对象编程,代码可读性好。
1.将rs中的每条记录,封装成一个UserBean对象ub;
2.将封装后的UserBean对象ub放入到ArrayList集合中,利于管理。
*/
//-----------------------------
//分页显示结果
public ArrayList getResultByPage(int pageNow,int pageSize)
{
ArrayList al=new ArrayList();
try
{
//得到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 * from users limit "+pageSize*(pageNow-1)
+","+pageSize);
//给?赋值
//ps.setInt(1,pageSize*(pageNow-1));
//ps.setInt(2,pageSize);
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);//将ub放入到ArrayList集合中
}
}catch(Exception e)
{
e.printStackTrace();
}finally
{
this.close();
}
return al;
}
//修改用户
public boolean updateUser(String id,String passwd,String email,String grade)
{
boolean b=false;
try{
//得到连接
ConnDB cd=new ConnDB();
ct=cd.getConn();
String sql="update users set passwd='"+passwd+"',email='"+email+
"',grade='"+grade+"' where useId='"+id+"'";
ps=ct.prepareStatement(sql);
int num=ps.executeUpdate();
if(num==1)
{
//删除成功
b=true;
}else
{
//删除失败
}
}catch(Exception e){
e.printStackTrace();
}finally{
this.close();
}
return b;
}
//删除用户
public boolean delUser(String id)
{
boolean b=false;
try{
//得到连接
ConnDB cd=new ConnDB();
ct=cd.getConn();
String sql="delete from users where useId='"+id+"'";
ps=ct.prepareStatement(sql);
int num=ps.executeUpdate();
if(num==1)
{
//删除成功
b=true;
}else
{
//删除失败
}
}catch(Exception e){
e.printStackTrace();
}finally{
this.close();
}
return b;
}
//返回pageCount
public int getPageCount()
{
return this.pageCount;
}
//关闭资源
public void close()
{
try
{
if(null!=rs) {rs.close();rs=null;}
if(null!=ps) {ps.close();ps=null;}
if(null!=ct) {ct.close();ct=null;}
}catch(Exception e)
{
e.printStackTrace();
}
}
}
model层_连接数据库(ConnDB.java)
//从数据库中得到连接
package com.user_mng;
import java.sql.*;
public class ConnDB
{
private Connection ct=null;
public Connection getConn()
{
try{
//得到rowCount
//加载驱动
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
// Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
// 得到连接
// ct=DriverManager.getConnection(
// "jdbc:microsoft:sqlserver://127.0.0.1:1433;databaseName=test_user",
// "sa","luowei");
ct=DriverManager.getConnection("jdbc:mysql://localhost:3306/test_user",
"root","root");
}catch(Exception e){
e.printStackTrace();
}
return ct;
/*
try{
//利用数据源的方式访问数据库
//创建一个上下文环境
Context con=new javax.naming.InitalContext();
//通过con得到数据源
DataSource ds=(DataSource)con.lookup("java:comp/env/数据源的名字");
ct=ds.getConnection();
}catch(Eception e){
e.printStackTrace();
}
*/
}
}