工具eclipse
主要操作登陆,增删查改
编写实体类
public class Student { private int id; private String sId;//学号 private String name; private String password; private int classId;//班级号 private String sex; private String mobile; private String qq; private InputStream photo;//头像 //get set }
Dao
介于业务逻辑层和数据库之间,进行数据的访问和操作。
util包
DbUtil(下面dao需要用到)
private String dbUrl= "jdbc:mysql://localhost:3306/student_manager?useUnicode=true&characterEncoding=utf8"; private String jdbcName="com.mysql.jdbc.Driver"; private String dbUser="用户名"; private String dbPassword="密码"; private Connection connection = null; public Connection getConnection() { try { Class.forName(jdbcName); connection=DriverManager.getConnection(dbUrl, dbUser, dbPassword); System.out.println("数据库连接成功!!"); } catch(Exception e) { System.out.println("数据库连接失败!!!"); e.printStackTrace();//在命令行打印异常信息在程序中出错的位置及原因。 } return connection; } public void closeCon() { if(connection !=null) { try { connection.close(); System.out.println("数据库连接已经关闭!!!"); }catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[] args) { DbUtil dbUtil = new DbUtil(); dbUtil.getConnection(); }
CpachaUtil(下面验证码需要用到)
package com.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.util.Random; /** * 验证码生成器 */ public class CpachaUtil { /** * 验证码来源 */ final private char[] code = { '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; /** * 字体 */ final private String[] fontNames = new String[]{ "黑体", "宋体", "Courier", "Arial", "Verdana", "Times", "Tahoma", "Georgia"}; /** * 字体样式 */ final private int[] fontStyles = new int[]{ Font.BOLD, Font.ITALIC|Font.BOLD }; /** * 验证码长度 * 默认4个字符 */ private int vcodeLen = 4; /** * 验证码图片字体大小 * 默认17 */ private int fontsize = 21; /** * 验证码图片宽度 */ private int width = (fontsize+1)*vcodeLen+10; /** * 验证码图片高度 */ private int height = fontsize+12; /** * 干扰线条数 * 默认3条 */ private int disturbline = 3; public CpachaUtil(){} /** * 指定验证码长度 * @param vcodeLen 验证码长度 */ public CpachaUtil(int vcodeLen) { this.vcodeLen = vcodeLen; this.width = (fontsize+1)*vcodeLen+10; } /** * 生成验证码图片 * @param vcode 要画的验证码 * @param drawline 是否画干扰线 * @return */ public BufferedImage generatorVCodeImage(String vcode, boolean drawline){ //创建验证码图片 BufferedImage vcodeImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = vcodeImage.getGraphics(); //填充背景色 g.setColor(new Color(246, 240, 250)); g.fillRect(0, 0, width, height); if(drawline){ drawDisturbLine(g); } //用于生成伪随机数 Random ran = new Random(); //在图片上画验证码 for(int i = 0;i < vcode.length();i++){ //设置字体 g.setFont(new Font(fontNames[ran.nextInt(fontNames.length)], fontStyles[ran.nextInt(fontStyles.length)], fontsize)); //随机生成颜色 g.setColor(getRandomColor()); //画验证码 g.drawString(vcode.charAt(i)+"", i*fontsize+10, fontsize+5); } //释放此图形的上下文以及它使用的所有系统资源 g.dispose(); return vcodeImage; } /** * 获得旋转字体的验证码图片 * @param vcode * @param drawline 是否画干扰线 * @return */ public BufferedImage generatorRotateVCodeImage(String vcode, boolean drawline){ //创建验证码图片 BufferedImage rotateVcodeImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = rotateVcodeImage.createGraphics(); //填充背景色 g2d.setColor(new Color(246, 240, 250)); g2d.fillRect(0, 0, width, height); if(drawline){ drawDisturbLine(g2d); } //在图片上画验证码 for(int i = 0;i < vcode.length();i++){ BufferedImage rotateImage = getRotateImage(vcode.charAt(i)); g2d.drawImage(rotateImage, null, (int) (this.height * 0.7) * i, 0); } g2d.dispose(); return rotateVcodeImage; } /** * 生成验证码 * @return 验证码 */ public String generatorVCode(){ int len = code.length; Random ran = new Random(); StringBuffer sb = new StringBuffer(); for(int i = 0;i < vcodeLen;i++){ int index = ran.nextInt(len); sb.append(code[index]); } return sb.toString(); } /** * 为验证码图片画一些干扰线 * @param g */ private void drawDisturbLine(Graphics g){ Random ran = new Random(); for(int i = 0;i < disturbline;i++){ int x1 = ran.nextInt(width); int y1 = ran.nextInt(height); int x2 = ran.nextInt(width); int y2 = ran.nextInt(height); g.setColor(getRandomColor()); //画干扰线 g.drawLine(x1, y1, x2, y2); } } /** * 获取一张旋转的图片 * @param c 要画的字符 * @return */ private BufferedImage getRotateImage(char c){ BufferedImage rotateImage = new BufferedImage(height, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = rotateImage.createGraphics(); //设置透明度为0 g2d.setColor(new Color(255, 255, 255, 0)); g2d.fillRect(0, 0, height, height); Random ran = new Random(); g2d.setFont(new Font(fontNames[ran.nextInt(fontNames.length)], fontStyles[ran.nextInt(fontStyles.length)], fontsize)); g2d.setColor(getRandomColor()); double theta = getTheta(); //旋转图片 g2d.rotate(theta, height/2, height/2); g2d.drawString(Character.toString(c), (height-fontsize)/2, fontsize+5); g2d.dispose(); return rotateImage; } /** * @return 返回一个随机颜色 */ private Color getRandomColor(){ Random ran = new Random(); return new Color(ran.nextInt(220), ran.nextInt(220), ran.nextInt(220)); } /** * @return 角度 */ private double getTheta(){ return ((int) (Math.random()*1000) % 2 == 0 ? -1 : 1)*Math.random(); } /** * @return 验证码字符个数 */ public int getVcodeLen() { return vcodeLen; } /** * 设置验证码字符个数 * @param vcodeLen */ public void setVcodeLen(int vcodeLen) { this.width = (fontsize+3)*vcodeLen+10; this.vcodeLen = vcodeLen; } /** * @return 字体大小 */ public int getFontsize() { return fontsize; } /** * 设置字体大小 * @param fontsize */ public void setFontsize(int fontsize) { this.width = (fontsize+3)*vcodeLen+10; this.height = fontsize+15; this.fontsize = fontsize; } /** * @return 图片宽度 */ public int getWidth() { return width; } /** * 设置图片宽度 * @param width */ public void setWidth(int width) { this.width = width; } /** * @return 图片高度 */ public int getHeight() { return height; } /** * 设置图片高度 * @param height */ public void setHeight(int height) { this.height = height; } /** * @return 干扰线条数 */ public int getDisturbline() { return disturbline; } /** * 设置干扰线条数 * @param disturbline */ public void setDisturbline(int disturbline) { this.disturbline = disturbline; } }
基础dao
package com.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.util.DbUtil; /** * * @author love yourself * 基础dao封装基本操作 */ public class BaseDao { private DbUtil dbUtil = new DbUtil(); /** * 关闭数据库连接,释放资源 */ public void closeCon() { dbUtil.closeCon();//DbUtil里面已经写好方法了 } /** * 基础查询,多条查询 */ //java.sql.ResultSet接口表示一个数据库查询的结果集 public ResultSet query(String sql) { try { //Statement是将完整的需要执行的SQL语句通过执行平台传输过去 PreparedStatement prepareStatement =dbUtil.getConnection().prepareStatement(sql); return prepareStatement.executeQuery();//executeQuery方法被用来执行 SELECT 语句 } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace();//输出错误信息 } return null; } /** * 改变数据库内容操作 */ public boolean update(String sql) { try { return dbUtil.getConnection().prepareStatement(sql).executeUpdate() > 0; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return false; } /** * 获取数据库连接 */ public Connection getConnection(){ return dbUtil.getConnection(); } }
StudentDao
package com.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import com.entity.Student; import com.entity.Page; import com.util.StringUtil; //这里要继承我们之前写基础类 public class StudentDao extends BaseDao { /** * 添加一个学生 */ public boolean addStudent(Student student) { String sql="insert into student values(null,'"+student.getsId()+"','"+student.getName()+"'"; sql += ",'" + student.getPassword() + "'," + student.getClassId(); sql += ",'" + student.getSex() + "','" + student.getMobile() + "'"; sql += ",'" + student.getQq() + "',null)"; return update(sql); } /** * 删除一个学生 */ public boolean deleteStudent(String id) { String sql="delete form student where id in("+id+")"; return update(sql); } /** * 更改密码 */ public boolean editPassword(Student student,String newPassword) { String sql = "update student set password = '"+newPassword+"' where id = " + student.getId(); return update(sql); } /** * 头像 */ public boolean setStudentPhoto(Student student) { String sql = "update student set photo = ? where id = ?"; Connection connection = getConnection(); try { PreparedStatement prepareStatement = connection.prepareStatement(sql); prepareStatement.setBinaryStream(1, student.getPhoto()); prepareStatement.setInt(2, student.getId()); return prepareStatement.executeUpdate() > 0; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return update(sql); } /** * 学生对象 */ public Student getStudent(int id){ String sql = "select * from student where id = " + id; Student student = null; ResultSet resultSet = query(sql); try { if(resultSet.next()){ student = new Student(); student.setId(resultSet.getInt("id")); student.setClassId(resultSet.getInt("class_id")); student.setMobile(resultSet.getString("mobile")); student.setName(resultSet.getString("name")); student.setPassword(resultSet.getString("password")); student.setPhoto(resultSet.getBinaryStream("photo")); student.setQq(resultSet.getString("qq")); student.setSex(resultSet.getString("sex")); student.setsId(resultSet.getString("sid")); return student; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return student; } /** * 学生列表 */ public List<Student> getStudentList(Student student,Page page){ List<Student> ret = new ArrayList<Student>(); String sql = "select * from student "; if(!StringUtil.isEmpty(student.getName())){ sql += "and name like '%" + student.getName() + "%'"; } if(student.getClassId() != 0){ sql += " and class_id = " + student.getClassId(); } if(student.getId() != 0){ sql += " and id = " + student.getId(); } sql += " limit " + page.getStart() + "," + page.getPageSize(); ResultSet resultSet = query(sql.replaceFirst("and", "where")); try { while(resultSet.next()){ Student s = new Student(); s.setId(resultSet.getInt("id")); s.setClassId(resultSet.getInt("class_id")); s.setMobile(resultSet.getString("mobile")); s.setName(resultSet.getString("name")); s.setPassword(resultSet.getString("password")); s.setPhoto(resultSet.getBinaryStream("photo")); s.setQq(resultSet.getString("qq")); s.setSex(resultSet.getString("sex")); s.setsId(resultSet.getString("sid")); ret.add(s); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ret; } /** * 学生数量 */ public int getStudentListTotal(Student student){ int total = 0; String sql = "select count(*)as total from student "; if(!StringUtil.isEmpty(student.getName())){ sql += "and name like '%" + student.getName() + "%'"; } if(student.getClassId() != 0){ sql += " and class_id = " + student.getClassId(); } if(student.getId() != 0){ sql += " and id = " + student.getId(); } ResultSet resultSet = query(sql.replaceFirst("and", "where")); try { while(resultSet.next()){ total = resultSet.getInt("total"); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return total; } /** * 登录 */ public Student login(String name ,String password){ String sql = "select * from student where name = '" + name + "' and password = '" + password + "'"; ResultSet resultSet = query(sql); try { if(resultSet.next()){ Student student = new Student(); student.setId(resultSet.getInt("id")); student.setName(resultSet.getString("name")); student.setPassword(resultSet.getString("password")); student.setClassId(resultSet.getInt("class_id")); student.setMobile(resultSet.getString("mobile")); student.setPhoto(resultSet.getBinaryStream("photo")); student.setQq(resultSet.getString("qq")); student.setSex(resultSet.getString("sex")); student.setsId(resultSet.getString("sid")); return student; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }
servlet
LoginServlet
package com.servlet; import java.io.IOException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.dao.StudentDao; import com.entity.Student; import com.util.StringUtil; /** * 登录 * @author love yourself * */ public class LoginServlet extends HttpServlet { private static final long serialVersionUID = -5870852067427524781L; /** * Get */ public void doGet(HttpServletRequest request,HttpServletResponse response)throws IOException{ doPost(request, response); } /** * Post */ public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException{ String mehod=request.getParameter("method");//选择的角色 if("logout".equals(mehod)) { logout(request,response); return; } String vcode=request.getParameter("vcode");//验证码 String name=request.getParameter("account");//账户 String password=request.getParameter("password"); int type=Integer.parseInt(request.getParameter("type"));//账户类型 整型数据Integer转换为基本数据类型int String loginCache=request.getSession().getAttribute("loginCache").toString();//Session缓存 //判断验证码为空 if(StringUtil.isEmpty(vcode)) { response.getWriter().write("vcodeError"); return; } //判断验证码大写的是否相等 if(!vcode.toUpperCase().equals(loginCache.toUpperCase())){ response.getWriter().write("vcodeError"); return; } //验证码通过,判断用户名密码 String loginStatus="loginFaild";//登陆状态(用户类型) switch(type) { //这里还有 1 2是管理员和老师后面再写 case 2:{ StudentDao studentDao=new StudentDao(); Student student=studentDao.login(name, password); studentDao.closeCon();//关闭数据库连接释放资源 if(student == null) { response.getWriter().write("loginError"); return; } HttpSession session=request.getSession(); session.setAttribute("user",student); session.setAttribute("userType", type); loginStatus="loginSuccess"; break; } default: break; } response.getWriter().write(loginStatus); } /** * 退出 */ private void logout(HttpServletRequest request,HttpServletResponse response) throws IOException{ request.getSession().removeAttribute("user"); request.getSession().removeAttribute("userType"); response.sendRedirect("index.jsp");//返回到主界面也就是登陆界面 } }
验证码servlet
package com.servlet; import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.ImageIO; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.util.CpachaUtil; /** * *验证码servlet */ public class CpachaServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 4919529414762301338L; public void doGet(HttpServletRequest request,HttpServletResponse reponse) throws IOException{ doPost(request, reponse); } public void doPost(HttpServletRequest request,HttpServletResponse reponse) throws IOException{ String method = request.getParameter("method"); if("loginCapcha".equals(method)){ generateLoginCpacha(request, reponse); return; } reponse.getWriter().write("error method"); } private void generateLoginCpacha(HttpServletRequest request,HttpServletResponse reponse) throws IOException{ CpachaUtil cpachaUtil = new CpachaUtil(); String generatorVCode = cpachaUtil.generatorVCode(); request.getSession().setAttribute("loginCapcha", generatorVCode); BufferedImage generatorRotateVCodeImage = cpachaUtil.generatorRotateVCodeImage(generatorVCode, true); ImageIO.write(generatorRotateVCodeImage, "gif", reponse.getOutputStream()); } }
SystemServlet
package com.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.dao.StudentDao; import com.entity.Student; //记着要写继承类 不然报错 java.lang.ClassCastException: com.servlet.SystemServlet cannot be cast to javax.servlet.Servlet public class SystemServlet extends HttpServlet { private static final long serialVersionUID = -7258264317769166483L; public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{ doPost(request, response); } public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException{ String method = request.getParameter("method"); if("toPersonalView".equals(method)){ personalView(request,response); return; }else if("EditPasswod".equals(method)){ editPassword(request,response); return; } try { request.getRequestDispatcher("view/system.jsp").forward(request, response); } catch (ServletException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
界面
登录 login.jsp
<script type="text/javascript"> $(function(){ //点击图片切换验证码 $("#vcodeImg").click(function(){ this.src="CpachaServlet?method=loginCapcha&t="+new Date().getTime(); }); //登录 $("#submitBtn").click(function(){ var data = $("#form").serialize(); $.ajax({ type: "post", url: "LoginServlet?method=Login", data: data, dataType: "text", //返回数据类型 success: function(msg){ if("vcodeError" == msg){ $.messager.alert("消息提醒", "验证码错误!", "warning"); $("#vcodeImg").click();//切换验证码 $("input[name='vcode']").val("");//清空验证码输入框 } else if("loginError" == msg){ $.messager.alert("消息提醒", "用户名或密码错误!", "warning"); $("#vcodeImg").click();//切换验证码 e } else if("loginSuccess" == msg){ window.location.href = "SystemServlet?method=toAdminView"; } else{ alert(msg); } } }); }); //设置复选框 $(".skin-minimal input").iCheck({ radioClass: 'iradio-blue', increaseArea: '25%' }); }) </script> <title>登录|学生信息管理系统</title> <meta name="keywords" content="学生信息管理系统"> </head> <body> <div class="header" style="padding: 0;"> <h2 style="color: white; width: 400px; height: 60px; line-height: 60px; margin: 0 auto; padding: 0;">学生信息管理系统</h2> </div> <div class="loginWraper"> <div id="loginform" class="loginBox"> <form id="form" class="form form-horizontal" method="post"> <div class="row cl"> <label class="form-label col-3"><i class="Hui-iconfont"></i></label> <div class="formControls col-8"> <input id="" name="account" type="text" placeholder="账户" class="input-text size-L"> </div> </div> <div class="row cl"> <label class="form-label col-3"><i class="Hui-iconfont"></i></label> <div class="formControls col-8"> <input id="" name="password" type="password" placeholder="密码" class="input-text size-L"> </div> </div> <div class="row cl"> <div class="formControls col-8 col-offset-3"> <input class="input-text size-L" name="vcode" type="text" placeholder="请输入验证码" style="width: 200px;"> <img title="点击图片切换验证码" id="vcodeImg" src="CpachaServlet?method=loginCapcha"></div> </div> <div class="mt-20 skin-minimal" style="text-align: center;"> <div class="radio-box"> <input type="radio" id="radio-2" name="type" checked value="2" /> <label for="radio-1">学生</label> </div> <div class="radio-box"> <input type="radio" id="radio-3" name="type" value="3" /> <label for="radio-2">老师</label> </div> <div class="radio-box"> <input type="radio" id="radio-1" name="type" value="1" /> <label for="radio-3">管理员</label> </div> </div> <div class="row"> <div class="formControls col-8 col-offset-3"> <input id="submitBtn" type="button" class="btn btn-success radius size-L" value=" 登 录 "> </div> </div> </form> </div> </div>