1. 项目概述与技术选型学生信息管理系统是JavaWeb入门阶段的经典练手项目它涵盖了Web开发中最基础也最核心的技术组合JSP负责页面展示Servlet处理业务逻辑MySQL存储数据。这个技术栈特别适合刚学完Java基础想转Web开发的同学因为不需要学习复杂的框架就能理解Web应用从浏览器到数据库的完整请求处理流程。我当年第一次做这个项目时踩了不少坑比如中文乱码问题、数据库连接泄露、Servlet线程安全等。现在回头看这些坑反而让我更深入理解了Web底层原理。建议初学者在实现基础功能后可以尝试用Filter解决全局编码问题用连接池优化数据库性能这些都是很好的进阶练习。技术选型方面我们坚持简单够用原则前端JSPJSTLBootstrap避免复杂的前端框架后端纯Servlet实现不使用Spring等框架数据库MySQL 5.7兼容性好工具JDK8Tomcat9Eclipse/IDEA2. 数据库设计与实现2.1 表结构设计数据库设计要遵循三范式原则我们主要创建了四张表CREATE TABLE user ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(20) UNIQUE NOT NULL, password VARCHAR(32) NOT NULL, -- 建议存储MD5加密后的密码 name VARCHAR(20), gender ENUM(男,女), age INT CHECK(age0), phone VARCHAR(11) UNIQUE ); CREATE TABLE student ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20) NOT NULL, gender ENUM(男,女), age INT, class_id INT, -- 外键关联班级表 FOREIGN KEY (class_id) REFERENCES class(id) );几个设计要点密码字段要足够长MD5加密后32位使用ENUM限制性别取值添加CHECK约束保证年龄合法建立外键保证数据完整性2.2 数据库连接池直接使用JDBC每次创建连接性能很差我们用阿里巴巴的Druid连接池// druid.properties druid.urljdbc:mysql://localhost:3306/student_db?useSSLfalseserverTimezoneUTC druid.usernameroot druid.password123456 druid.initialSize5 druid.maxActive20工具类封装public class JdbcUtil { private static DataSource dataSource; static { try { Properties props new Properties(); InputStream is JdbcUtil.class.getClassLoader() .getResourceAsStream(druid.properties); props.load(is); dataSource DruidDataSourceFactory.createDataSource(props); } catch (Exception e) { throw new RuntimeException(e); } } public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } }3. 核心功能实现3.1 用户认证模块登录流程要注意安全性密码传输前用JS做MD5加密服务端二次加密验证使用Session存储登录状态// LoginServlet protected void doPost(HttpServletRequest request, HttpServletResponse response) { String username request.getParameter(username); String inputPwd DigestUtils.md5Hex(request.getParameter(password)); User user userDao.findByUsername(username); if(user ! null user.getPassword().equals(inputPwd)){ request.getSession().setAttribute(user, user); response.sendRedirect(index.jsp); } else { request.setAttribute(msg, 用户名或密码错误); request.getRequestDispatcher(/login.jsp).forward(request, response); } }3.2 学生信息CRUD使用MVC分层架构src/ ├── controller (Servlet) ├── service (业务逻辑) ├── dao (数据访问) └── model (实体类)BaseServlet封装通用方法public class BaseServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) { String method request.getParameter(method); try { Method m this.getClass().getMethod(method, HttpServletRequest.class, HttpServletResponse.class); m.invoke(this, request, response); } catch (Exception e) { e.printStackTrace(); } } }分页查询实现// StudentDaoImpl public PageBeanStudent findByPage(int currentPage, int rows) { PageBeanStudent pb new PageBean(); pb.setCurrentPage(currentPage); pb.setRows(rows); // 查询总记录数 String sql1 SELECT COUNT(*) FROM student; int totalCount template.queryForObject(sql1, Integer.class); pb.setTotalCount(totalCount); // 查询当前页数据 String sql2 SELECT * FROM student LIMIT ?,?; int start (currentPage - 1) * rows; ListStudent list template.query(sql2, new BeanPropertyRowMapper(Student.class), start, rows); pb.setList(list); return pb; }4. 常见问题解决方案4.1 中文乱码问题全局过滤器解决乱码WebFilter(/*) public class EncodingFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) { HttpServletRequest request (HttpServletRequest) req; HttpServletResponse response (HttpServletResponse) resp; request.setCharacterEncoding(UTF-8); response.setContentType(text/html;charsetutf-8); chain.doFilter(request, response); } }4.2 表单重复提交使用重定向代替转发// 添加学生成功后 response.sendRedirect(request.getContextPath()/student?methodlist);4.3 SQL注入防护使用PreparedStatementpublic User findByUsernameAndPassword(String username, String password) { String sql SELECT * FROM user WHERE username? AND password?; return template.queryForObject(sql, new BeanPropertyRowMapper(User.class), username, password); }5. 项目优化建议前端优化使用Ajax实现无刷新操作添加表单验证jQuery Validate引入图表库展示统计数据后端优化添加日志记录Log4j实现文件上传/下载功能加入Redis缓存高频访问数据安全加固密码加盐处理XSS防护HTML转义CSRF令牌验证这个项目虽然技术简单但涵盖了Web开发的核心流程。建议在完成基础功能后尝试自己添加新模块比如成绩管理、考勤记录等这对理解业务逻辑设计很有帮助。