题目:
模块编程题
使用前端、数据库、JavaWeb 等技术并采用 MVC 设计模式,基于三层架构实现学生信息管理系统
其中学生信息有:学号、姓名、性别、出生日期
要求:
a. 完成用户登陆功能 (判断用户输入的用户名密码和数据库存储的用户名密码是否相同)当登陆成功 跳转到首页显示登陆成功(页面、数据库表自行设计实现)
b.完成用户添加功能(首先跳转到添加页面,将页面表单中填写的内容保存到数据库中)
c.使用过滤器对添加用户的请求进行拦截,判断是否是未登录状态
未登录:跳转到登陆页面
已登陆:放行到目标资源,完成添加操作
提示:用户登陆时,将用户信息存到session中,过滤器中判断session中有没有用户信息
效果演示:
这里是一个最基本的实现过程代码,还有很多可以改进的地方,比如在新增用户时可以使用ajax做重复名称判断,使用ajax自动获取学号等等;
未解决问题:
该代码不能插入中文名称,否则写入数据库中是乱码,我这边试过使用Filter的方式去设置编码格式为UTF-8,核心代码如下:
设置监听所有路径之后,是可以插入中文了,但是前端页面显示乱码,如下图:
暂没找到原因,所以我把全局设置uft8的filter代码去掉了。
网上试了这个方法,问题暂时解决了。
https://www.jb51.net/article/196465.htm
解题过程:
mysql建表语句
CREATE DATABASE info CHARACTER SET utf8;
CREATE TABLE stuInfo (
stuNum INT PRIMARY KEY,
stuName VARCHAR (10) NOT NULL,
stuPassword VARCHAR (20) NOT NULL,
stuGender CHAR (1) NOT NULL,
stuBirthday VARCHAR (10) NOT NULL
)
在IDEA中新建web项目并导入所需jar包,我这边是将所有需要的jar包配置文件及外部资源都放到了一起,其中包括jdbc驱动jar包,druid连接池jar包及配置文件,jquery文件
我这边的目录及文件如下(可能不太规范);
具体代码及说明:
前端代码:
index.html,默认首页,用户登录界面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学生管理系统</title>
<script src="jquery-3.5.1.js"></script>
</head>
<body>
<h2>学生管理系统登录:</h2>
<form action=/student/loginServlet method="post">
<p>帐号:<input name="sname" type="text" placeholder="请输入帐号...最大长度为10" maxlength="10" ></p>
<p>密码:<input name="spassword" type="password" placeholder="请输入密码...最大长度为20" maxlength="20" ></p>
<p>
<input type="submit" value="登录">
</p>
</form>
</body>
</html>
middle.html,用户登录成功后进入的页面,里面可以新增用户
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>系统主页</title>
<script src="jquery-3.5.1.js"></script>
</head>
<script>
function regStu() {
location.href="reg.html"
}
</script>
<body>
<h2>登录成功,欢迎光临~</h2>
<!--点击注册按钮,跳转到注册页面-->
<input type="button" value="新增用户" onclick="regStu()" >
</body>
</html>
reg.html,新增用户界面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
<h2>账号注册页面:</h2>
<form action="/student/addStuServlet" method="post">
<p>学号:<input name="snum" type="text" placeholder="例如1001..."></p>
<p>帐号:<input name="sname" type="text" placeholder="请输入帐号...最大长度为10" maxlength="10" ></p>
<p>密码:<input name="spassword" type="password" placeholder="请输入密码...最大长度为20" maxlength="20" ></p>
<p>性别:
<input type="radio" name="sex" checked="checked" value="M"> 男
<input type="radio" name="sex" value="F"> 女
</p>
<p>生日:<input name="sbirthday" type="text" placeholder="格式:2021-03-31" maxlength="10" ></p>
<p>
<input type="reset" value="清空">
<input type="submit" value="提交">
</p>
</form>
</body>
</html>
后端代码:
DruidUtils.java, 数据库连接池工具类,固定写法
package com.lagou.util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.util.Properties;
/**
* druid连接池工具类,固定写法
*/
public class DruidUtils {
public static DataSource dataSource;
static {
// 固定写法,通过静态代码块的方式加载配置文件里的配置信息
try{
Properties p = new Properties();
InputStream inputStream = DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties");
p.load(inputStream);
dataSource = DruidDataSourceFactory.createDataSource(p);
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取Druid连接池对象
public static DataSource getDataSource(){
return dataSource;
}
}
DbControl.java 数据库方法类,里面有一个按照用户名和密码查询的方法和根据学生信息往数据库里写数据的方法。
package com.lagou.dao;
import com.lagou.util.DruidUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import java.sql.SQLException;
import java.util.Arrays;
/**
* 根据传过来的用户名和密码在数据库查询是否存在该用户
*/
public class DbControl {
public Boolean isLoginSuccess(String userName, String password) throws SQLException {
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
String sql ="select * from stuInfo where stuName = ? and stuPassword = ?";
// 如果传过来的用户名和密码不为空,则在数据库中执行查询操作
if (null != userName && null != password){
Object[] query=qr.query(sql,new ArrayHandler(),userName,password);
// 如果没找到该用户,则返回false
if (0 == query.length){
return false;
}else {
return true;
}
// 如果传过来的用户名和密码为空,则直接返回false
}else {
return false;
}
}
/**
* 根据传过来的参数,在数据库中插入学生信息
* @param stuNum 学号
* @param stuName 姓名
* @param password 密码
* @param gender 性别
* @param birthday 生日
* @throws SQLException
*/
public void addStudent(int stuNum,String stuName,String password,String gender,String birthday) throws SQLException {
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
String sql = "insert into stuInfo values(?,?,?,?,?)";
Object[] parms={stuNum,stuName,password,gender,birthday};
System.out.println(Arrays.toString(parms));
qr.update(sql,parms);
}
}
LoginServlet.java,用户登录功能实现类,获取前端页面传过来的用户名和密码判断用户信息是否正确,正确则跳转到登录成功后的页面,不正确则给出登录失败提示框并返回到登录页面;
package com.lagou.service;
import com.lagou.dao.DbControl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.SQLException;
/**
* 用户登录功能实现
*/
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取登录的用户名和密码
String sname = (String)req.getParameter("sname");
String spassword =(String)req.getParameter("spassword");
System.out.println("用户输入的账号为:" +sname + ":" + spassword);
DbControl db = new DbControl();
// 到数据库中比对
try {
Boolean loginSuccess = db.isLoginSuccess(sname, spassword);
if (loginSuccess){
// 用户名密码正确,跳转到登录成功页面并将用户信息保存到session中
HttpSession session = req.getSession();
session.setAttribute("sname",sname);
session.setAttribute("spassword",spassword);
resp.sendRedirect("/student/middle.html");
}else {
// 用户名密码不正确,弹框提示,回到登录页面
resp.getWriter().write("<script>alert('wrong username and password!');location.href='/student/index.html' </script>");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
AddStuServlet.java,学生信息新增功能实现类,将前端传过来的学生信息写入数据库中;
package com.lagou.service;
import com.lagou.dao.DbControl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
/**
* 新增学生功能实现
*/
public class AddStuServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
/**
*从前端页面获取学生参数,写入到数据库中
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int snum = Integer.valueOf(req.getParameter("snum"));
String sname = req.getParameter("sname");
String spassword = req.getParameter("spassword");
String sex = req.getParameter("sex");
String sbirthday = req.getParameter("sbirthday");
DbControl db = new DbControl();
try {
db.addStudent(snum,sname,spassword,sex,sbirthday);
// 提示学生增加成功并跳转到登录成功页面
resp.getWriter().write("<script>alert('user add success!');location.href='/student/middle.html' </script>");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
IsLoginFilter.java, 判断用户是否登录监听类,如果用户没有登录,直接访问middle.html和reg.html,会弹出没有登录提示框并跳转到登录页面;
package com.lagou.service;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* 判断用户是否登录功能实现
*/
public class IsLoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/**
*从session获取用户信息来判断是否登录
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)servletRequest;
HttpServletResponse resp = (HttpServletResponse)servletResponse;
HttpSession session = req.getSession();
String sname = (String)session.getAttribute("sname");
System.out.println("session中的name为" + sname);
if(null == sname){
// 如果用户没有登录,则弹出提示框并返回到登录页面
resp.getWriter().write("<script>alert('please login!');location.href='/student/index.html' </script>");
}else {
// 如果用户已登录,则放行
filterChain.doFilter(servletRequest,servletResponse);
}
}
@Override
public void destroy() {
}
}
web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 验证登录-->
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.lagou.service.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/loginServlet</url-pattern>
</servlet-mapping>
<!-- 添加用户-->
<servlet>
<servlet-name>AddStuServlet</servlet-name>
<servlet-class>com.lagou.service.AddStuServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AddStuServlet</servlet-name>
<url-pattern>/addStuServlet</url-pattern>
</servlet-mapping>
<!-- 监听是否登录-->
<filter>
<filter-name>IsLoginFilter</filter-name>
<filter-class>com.lagou.service.IsLoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>IsLoginFilter</filter-name>
<url-pattern>/reg.html</url-pattern>
<url-pattern>/middle.html</url-pattern>
</filter-mapping>
</web-app>