工具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>