JSP实用教程实战篇:Servlet整合+MySQL数据库开发+项目部署全流程,附源码

admin javascript教程 4


是不是学了 JSP 基础后,想做个完整项目却不知道从哪下手?Servlet 和 JSP 怎么配合使用总搞不清,数据在两者之间传不过去;连接 MySQL 数据库时,要么报驱动错误,要么查不到数据;好不容易写完代码,部署到 Tomcat 上又一堆报错,页面打不开?其实啊,实战项目没那么难,关键是把 Servlet 整合、数据库开发和部署流程这三个环节吃透。今天兔子哥就带大家做一个简单的 “用户管理系统”,从 Servlet 与 JSP 整合到 MySQL 数据库操作,再到项目部署上线,每一步都附源码和常见错误解决,保证新手跟着做能少走弯路!

一、Servlet 与 JSP 整合:搞懂 “分工” 才不会乱


场景痛点:“Servlet 写逻辑,JSP 写页面,数据怎么来回传?”


很多新手做项目时,要么把所有代码堆在 JSP 里,要么用 Servlet 写完逻辑却不知道怎么显示到页面上。其实 Servlet 和 JSP 分工很明确:Servlet 负责处理业务逻辑(比如接收请求、操作数据库),JSP 负责展示数据,两者通过 “域对象” 传递数据,配合起来才高效。

1. 核心分工:谁做什么要记牢


  • Servlet 的活儿:接收用户提交的表单数据(用 request.getParameter ())、调用数据库方法查数据、把处理好的数据存到 request 或 session 里、跳转到对应的 JSP 页面显示结果。
  • JSP 的活儿:用 EL 表达式取 Servlet 存的数据(${user.name})、用 JSTL 标签展示列表或判断逻辑、负责页面美化和用户交互。

就像餐馆里 “后厨(Servlet)做菜,前厅(JSP)上菜”,各司其职才不会乱。兔子哥刚开始做项目时,总在 Servlet 里写 HTML 输出,页面丑不说还难维护,后来才明白分工的重要性。

2. 数据传递全流程:从页面到后台再到页面


以 “用户登录” 功能为例,完整流程是这样的:
  1. 用户在 JSP 页面填表单(login.jsp):

jsp
用户名:
密码:

  1. Servlet 接收并处理(LoginServlet.java):

java
protected void doPost(HttpServletRequest request, HttpServletResponse response) {// 接数据String username = request.getParameter("username");String password = request.getParameter("password");// 调数据库方法查用户(后面讲数据库时实现)User user = userDao.login(username, password);// 存数据到requestif (user != null) {request.setAttribute("msg", "登录成功");request.setAttribute("user", user);// 跳转到首页request.getRequestDispatcher("index.jsp").forward(request, response);} else {request.setAttribute("msg", "用户名或密码错误");// 跳回登录页request.getRequestDispatcher("login.jsp").forward(request, response);}}

  1. JSP 显示结果(index.jsp 或 login.jsp):

jsp
${msg}欢迎您,${user.username}!

3. 最容易错的跳转方式:转发和重定向别搞混


跳转方式代码特点适合场景
转发(forward)request.getRequestDispatcher("index.jsp").forward(...)地址栏不变,能传 request 数据登录成功后跳首页,带用户数据
重定向(redirect)response.sendRedirect("login.jsp")地址栏变,不能传 request 数据退出登录后跳登录页,不用带数据

新手常犯的错是用重定向传 request 数据,结果页面啥都取不到。记住:需要带数据跳转用转发,不需要带数据用重定向。

二、MySQL 数据库开发:从连接到 CRUD 全搞定


场景问题:“代码写好了,数据库连不上;连上了,数据查不出来”


数据库是项目的 “仓库”,用户数据、商品信息都存在这里。很多新手卡在数据库连接和 CRUD(增删改查)操作上,其实按步骤来,用对工具,这些问题都能解决。

1. 准备工作:数据库和驱动不能少


  • 建数据库和表:用 MySQL 客户端(比如 Navicat)新建数据库 “userdb”,建表 “user”:

sql
CREATE DATABASE userdb;USE userdb;CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL,password VARCHAR(50) NOT NULL,age INT);

  • 加驱动包:下载 mysql-connector-java-8.0.28.jar(和 MySQL 版本对应),放到项目的 WebContent/WEB-INF/lib 文件夹下,右键 “Build Path”→“Add to Build Path”。

2. 写数据库工具类:连接和关闭不用重复写


新建 DBUtil.java,封装数据库连接和关闭方法,避免重复代码:
java
public class DBUtil {private static String url = "jdbc:mysql://localhost:3306/userdb?useSSL=false&serverTimezone=UTC";private static String user = "root"; // 你的MySQL用户名private static String password = "123456"; // 你的密码// 获取连接public static Connection getConn() throws Exception {Class.forName("com.mysql.cj.jdbc.Driver"); // 8.0以上驱动类名return DriverManager.getConnection(url, user, password);}// 关闭资源public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {try { if (rs != null) rs.close(); } catch (Exception e) {}try { if (ps != null) ps.close(); } catch (Exception e) {}try { if (conn != null) conn.close(); } catch (Exception e) {}}}

3. 实现 CRUD 操作:以用户管理为例


新建 UserDao.java,写增删改查方法,比如登录、查询用户列表:
java
public class UserDao {// 登录查询public User login(String username, String password) {Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;User user = null;try {conn = DBUtil.getConn();String sql = "SELECT * FROM user WHERE username=? AND password=?";ps = conn.prepareStatement(sql);ps.setString(1, username); // 给问号传值,避免SQL注入ps.setString(2, password);rs = ps.executeQuery();if (rs.next()) {user = new User();user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setAge(rs.getInt("age"));}} catch (Exception e) {e.printStackTrace();} finally {DBUtil.close(conn, ps, rs);}return user;}// 查询所有用户(显示列表用)public List<User> findAll() {// 类似登录方法,SQL换成"SELECT * FROM user",返回List// 源码里有完整实现}}

4. 数据库常见错误:这些坑得避开


