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项目
- 新建项目选择"Java Enterprise"
- 勾选"Web Application"模板
- 项目SDK选择Java 8或11(目前企业最常用版本)
- 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>"); } }几个关键点说明:
@WebServlet注解替代了传统的web.xml配置HttpServlet是所有Servlet的父类doGet方法处理GET请求- 必须设置response的contentType和charset
3.2 Servlet生命周期深度解析
Servlet的生命周期由容器管理,主要经历三个阶段:
- 初始化:容器调用
init()方法 - 服务:每次请求调用
service()方法 - 销毁:容器关闭时调用
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中使用:
- request:HttpServletRequest
- response:HttpServletResponse
- session:HttpSession
- application:ServletContext
- out:JspWriter
- pageContext:PageContext
- page:Object
- config:ServletConfig
- 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服务器
- 点击IDEA右上角"Add Configuration"
- 选择"Tomcat Server -> Local"
- 配置Tomcat安装路径
- 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错误排查
- 检查URL路径是否正确
- 确认Servlet是否添加了@WebServlet注解
- 查看Tomcat控制台是否有部署错误
7.2 500错误排查
- 查看控制台完整堆栈信息
- 检查JSP页面中的Java代码
- 确认数据库连接正常
7.3 中文乱码解决方案
统一编码配置:
- 在Servlet中设置request和response的编码
request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8");- 在JSP页面头部添加page指令
- 在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 会话管理技巧
- 使用HttpSession保存用户登录状态
- 设置合理的session超时时间
- 敏感操作需要验证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. 学习资源推荐
官方文档:
- Servlet规范:https://javaee.github.io/servlet-spec/
- JSP规范:https://javaee.github.io/jsp-spec/
推荐书籍:
- 《Head First Servlets and JSP》
- 《Java Web整合开发王者归来》
在线教程:
- Oracle官方JavaEE教程
- Spring官方文档
在实际开发中,我发现很多初学者容易陷入过度关注框架的误区。建议先把Servlet/JSP这些基础打牢,再去学习Spring等框架。遇到问题时,多查看Tomcat控制台日志,90%的错误信息都能在那里找到线索。