本系统使用的是基于JSP+SERVLET+TOMCAT6
数据库使用的是MYSQL
IDE是MYECLIPSE8.5,页面编辑使用的是百度的ueditor,比较适合咱国人
采用MVC模式,使用的关键技术,通用的分页技术,一些项目开发的小技巧,如批量删除,,,本文章适合刚学习JSP+SERVLET,但没有实战经验的童鞋。欢迎交流学习。
1,第一个模块是登陆处理。
关键代码如下:
<form action="${pageContext.request.contextPath }/user?method=login" onsubmit="return submitCheck();" method="post" id="loginForm"> <fieldset> <legend>用户登录</legend> 用户名:<input type="text" id="userName" name="userName" /><br /> <br/> 密 码:<input type="password" id="password" name="password" /><br /> <input type="submit" value="登录" /> <br /> <span id="msg" style="color: red">${msg}</span> </fieldset> </form>
<span id="msg" style="color: red">${msg}</span>该句代码用于反馈后台的校验信息,如用户名与密码不匹配等。
接受参数使用的是一个小工具类
User user = (User) CopyPropertyUtil.copyPropertiesFromRequest(request,
User.class);
该方法会自动的把接受到的FORM表单的值赋值到User类中,可以节省很多重复性的代码。
SERVLET的关键代码如下:
if ("login".equals(method)) { user = userService.checkUser(user); if (StringUtils.isNotBlank(user.getUserName())) { HttpSession session = request.getSession(); session.setAttribute("user", user); request.getRequestDispatcher("index.html").forward(request, response); } else { request.setAttribute("msg", "用户名或密码错误"); request.getRequestDispatcher("index.jsp").forward(request, response); } }
request.setAttribute("msg", "用户名或密码错误");用于反馈错误信息到登陆页面。
2,登陆成功则是菜单栏,由于时间有限,没有做菜单的动态生成。
在LEFT.JSP中,查询的链接统一用user?method=query method的query ,在该方法中写了通用的分页,并且是加上查询结果的分页。
if ("query".equals(method)) { queryAll(request, response, user); }
public void queryAll(HttpServletRequest request, HttpServletResponse response, User user) throws ServletException, IOException { int currPage; try { currPage = Integer.valueOf(request.getParameter("currPage")); } catch (Exception e) { currPage = 1; } Page page = new Page(); List<User> list = userService.findAll(user); page.setTotalPage(list.size()); page.toPage(currPage); list = userService.findAll(user, page); request.setAttribute("user", user); request.setAttribute("page", page); request.setAttribute("userList", list); request.getRequestDispatcher("/user/userList.jsp").forward(request, response); }
request.setAttribute("page", page); 该对象用于保存分页的信息.
List<User> list = userService.findAll(user); 该方法是查询出需要显示的集合数据。
DAO代码如下:
public List findAll(User user){ Connection conn = DBUtil.getConnection(); ArrayList list= new ArrayList(); StringBuilder sb = new StringBuilder(); sb.append("select * from user where 1 = 1 "); if(StringUtils.isNotBlank(user.getUserName())){ sb.append(" and userName like '%"+user.getUserName()+"%'"); }if(StringUtils.isNotBlank(user.getRole())){ sb.append(" and role like '%"+user.getRole()+"%'"); } ResultSet rs = DBUtil.querySQL(sb.toString(), null,conn); try{ while(rs.next()){ User temp = new User(); temp.setUserId(rs.getInt(1)); temp.setUserName(rs.getString(2)); temp.setPassword(rs.getString(3)); temp.setRole(rs.getString(4)); list.add(temp); } }catch(Exception e){ e.printStackTrace(); }finally{ DBUtil.closeAll(rs, null, conn); } return list; }
接下来将重点讲解基于查询结果的分页技术。
由于查询条件的是通过FORM提交,但是在点击“下一页”的时候仍需保存之前的查询条件,可采用如下方式解决。
<a href="${pageContext.request.contextPath}/user?currPage=${page.currPage+1 }&method=queryPage&userName=${user.userName}&role=${user.role}">下一页</a>
将查询条件放在链接中,这样就能一直保存查询的条件,查询出正确的结果。
但是由于通过表单提交跟链接的解码方式不一样,因此需另外处理。
解码如下:
if ("queryPage".equals(method)) { String userName = null, role = null; // 当查询条件是通过链接的时候,由于是中文,所以需要进行解码 if (StringUtils.isNotBlank(request.getParameter("userName"))) userName = new String(request.getParameter("userName") .getBytes("ISO-8859-1"), "UTF-8"); if (StringUtils.isNotBlank(request.getParameter("role"))) role = new String(request.getParameter("role").getBytes( "ISO-8859-1"), "UTF-8"); user.setUserName(userName); user.setRole(role); queryAll(request, response, user); }
这样就能完美解决基于查询结果的分页了。
3‘SELECT动态获取数据
角色中的数据是动态加载的,可使用如下语句获得:
<select name="role" id=""role"" style="width: 100"> <option value="">请选择</option> <% Role role = new Role(); RoleService roleService = new RoleService(); List<Role> roleList = roleService.findAll(role); if(roleList!=null&&roleList.size()>0){ for(int i=0;i<roleList.size();i++){ role=roleList.get(i);%> <option value="<%=role.getRoleId() %>"> <%=role.getRoleName() %> </option> <%} }%> </select>
4,删除使用的是批量删除,其实批量删除很简单,如果说难的话就是JS不会用,
我们可以通过CHECKBOX获取所有选中的ID,然后拼接成字符串,提交到后台,可拼接成1,2,3,5
后台可以使用如下方法去拆分
String str = request.getParameter("str"); str = str.substring(0, str.length() - 1); String box[] = str.split(","); for (String temp : box) { int userId = Integer.valueOf(temp); user.setUserId(userId); userService.delUser(user); }
先上传这么多,晚点更新其他模块。