  • ClassNotFoundException:驱动类名错了(8.0 以上是 com.mysql.cj.jdbc.Driver,不是旧的 com.mysql.jdbc.Driver),或驱动包没放对位置。
  • 连接被拒绝:MySQL 服务没启动,或 url 里的端口(3306)、数据库名(userdb)写错了,用 cmd 登录 MySQL 试试能不能连上。
  • SQL 语法错:SQL 语句里少了空格或分号,比如 "SELECTFROM user"(SELECT 和之间没空格),把 SQL 放客户端执行一下就知道错在哪。

三、项目部署全流程:从本地到服务器能访问


场景痛点:“本地运行好好的,部署到 Tomcat 就报错”


项目写完后得部署到服务器上别人才能访问,很多新手卡在部署环节:启动 Tomcat 报 404,或者数据库连接失败。其实部署就几步,注意配置细节就行。

1. 本地部署:在 Eclipse 里跑通


  • 右键项目→“Export”→“WAR file”,导出成 userSystem.war 文件。
  • 把 WAR 文件复制到 Tomcat 的 webapps 文件夹下。
  • 启动 Tomcat(双击 bin/startup.bat),Tomcat 会自动解压 WAR 包。
  • 打开浏览器访问:http://localhost:8080/userSystem/login.jsp,能看到登录页就说明部署成功。

2. 服务器部署:让别人也能访问


如果想让同一局域网的人访问,需要改两个地方:
  • 数据库连接 url:把localhost改成你电脑的 IP 地址,比如 "jdbc:mysql://192.168.1.100:3306/userdb..."。
  • 防火墙设置:允许 Tomcat 的 8080 端口通过防火墙,不然别人访问不了。

兔子哥之前部署时,总忘了改localhost为 IP,结果别人访问时数据库连不上,后来才发现这个小细节多重要。

3. 部署常见错误解决


  • 404 错误:项目名拼错,或访问路径不对。比如 WAR 包叫 userSystem,访问路径就得带这个名字,不能直接写http://localhost:8080/login.jsp
  • 数据库连接失败:服务器上没装 MySQL,或 MySQL 没授权远程访问,用 GRANT ALL ON userdb.* TO 'root'@'%' IDENTIFIED BY ' 密码 '; 授权。
  • 中文乱码:在 Servlet 里加 request.setCharacterEncoding ("UTF-8"); response.setContentType ("text/html;charset=UTF-8"); 处理编码。

四、自问自答:实战项目最常问的问题


Q:“项目里的 Servlet 怎么配置?为什么访问不到?”
A:需要在 web.xml 里配置 Servlet 映射,或用注解(@WebServlet)。比如 LoginServlet 用注解更简单:
java
@WebServlet("/LoginServlet") // 访问路径,和表单的action对应public class LoginServlet extends HttpServlet { ... }

表单的 action 必须和这里的路径一致,不然访问不到 Servlet。
Q:“用户密码明文存数据库不安全,怎么办?”
A:可以用 MD5 加密!存密码时把明文加密成密文,登录时加密输入的密码再和数据库比对。比如:
java
// 简单MD5加密方法(实际项目用更复杂的加密)public static String md5(String str) {// 加密逻辑,源码里有完整实现return encryptedStr;}

注册时存md5(password),登录时比对md5(inputPassword)和数据库的密文。
Q:“项目太大,类太多,怎么管理才不乱?”
A:按功能分层!比如建 entity 包放 User 这类实体类,dao 包放数据库操作类(UserDao),servlet 包放 Servlet,util 包放工具类(DBUtil),结构清晰才好维护。兔子哥做项目必分层,不然代码多了根本找不到在哪改。
兔子哥觉得,做实战项目是学好 JSP 的最快方式,比光看教程有用多了。重点是多动手敲代码,遇到错误别慌,把报错信息复制下来搜一搜,大部分问题别人都遇到过。Servlet 和 JSP 的分工、数据库连接的细节、部署时的路径配置,这些地方刚开始可能会出错,但练两个项目就熟了。
带过的学员里,有个零基础的同学跟着这个流程做,两周就做出了能运行的用户管理系统,虽然简单,但从 Servlet 到数据库再到部署全流程都走通了。他说最大的感受是 “自己做出来的项目,比看十篇教程都记得牢”。现在就打开你的 IDE,按今天的步骤试试,遇到问题多调试,你会发现实战项目真的没那么难,动手做起来吧!

标签: request.getParameter HttpServletResponse

发布评论 1条评论)

  • Refresh code

评论列表

2025-10-24 23:40:13

Servlet+MySQL实战,源码部署全