1. JavaWeb入门基础概念JavaWeb技术是使用Java语言开发Web应用程序的技术集合它运行在服务器端能够处理HTTP请求并生成动态网页内容。作为JavaEE现称Jakarta EE的核心组成部分JavaWeb技术栈主要包括Servlet、JSP、JDBC等关键技术。提示学习JavaWeb前建议先掌握JavaSE基础特别是IO流、多线程和网络编程相关知识这些是理解Web工作原理的基础。JavaWeb应用程序通常由以下几个核心组件构成Servlet运行在服务器端的Java程序用于处理客户端请求并生成响应JSPJava Server Pages允许在HTML中嵌入Java代码的动态页面技术JDBCJava数据库连接API用于与关系型数据库交互Web容器如Tomcat、Jetty等负责管理Servlet生命周期和HTTP请求/响应1.1 开发环境搭建实战搭建JavaWeb开发环境需要以下组件JDKJava Development Kit建议使用JDK 11或17等LTS版本IDEEclipse或IntelliJ IDEA社区版即可Web服务器Apache Tomcat 9.x或10.x构建工具Maven或Gradle推荐以Eclipse Tomcat配置为例下载并安装Eclipse IDE for Enterprise Java Developers版本从Apache官网下载Tomcat二进制发行版zip格式在Eclipse中配置Tomcat服务器打开Servers视图Window → Show View → Servers右键 → New → Server → 选择Apache → 对应Tomcat版本指定Tomcat安装目录完成配置1.2 第一个Servlet程序创建基本Servlet项目的步骤在Eclipse中新建Dynamic Web ProjectFile → New → Dynamic Web Project输入项目名称如HelloWebTarget runtime选择配置好的TomcatDynamic web module version选择4.0对应Servlet 4.0创建Servlet类package com.example.web; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(text/html); PrintWriter out response.getWriter(); out.println(htmlbody); out.println(h1Hello, JavaWeb!/h1); out.println(/body/html); } }配置web.xml或使用注解servlet servlet-namehello/servlet-name servlet-classcom.example.web.HelloServlet/servlet-class /servlet servlet-mapping servlet-namehello/servlet-name url-pattern/hello/url-pattern /servlet-mapping启动Tomcat服务器访问http://localhost:8080/HelloWeb/hello注意现代JavaWeb开发更推荐使用WebServlet注解而非web.xml配置但理解传统配置方式有助于掌握底层原理。2. JavaWeb核心技术深度解析2.1 Servlet生命周期与线程模型Servlet生命周期由Web容器管理主要包括三个阶段初始化容器调用init()方法通常只执行一次服务对每个请求容器调用service()方法进而调用doGet/doPost等销毁容器调用destroy()方法释放资源关键线程特性Servlet实例通常单例多线程运行需要特别注意实例变量的线程安全问题可以使用synchronized或ThreadLocal解决并发问题2.2 JSP与EL表达式JSP本质上是Servlet的另一种表现形式编译后会转换为Servlet类。现代JSP开发推荐尽量减少Scriptlet% %改用EL表达式和JSTLEL表达式简化了页面数据的访问p欢迎您${sessionScope.user.name}/p p当前时间${requestScope.currentTime}/p核心JSTL标签库使用% taglib prefixc urihttp://java.sun.com/jsp/jstl/core % c:forEach items${products} varproduct tr td${product.id}/td td${product.name}/td /tr /c:forEach2.3 会话管理机制HTTP是无状态协议JavaWeb提供了多种会话跟踪技术Cookie最基础的客户端状态保持Cookie cookie new Cookie(user, admin); cookie.setMaxAge(3600); // 1小时有效期 response.addCookie(cookie);HttpSession服务端会话管理// 存储数据 request.getSession().setAttribute(cart, shoppingCart); // 获取数据 ShoppingCart cart (ShoppingCart)request.getSession().getAttribute(cart);URL重写当客户端禁用Cookie时的备选方案String url response.encodeURL(/order/checkout);3. 数据库连接与JDBC实战3.1 基础JDBC操作标准JDBC操作流程加载驱动获取连接创建Statement执行SQL处理结果集释放资源示例代码public ListUser getAllUsers() throws SQLException { ListUser users new ArrayList(); String sql SELECT id, username, email FROM users; try (Connection conn dataSource.getConnection(); Statement stmt conn.createStatement(); ResultSet rs stmt.executeQuery(sql)) { while (rs.next()) { User user new User(); user.setId(rs.getLong(id)); user.setUsername(rs.getString(username)); user.setEmail(rs.getString(email)); users.add(user); } } return users; }3.2 连接池配置与优化直接使用DriverManager获取连接性能低下生产环境应使用连接池Tomcat JDBC Pool配置在context.xml中Resource namejdbc/myDB authContainer typejavax.sql.DataSource maxTotal100 maxIdle30 maxWaitMillis10000 usernamedbuser passworddbpass driverClassNamecom.mysql.cj.jdbc.Driver urljdbc:mysql://localhost:3306/mydb?useSSLfalse/在代码中使用连接池Context initContext new InitialContext(); Context envContext (Context)initContext.lookup(java:/comp/env); DataSource ds (DataSource)envContext.lookup(jdbc/myDB);经验连接池参数需要根据实际负载调整maxActive不宜过大避免耗尽数据库资源。4. 项目实战图书管理系统核心模块4.1 系统架构设计典型JavaWeb项目分层架构表示层JSP/HTML Servlet业务逻辑层Service组件数据访问层DAO模式实体层POJO类目录结构示例/src/main/java /com/bookstore/controller - Servlet控制器 /com/bookstore/service - 业务逻辑 /com/bookstore/dao - 数据访问 /com/bookstore/model - 实体类 /src/main/webapp /WEB-INF - 配置文件和受保护资源 /static - 静态资源(CSS/JS/图片) /views - JSP页面4.2 核心功能实现用户登录模块WebServlet(/login) public class LoginServlet extends HttpServlet { private UserService userService new UserServiceImpl(); protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username request.getParameter(username); String password request.getParameter(password); User user userService.login(username, password); if (user ! null) { request.getSession().setAttribute(user, user); response.sendRedirect(home.jsp); } else { request.setAttribute(error, 用户名或密码错误); request.getRequestDispatcher(login.jsp).forward(request, response); } } }图书查询功能% page importcom.bookstore.model.Book % % page importjava.util.List % % ListBook books (ListBook)request.getAttribute(books); % table classtable thead tr thISBN/th th书名/th th作者/th th价格/th /tr /thead tbody % for (Book book : books) { % tr td% book.getIsbn() %/td td% book.getTitle() %/td td% book.getAuthor() %/td td% book.getPrice() %/td /tr % } % /tbody /table4.3 常见问题解决方案中文乱码处理// 在Servlet中设置请求和响应编码 request.setCharacterEncoding(UTF-8); response.setContentType(text/html;charsetUTF-8); // 在JSP页面头部添加 % page contentTypetext/html;charsetUTF-8 languagejava %表单重复提交问题// 生成令牌并存入session String token UUID.randomUUID().toString(); request.getSession().setAttribute(token, token); request.setAttribute(token, token); // 在表单中添加隐藏域 input typehidden nametoken value${token} // 提交时验证令牌 String clientToken request.getParameter(token); String serverToken (String)request.getSession().getAttribute(token); if (clientToken null || !clientToken.equals(serverToken)) { // 重复提交处理 }静态资源加载问题!-- 在web.xml中添加配置 -- servlet-mapping servlet-namedefault/servlet-name url-pattern/static/*/url-pattern /servlet-mapping在实际开发中我发现初学者最容易犯的错误是忽视异常处理和资源释放。比如忘记关闭数据库连接会导致连接泄漏最终使系统崩溃。建议使用try-with-resources语法确保资源正确释放并对所有可能抛出异常的操作进行适当处理。