ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

JavaWeb入门:从零搭建Web项目与Servlet实战

JavaWeb入门:从零搭建Web项目与Servlet实战

1. JavaWeb入门:从零搭建你的第一个Web项目

刚接触JavaWeb开发时,很多人会被各种概念和配置搞得晕头转向。作为一个从Servlet时代一路走过来的老码农,我想用最接地气的方式带大家快速上手JavaWeb开发。今天我们就用IDEA 2021和Tomcat 9来搭建一个完整的JavaWeb项目,过程中我会分享那些官方文档里不会写的实战技巧。

2. 环境准备与项目创建

2.1 开发工具选择

我强烈推荐使用IntelliJ IDEA 2021+版本作为开发工具。相比Eclipse,IDEA对JavaWeb项目的支持更友好,特别是它的智能提示和自动补全功能,能帮我们避免很多低级错误。

安装时注意勾选"Web Application"相关插件:

  • Java EE: Servlet, JSP支持
  • Tomcat and TomEE Integration: 内嵌Tomcat支持
  • Database Tools and SQL: 数据库相关功能

注意:社区版IDEA缺少部分JavaEE功能,建议使用Ultimate版。学生可以申请免费授权。

2.2 创建JavaWeb项目

  1. 新建项目选择"Java Enterprise"
  2. 勾选"Web Application"模板
  3. 项目SDK选择Java 8或11(目前企业最常用版本)
  4. Application Server选择你的Tomcat安装路径

项目结构自动生成后,重点关注这几个目录:

src main java // 存放Java源代码 resources // 配置文件 webapp // 前端资源 WEB-INF // 配置和类文件 web.xml // 部署描述符

3. Servlet核心开发

3.1 第一个Servlet程序

右键java目录新建一个HelloServlet类:

@WebServlet("/hello") public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=UTF-8"); PrintWriter out = resp.getWriter(); out.println("<h1>你好,JavaWeb!</h1>"); } }

几个关键点说明:

  1. @WebServlet注解替代了传统的web.xml配置
  2. HttpServlet是所有Servlet的父类
  3. doGet方法处理GET请求
  4. 必须设置response的contentType和charset

3.2 Servlet生命周期深度解析

Servlet的生命周期由容器管理,主要经历三个阶段:

  1. 初始化:容器调用init()方法
  2. 服务:每次请求调用service()方法
  3. 销毁:容器关闭时调用destroy()

实战经验:避免在Servlet中使用实例变量,因为Servlet是单例的,可能引发线程安全问题。

4. JSP基础与整合开发

4.1 第一个JSP页面

在webapp目录下新建hello.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>我的第一个JSP</title> </head> <body> <h1>当前时间: <%= new java.util.Date() %></h1> </body> </html>

JSP最终会被编译成Servlet,其本质还是Java代码。现代开发中更推荐使用模板引擎如Thymeleaf。

4.2 JSP九大内置对象

这些对象可以直接在JSP中使用:

  1. request:HttpServletRequest
  2. response:HttpServletResponse
  3. session:HttpSession
  4. application:ServletContext
  5. out:JspWriter
  6. pageContext:PageContext
  7. page:Object
  8. config:ServletConfig
  9. exception:Throwable

5. 数据库连接与操作

5.1 JDBC基础配置

在pom.xml中添加MySQL驱动依赖:

<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</version> </dependency>

创建数据库工具类DBUtil.java:

public class DBUtil { private static final String URL = "jdbc:mysql://localhost:3306/test?useSSL=false"; private static final String USER = "root"; private static final String PASSWORD = "123456"; public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }

5.2 使用PreparedStatement防止SQL注入

String sql = "SELECT * FROM users WHERE username = ? AND password = ?"; try (Connection conn = DBUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, username); pstmt.setString(2, password); ResultSet rs = pstmt.executeQuery(); // 处理结果集 }

6. Tomcat配置与项目部署

6.1 配置Tomcat服务器

  1. 点击IDEA右上角"Add Configuration"
  2. 选择"Tomcat Server -> Local"
  3. 配置Tomcat安装路径
  4. Deployment选项卡添加项目war包

6.2 热部署技巧

在Tomcat配置中勾选:

  • On 'Update' action: Update classes and resources
  • On frame deactivation: Update classes and resources

这样修改代码后不用重启Tomcat,只需按Ctrl+F10即可热更新。

7. 常见问题排查指南

7.1 404错误排查

  1. 检查URL路径是否正确
  2. 确认Servlet是否添加了@WebServlet注解
  3. 查看Tomcat控制台是否有部署错误

7.2 500错误排查

  1. 查看控制台完整堆栈信息
  2. 检查JSP页面中的Java代码
  3. 确认数据库连接正常

7.3 中文乱码解决方案

统一编码配置:

  1. 在Servlet中设置request和response的编码
request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8");
  1. 在JSP页面头部添加page指令
  2. 在Tomcat的server.xml中配置URIEncoding="UTF-8"

8. 项目实战:用户登录功能

8.1 完整代码示例

LoginServlet.java:

@WebServlet("/login") public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); if("admin".equals(username) && "123456".equals(password)) { request.getSession().setAttribute("user", username); response.sendRedirect("welcome.jsp"); } else { request.setAttribute("error", "用户名或密码错误"); request.getRequestDispatcher("login.jsp").forward(request, response); } } }

8.2 会话管理技巧

  1. 使用HttpSession保存用户登录状态
  2. 设置合理的session超时时间
  3. 敏感操作需要验证session

9. 项目优化与扩展

9.1 使用过滤器实现统一编码

创建EncodingFilter.java:

@WebFilter("/*") public class EncodingFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); chain.doFilter(request, response); } }

9.2 三层架构设计

推荐的项目结构:

com.example controller // 控制器层 service // 业务逻辑层 dao // 数据访问层 model // 实体类 util // 工具类

10. 学习资源推荐

  1. 官方文档:

    • Servlet规范:https://javaee.github.io/servlet-spec/
    • JSP规范:https://javaee.github.io/jsp-spec/
  2. 推荐书籍:

    • 《Head First Servlets and JSP》
    • 《Java Web整合开发王者归来》
  3. 在线教程:

    • Oracle官方JavaEE教程
    • Spring官方文档

在实际开发中,我发现很多初学者容易陷入过度关注框架的误区。建议先把Servlet/JSP这些基础打牢,再去学习Spring等框架。遇到问题时,多查看Tomcat控制台日志,90%的错误信息都能在那里找到线索。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进