LZ最近在学习Java WEB的servlet,其中也碰到过一些问题,非常典型而且又实用,当然也是一些非常简单的问题,我想在这里拿来分享一些,也当做前一阶段学习servlet的总结。
我以一个简单的信息查询系统为例,来描述。
要实现的功能就是从数据库中调用数据,然后在前台根据用户输入的ID号,从后台服务器中调用数据库中对应的ID号,然后根据这个号码从数据库中调出相应的用户打卡信息。
这个设计我根据MVC模式,来搞:即为:module、view、control三权分立。
首先一个是connDB类,这个类实现的是连接数据库,也就是module模块,分立开来。
具体的代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
//从数据库中得到连接
public class ConnDB
{
private Connection ct = null;
public Connection getConn()
{
try
{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
ct = DriverManager.getConnection("jdbc:sqlserver://localhost:1433; DatabaseName=spdb","sa","123456");
}
catch(Exception e)
{
e.printStackTrace();
}
return ct;
}
}
//以后每次调用数据库,直接先调用这段代码
第二部分是数据库中的数据表示形式代码,即Userbean类。
此类表示的是数据库中的数据的表示形式:
//这是一个userBean,和user表映射
//它的一个对象对应user表的一条记录
import java.sql.*;
public class Userbean
{
private int USERID;
private String CHECKTIME;
private String CHECKTYPE;
int getUserId()
{
return this.USERID;
}
void setUserId(int userid)
{
this.USERID = userid;
}
String getChecktime()
{
return this.CHECKTIME;
}
void setChecktime(String Checktime)
{
this.CHECKTIME = Checktime;
}
String getChecktype()
{
return this.CHECKTYPE;
}
void setChecktype(String Checktype)
{
this.CHECKTYPE = Checktype;
}
public String toString() //重写toString方法,才能正确显示
{
return (this.USERID + " " + this.CHECKTIME + " " + this.CHECKTYPE ); //注意这里的toString方法需要重写,因为不写,那么再调用这个类的方法时候,会出现显示的是哈希值
}
}
接下来是首页,也就是登录界面部分:
这一部分就是典型地在servlet中嵌套html代码,但是这正是servlet中尴尬的部分,显示界面不方便
public class Search 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("<body bgcolor=#CED3FF>");
pw.println("<hr><center>");
pw.println("<h1>查找用户的考勤情况</h1>");
pw.println("<form action=SearchCL method=post>"); //这里是重点,这个是一个表单,也就是需要提交的表单,用post方式,而且按下submit按钮之后是返回到SearchCL页面
pw.println("用户的ID号:<input type=text name=userid><br>"); //注意这里的name千万别写错,这里的name是用来表示某个属性
pw.println("<input type=submit value=go><br>");
pw.println("</form>");
//pw.println("<center><hr><img src = images>"); //这里是放置照片的,注意:放照片的表示方式
pw.println("</body>");
pw.println("</html>");
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req, res);
}
}
然后是一个跳转页面,中间这个跳转页面其实我们看不到,因为是在后台帮我们用来处理的,也就是用来处理我们输入的内容后,需要重定向的页面,注意这里可以设置session和cookie,而且这两样东西都特别重要,可以帮助我们能够不用再次登录即可访问其他页面。
import javax.servlet.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class SearchCL extends HttpServlet
{
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
try
{
String u = req.getParameter("userid");
HttpSession hs = req.getSession(true); //创建session
//hs.setMaxInactiveInterval(20); //更改session的时间,以秒为单位
//hs.setAttribute("pass", "ok");
hs.setAttribute("Userid", u); //这里的session其实一种表格的形式
res.sendRedirect("wel"); //跳转的页面,在后面的wel页面中可以读取到这个session,然后就可以再次登录其他页面
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req, res);
}
}
这里有一个UserbeanCL的类,这个类的作用是用来将Userbean这个类来处理
public class UserbeanCL extends HttpServlet
{
private Connection ct = null;
private PreparedStatement ps = null;
private ResultSet rs = null;
private int pageCount = 0;
public ArrayList getResultByPage(int pageNow,int pageSize,int id)
{
int rowCount = 0; //共有几条记录
ArrayList al = new ArrayList();
try
{
ConnDB conndb = new ConnDB(); //连接数据库
ct = conndb.getConn(); //封装
//创建statement
ps = ct.prepareStatement("select * from CHECKINOUT where USERID = '" + id + "'"); //执行在数据库中一共有几条记录
rs = ps.executeQuery();
//System.out.println(rs);
while(rs.next())
{
//rowCount = rs.getInt("USERID");
rowCount = rowCount + 1; //得到在这个数据库中是某个id号的用户的个数
}
//System.out.println(rowCount);
if(rowCount % pageSize == 0) //这是用来分页用的,这里的pageSize表示的是一页想要有多少页面
pageCount = rowCount / pageSize;
else
pageCount = (rowCount / pageSize) + 1; //若不能取整数,则加1
//System.out.println(pageCount);
ps = ct.prepareStatement("select top " + pageSize + " * from CHECKINOUT where USERID = " + id + "and CHECKTIME not in (select top " + pageSize*(pageNow - 1) + " CHECKTIME from CHECKINOUT where USERID = " + id + ""+ ")"); //这个sql语句的作用是用来从数据库中读取出相关的内容
rs = ps.executeQuery();
int i = 0;
while(rs.next()) //这里是关键,这儿的用前面的数据库表格的形式定义一个Userbean类来放置取到的数据
{
//i = i + 1;
//System.out.println(i);
//将rs中的每一条记录封装到ArrayList中
Userbean ub = new Userbean();
ub.setUserId(rs.getInt(1)); //调用Userbean中的方法,然后就能够得到相关的数据
ub.setChecktime(rs.getString(2));
ub.setChecktype(rs.getString(3));
//ub.setEmail(rs.getString(4));
//ub.setGrade(rs.getInt(5));
al.add(ub); //将ub放入到ArrayList中 //这里用一个ArrayList来存储刚刚得到的一个Userbean类,注意这里的ArrayList中放置的是Userbean类。
}
/*Iterator it = al.iterator();
while(it.hasNext())
{
System.out.println(it.next().toString());
}*/
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
try
{
rs.close();
ps.close();
ct.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
return al;
}
public int getPageCount()
{
return this.pageCount;
}
}
后面就是一个wel的界面,这个是用来显示进入的页面
public class wel extends HttpServlet
{
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
res.setContentType("text/html;charset=gbk");
res.setCharacterEncoding("GBK");
Connection ct = null;
PreparedStatement ps = null;
ResultSet rs = null;
HttpSession hs = req.getSession(true); //设置session
String str = (String)hs.getAttribute("Userid"); //从session中取出名字,这个就是用来得到session的值,可以让用户下次不用输入密码等信息就可以直接调转到相应的界面
//String str = req.getParameter("Userid");
int id = Integer.parseInt(str);
try
{
int j = id;
PrintWriter pw = res.getWriter();
int pageSize = 10;//一页显示几条记录
int pageNow = 1;//希望显示第几页
String sPageNow = req.getParameter("pageNowok");
if(sPageNow != null)
{
pageNow = Integer.parseInt(sPageNow);
}
//调用userbean处理
UserbeanCL ubc = new UserbeanCL();
ArrayList all = ubc.getResultByPage(pageNow, pageSize,j);
pw.println("<body bgcolor=#CED3FF>");
pw.println("<hr><center>");
pw.println("<table border = 1>");
pw.println("<tr bgcolor=pink><th>userid</th><th>checktime</th><th>checktype</th></tr>");
String[] mycol = {"pink","silver"};
for(int i = 0; i < all.size(); i++)
{
//使得表中的行能够交替变化颜色,定义一个数组来表示
Userbean ub1 = (Userbean)all.get(i);
pw.println("<tr bgcolor=" + mycol[i%2] + ">"); //利用模运算在数组的下标中来实现
pw.println("<td>"+ ub1.getUserId()+"</td>");
pw.println("<td>"+ ub1.getChecktime()+"</td>");
pw.println("<td>"+ ub1.getChecktype()+"</td>");
//pw.println("<td><a href = Update?userId=" + ub.getUserId() + "&username=" + ub.getUsername() + "&passwd=" + ub.getPasswd() + "&email=" + ub.getEmail() + "&grade=" + ub.getGrade() + ">修改用户</td>");
//pw.println("<td><a href = DelUserCL?userId=" + ub.getUserId() + " οnclick=\"return window.confirm('确认删除')\">删除用户</a></td>");
//上面的onclick与之前的+有空格,注意:这个onclick是一个出发点击的事件
pw.println("</tr>");
}
/*while(rs.next())
{
Userbean ub = new Userbean(); //从Userbean中取出相应的内容
//pw.println("<tr bgcolor=" + mycol[i%2] + ">"); //利用模运算在数组的下标中来实现
pw.println("<td>"+ rs.getInt(1)+"</td>");
pw.println("<td>"+ rs.getString(2)+"</td>");
pw.println("<td>"+ rs.getString(3)+"</td>");
//pw.println("<td>"+ ub.getEmail()+"</td>");
//pw.println("<td>"+ ub.getGrade()+"</td>");
pw.println("</tr>");
}*/
pw.println("</table>");
int pageCount = ubc.getPageCount();
if(pageNow != 1)
{
pw.println("<a href=wel?pageNowok=1>首页</a>");
pw.println("<a href=wel?pageNowok=" + (pageNow - 1) + ">上一页</a>");
}
for(int i = pageNow; i <= pageNow + 4; i++) //用来分页用的
{
pw.println("<a href=wel?pageNowok=" + i + ">" + i + "</a>");
if(i == pageCount)
break;
}
if(pageNow != pageCount)
{
int page = pageCount - 1;
pw.println("<a href=wel?pageNowok=" + (pageNow + 1) + ">下一页</a>");
pw.println("<a href=wel?pageNowok=" + page + ">尾页</a>");
}
pw.println("<br>");
pw.println("<form action=wel method=get>"); //这里表示表单的提交方式,得注意表单的提交方式
pw.println("<input type=txt name=pageNowok>");
pw.println("<input type=submit value=go>");
pw.println("</form>");
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req, res);
}
}
基本这就是用servlet写的一个简单的用户查询系统,但是还需要改进。