MVC实现的DVD系统:
关联了两张表,一张user表,用于登录验证,username和password都满足方可登录成功,另一张DVD表,存储了dvd信息,其中DVD的编号为主键,不可重复。
登录界面:
账号和密码会去user表中验证。验证码利用ValidateCode.jar包生成,输入之后会去Codesevlet中去验证输入的验证码。
ValidateCode vc=new ValidateCode(100, 20, 5, 20);
String code = vc.getCode();
HttpSession session = request.getSession();
session.setAttribute("code", code);
System.out.println("生成的随机验证码是:"+code);
vc.write(response.getOutputStream());
可以勾选自动登录时间,之后会在LoginServlet中设置cookie的最大时长,并把用户名和密码保存在session中,可以实现下次的自动登录。(即使结束会话,即关闭浏览器或关机,但可以根据cookie实现自动登录。) 如果没有cookie,会自动跳到登录界面。
@WebFilter("/dvd")
public class AutoLoginFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
UserService service = new UserServiceImpl();
System.out.println("这里是拦截器");
HttpServletRequest req=(HttpServletRequest) request;
HttpServletResponse rep=(HttpServletResponse) response;
Cookie[] cookies = req.getCookies();
String autologin = null;
if (cookies == null) {
rep.sendRedirect("login.jsp");
} else {
for (Cookie c : cookies) {
if (c.getName().equals("autologin")) {
autologin = c.getValue();//找到对应的cookie
break;
}
}
if(autologin != null){
//做自动登陆
System.out.println("进入过滤器。");
String [] parts = autologin.split("-");
String username = parts[0];
String password = parts[1];
User u = service.getUser(username);
if (u == null) {
rep.sendRedirect("login.jsp");
} else if (password.equals(u.getPassword())) {
chain.doFilter(request, response);//放行
} else {
rep.sendRedirect("login.jsp");
}
} else {
rep.sendRedirect("login.jsp");
}
}
}
}
这里写了一个Filter:AutoLoginFilter,防止绕过登录以及实现自动登录。
这是登录之后的主界面,
这里实现了DVD的借阅归还,增删改查,以及分页和批量删除。
增加:增加时用jQuery和Ajax对输入的编号做了判断,不能使其重复。输入完毕,点击增加按钮,会发送请求action="dvd?action=add" method="post"到dvdServlet中,判断action调用相应的方法,去service层,再去dao层通过传入的DVD对象(新增的dvd)中执行
String sql = "INSERT INTO dvd_1(id,DVD_name,type,state) VALUES (?,?,?,0);";
state为dvd的状态,0代表着未借出。
删除:<a href="dvd?action=del&id=${d.id }">删除</a> 通过传入的id执行相应的sql语句。
修改:<a href="dvd?action=updataFind&id=${d.id }">修改</a> 会先通过id去查找id对应的dvd,然后把dvd信息显示在修改页面上,修改id编号时,一样会用jQuery和Ajax对输入的编号做判断。
查找:通过传入的name查找dvd并分页展示,开始的查找和通过name的查找执行的是用同一个方法,在sql语句中对相应的值做了判断;
sql语句:select * from dvd_1 where DVD_name like ? limit ?,?;
部分代码如下:
jsp:
<div id="search">
<form action="dvd" method="post">
姓名:<input type="text" name="name" value="${name }">
<input type="submit" value="查找">
</form>
</div>
dao层代码:
con = JDBCUtil.getCon();
String sql="select * from dvd_1 where DVD_name like ? limit ?,?;";
pre = con.prepareStatement(sql);
String name2 = (name == null ? "" : name);
pre.setString(1, "%"+name2+"%");
pre.setInt(2, ((pageIndex - 1) * pageSize));
pre.setInt(3, pageSize);
rs = pre.executeQuery();
while(rs.next()) {
String id = rs.getString("id");
String name1 = rs.getString("DVD_name");
String type = rs.getString("type");
int status = rs.getInt("state");
/**
* 获取时间类型的方法, 1.getTimestamp()获取年月日时分秒
* 2.getDate()只能获取年月日,时分秒会默认为00:00:00 3.注意获取的时间可能为null
*/
Timestamp timestamp = rs.getTimestamp("lend_time");
Timestamp timestamp2 = rs.getTimestamp("return_time");
java.util.Date lendTime = null;
java.util.Date returnTime = null;
if (timestamp == null) {
lendTime = null;
} else {
lendTime = new Date(timestamp.getTime());
}
if (timestamp2 == null) {
returnTime = null;
} else {
returnTime = new Date(timestamp2.getTime());
}
DVD d = new DVD(id, name1, type, status == 1 ? true:false, lendTime, returnTime);
list.add(d);
增加:
修改:
查找:
批量选择,全选按钮,选择所有,全选情况下,取消某一个子选项,全选框也变为不选中,没有点击全选的情况下,选中了所有子选项,全选框自动选中。
var delAll = function() {
//var allpro = document.getElementsByName("check"); //获取所有选择的
var checkedId = "";
for (var i = 0, len = allpro.length; i < len; i++) {
if (allpro[i].checked) {
checkedId += allpro[i].value + '-';
}
}
var flag = window.confirm("你确定要删除这条记录吗");
//alert(checkedId);
if(flag){
window.location.href = "dvd?action=delAll&ids="+checkedId;
}
}
借阅和归还:
<a href="dvd?action=lendDvd&id=${d.id }">借阅</a>|
<a href="dvd?action=returnDvd&id=${d.id }">归还</a>|
借阅和归还会在请求中包含id,首先会根据id去查找dvd的状态,判断是否可以借出,如果可以,则修改dvd的状态,并获取当前系统的时间,赋值给借阅时间或归还时间。
分页:详细见目录其他文章。