写再前面的话
1,本文为Java学习五部分第二部分所有项目回顾(前端练习系列-对应Java体系第二部分第三阶段内容)这些再前面的博客里没有。因为感觉把练习作业单独写出来会更好一些。
2,Java知识体系(第五部分第一阶段包括整体快递e站系列,数据库练习系列,程序创新大会报名表系列,Javaweb系列(用户登录,快递e站),SSM系列,微服务系列,实战系列,等)还是应该刚写完作业就写博客的。
3,Javaweb项目是我们学习过程中遇到的第一个比较完整的项目,是一个分水岭。本项目是Javaweb项目的前置项目。
目录标题
任务目的
业务上:实现学生管理模块中学员信息的增删改查
技能目标巩固 JAVAWEB,MYSQL前端,JAVASE 的知识体系
任务需求
通过一个上线项目中提取出的一个模块,让大家熟悉项目开发过程中的开发流
程以及代码结构
过程简单描述:
1.熟悉项目需求和项目结构
2.根据需求创建数据库
3. 实现用户的登录与退出
4. 实现学生信息的增删改查
5. 功能完善: 1. 学号的非重复性验证 2.用户权限判断,非登录情况下不允许访问用户操作
具体思路及整体代码实现
大体思路:(抄的资料)
1.分析静态页面,根据html或需求创建数据库
2.填写测试数据
3.创建项目,包结构(bean,dao.impl,servlet,service.impl,util),修改html页面为jsp
html->jsp
(1)在HTML中添加page指令
(2) 将html的后缀改成jsp
4.填写内容(注意填写顺序)
bean:属性,封装方法,无参构造,全参构造 表名=类名 ,列名=属性名
dao包:操作方法的接口,命名:实体类名+Dao,
Dbutils(属性文件,*.properties)
impl包:命名: 接口名+Impl
实现接口,继承Dbutils
service.impl
service定义的是接口,接口中的方法和dao层接口中的方法一致
impl : 这层的实现类主要负责调取dao层方法
servlet:
//1.接受参数
//2.调取service层的方法,service又在调取dao层的方法
//3.根据结果跳转页面
核心:jsp页面负责发送请求和展示数据
代码实现:
真的应该写完项目就写博客,现在忘了。
前端页面创建
根据需求新建html页面,后面网盘给定资料都是Html类型的,这是不对的,我画线的要改成jsp类型才能使用。
数据库分析
看一下我们要实现的模块:
可以很明显的看出,我们需要创建一个学生信息表,一个年级信息表。总要有人操作学生信息对吧,那再创建用户信息表。资料给的表格设计文件。
我具体写的数据表
年级表
学生表
用户表
然后按照第三步,把代码结构简单创建一下。
bean层
根据所创建的sql创建对应的类,类名=表名,属性名=列名。数据库都创建好了,那这里没有什么好说的。
1.定义属性。
2.用setter和getter设置和获取值。
3.如果为了测试方便,记得生成toString方法。
4无参和全参构造方法没有用到,可以不用写
Grade
package com.yhp.bean;
import java.util.List;
//表名=类名 列名=属性名
public class Grade {
private Integer gradeId;
@Override
public String toString() {
return "Grade{" +
"gradeId=" + gradeId +
", gradeName='" + gradeName + '\'' +
", studentList=" + studentList +
'}';
}
private String gradeName;
private List<Student> studentList;
public Integer getGradeId() {
return gradeId;
}
public void setGradeId(Integer gradeId) {
this.gradeId = gradeId;
}
public String getGradeName() {
return gradeName;
}
public void setGradeName(String gradeName) {
this.gradeName = gradeName;
}
public List<Student> getStudentList() {
return studentList;
}
public void setStudentList(List<Student> studentList) {
this.studentList = studentList;
}
}
Student
package com.yhp.bean;
import java.util.Date;
public class Student {
private Integer stuId;
private String stuName;
private String stuNo;
private Integer sex;
private String phone;
private String email;
private String registered;
private String address;
private String profession;
@Override
public String toString() {
return "Student{" +
"stuId=" + stuId +
", stuName='" + stuName + '\'' +
", stuNo='" + stuNo + '\'' +
", sex=" + sex +
", phone='" + phone + '\'' +
", email='" + email + '\'' +
", registered='" + registered + '\'' +
", address='" + address + '\'' +
", profession='" + profession + '\'' +
", idNumber='" + idNumber + '\'' +
", politics='" + politics + '\'' +
", regDate=" + regDate +
", state=" + state +
", introdction='" + introdction + '\'' +
", gid=" + gid +
", grade=" + grade +
'}';
}
private String idNumber;
private String politics;
private Date regDate;
private Integer state;
private String introdction;
private Integer gid;
private Grade grade;
public Integer getStuId() {
return stuId;
}
public void setStuId(Integer stuId) {
this.stuId = stuId;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public String getStuNo() {
return stuNo;
}
public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getRegistered() {
return registered;
}
public void setRegistered(String registered) {
this.registered = registered;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getProfession() {
return profession;
}
public void setProfession(String profession) {
this.profession = profession;
}
public String getIdNumber() {
return idNumber;
}
public void setIdNumber(String idNumber) {
this.idNumber = idNumber;
}
public String getPolitics() {
return politics;
}
public void setPolitics(String politics) {
this.politics = politics;
}
public Date getRegDate() {
return regDate;
}
public void setRegDate(Date regDate) {
this.regDate = regDate;
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public String getIntrodction() {
return introdction;
}
public void setIntrodction(String introdction) {
this.introdction = introdction;
}
public Integer getGid() {
return gid;
}
public void setGid(Integer gid) {
this.gid = gid;
}
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
}
Users
package com.yhp.bean;
/**
* 用户表
*/
public class Users {
private Integer userId;
private String loginName;
private String passWord;
private String realName;
private Integer sex;
private String email;
private String address;
private String phone;
private String cardId;
private String desc;
// 角色id
private Integer roleId;
// 一个用户对应一个角色
private Role role;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Users{" +
"userId=" + userId +
", loginName='" + loginName + '\'' +
", passWord='" + passWord + '\'' +
", realName='" + realName + '\'' +
", sex=" + sex +
", email='" + email + '\'' +
", address='" + address + '\'' +
", phone='" + phone + '\'' +
", cardId='" + cardId + '\'' +
", desc='" + desc + '\'' +
", roleId=" + roleId +
", role=" + role +
'}';
}
public void setDesc(String desc) {
this.desc = desc;
}
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
}
工具类
创建一个utils包,新建类DBUtils,新建配置文件db.properties
properties配置文件
使用ResourceBundle访问本地资源,从里面读取我们需要的值
url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC
username=cms
password=cms
driverClassName=com.mysql.cj.jdbc.Driver
DBUtils.java
1.定义变量
private Connection connection;
public PreparedStatement pps;
protected ResultSet resultSet;
private int count;//存储收影响的行数
private static String userName;
private static String userPass;
private static String url;
private static String dirverName;
//德鲁伊
private static DruidDataSource dataSource=new DruidDataSource();
2.加载驱动
static {
//德鲁伊
ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
dirverName = bundle.getString("driverClassName");
url = bundle.getString("url");
userName = bundle.getString("username");
userPass = bundle.getString("password");
dataSource.setUsername(userName);
dataSource.setPassword(userPass);
dataSource.setUrl(url);
dataSource.setDriverClassName(dirverName);
// dataSource.setInitialSize(20);
}
3.获得连接
protected Connection getConnection(){
try {
connection=dataSource.getConnection();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return connection;
}
4.获得预状态通道
protected PreparedStatement getPps(String sql){
try {
// Statement.RETURN_GENERATED_KEYS 我要获得新增数据的id值
pps= getConnection().prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return pps;
}
5.绑定参数 LIST保存的是给占位符所赋的值
protected void param(List list){
if(list!=null&&list.size()>0){
for (int i=0;i<list.size();i++) {
try {
pps.setObject(i+1,list.get(i));
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
6.执行操作(增删改+查)
protected int update(String sql,List list){
getPps(sql);
param(list);
try {
count= pps.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return count;
}
7.查询
protected ResultSet query(String sql,List list){
getPps(sql);
param(list);
try {
resultSet= pps.executeQuery();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return resultSet;
}
8.关闭资源
protected void closeAll(){
try {
if (connection != null) {
connection.close();
}
if (pps != null) {
pps.close();
}
if (resultSet != null) {
resultSet.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
dao与service层定义
以学生类举例,年级类和用户类同理。
service
抽象类
public interface StudentService {
}
实现类
public class StudentServiceImpl implements StudentService {
}
dao
抽象类
public interface StudentDao {
}
实现类,dao层实现类是直接操作数据库的部分需要继承工具类
public class StudentDaoImpl extends DBUtils implements StudentDao {
}
至此,大体框架算是搭建完毕了。然后我们该根据具体的功能来跑代码了。
具体功能及详细代码实现
先放一个整体的流程图
登录功能
这个没什么难度,之前写过四次了。这次换一种表达方式吧
参考链接:看第五部分-用户登录
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>用户登录</title>
<link href="css/login.css" type="text/css" rel="stylesheet" />
</head>
<body id="userlogin_body">
post方式提交,跳转到login路径,记得复制的时候加注解
<form action="login" method="post">
<div id="user_login">
<dl>
<dd id="user_top">
<ul>
<li class="user_top_l"></li>