
1. 从零开始的Java Web开发之旅作为一名从业多年的Java开发者我依然清晰地记得第一次接触Web开发时的兴奋与困惑。这个看似简单的Java Web开发 day1标题背后实际上隐藏着整个Web开发体系的基石知识。让我们抛开那些华而不实的理论直接进入实战环节。Java Web开发与传统Java应用最大的区别在于请求-响应模型的理解。想象你开了一家餐馆服务器顾客客户端通过菜单接口点餐你根据订单准备菜品并返回给顾客。这个简单的类比就是Web开发的核心逻辑。第一天我们需要搭建好这个餐馆的基础设施。提示新手常犯的错误是过早关注框架而忽视基础。建议先用纯Servlet/JSP开发至少2周再接触Spring等框架。2. 开发环境搭建与工具链配置2.1 JDK的选择与安装虽然现在JDK 17已是LTS版本但我建议初学者从JDK 8开始。不是因为它技术新而是因为企业级项目80%仍在使用JDK 8文档和解决方案最丰富兼容性最好安装后验证java -version # 应显示类似java version 1.8.0_3012.2 IDE的抉择Eclipse vs IntelliJ IDEA我强烈推荐使用IntelliJ IDEA社区版免费更智能的代码补全更好的Maven集成内置Tomcat支持更友好的调试界面安装后需要配置设置JDK路径调整Maven为阿里云镜像加速依赖下载安装Lombok插件2.3 Tomcat服务器的配置选择Tomcat 9.x版本平衡新特性和稳定性下载zip包解压到D:\tomcat9配置环境变量CATALINA_HOME修改conf/server.xml中的端口避免冲突Connector port8888 protocolHTTP/1.1/启动测试%CATALINA_HOME%\bin\startup.bat访问http://localhost:8888应看到欢迎页3. 第一个Servlet程序实战3.1 创建动态Web项目在IDEA中New Project → Java Enterprise勾选Web Application选择配置好的Tomcat实例项目结构应包含src |-- main |-- java # 源代码 |-- resources # 配置文件 |-- webapp # 前端资源 |-- WEB-INF |-- web.xml # 部署描述符3.2 编写HelloServletWebServlet(/hello) // 注解方式配置路径 public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 设置响应内容类型 resp.setContentType(text/html;charsetUTF-8); // 获取输出流 PrintWriter out resp.getWriter(); // 输出HTML out.println(html); out.println(headtitle第一个Servlet/title/head); out.println(body); out.println(h1你好 req.getParameter(name) !/h1); out.println(/body); out.println(/html); } }3.3 部署与测试点击IDEA右上角的Tomcat运行按钮访问 http://localhost:8888/项目名/hello?name张三应看到你好张三的欢迎语常见问题如果出现404错误检查项目是否成功部署到TomcatURL路径是否正确含项目名Servlet注解配置的路径4. Web开发核心概念解析4.1 Servlet生命周期理解这个对调试至关重要加载和实例化容器首次收到请求时初始化调用init()方法可覆盖请求处理service()根据请求类型调用doGet/doPost销毁容器关闭时调用destroy()// 生命周期方法示例 Override public void init() throws ServletException { System.out.println(Servlet初始化...); // 可在此加载配置文件等 } Override public void destroy() { System.out.println(Servlet销毁...); // 释放资源 }4.2 请求与响应对象HttpServletRequest和HttpServletResponse是开发中最常用的两个对象请求对象常用方法String param request.getParameter(name); // 获取参数 String header request.getHeader(User-Agent); // 获取请求头 Cookie[] cookies request.getCookies(); // 获取Cookie响应对象常用技巧response.setHeader(Cache-Control, no-cache); // 禁用缓存 response.sendRedirect(/newURL); // 重定向 response.setContentType(application/json); // 设置JSON响应4.3 Web.xml的现代替代方案传统方式需要在web.xml中配置Servletservlet servlet-namehello/servlet-name servlet-classcom.example.HelloServlet/servlet-class /servlet servlet-mapping servlet-namehello/servlet-name url-pattern/hello/url-pattern /servlet-mapping现代更推荐使用注解如前面的WebServlet但了解传统配置有助于维护老项目。5. 实战中的避坑指南5.1 中文乱码解决方案乱码是第一天最常见的坑全方位解决方案JSP页面添加page指令% page contentTypetext/html;charsetUTF-8 languagejava %Servlet设置请求和响应编码// GET请求 request.setCharacterEncoding(UTF-8); // POST请求需在获取参数前调用 response.setContentType(text/html;charsetUTF-8);Tomcat配置修改server.xmlConnector port8080 protocolHTTP/1.1 URIEncodingUTF-8 /5.2 路径问题终极指南Web开发中路径分为相对路径以./或../开头相对于当前URL绝对路径以/开头分两种客户端路径/开头相对于网站根需加项目名服务端路径/开头相对于应用根转发时使用最佳实践!-- 使用JSP的绝对路径 -- link href${pageContext.request.contextPath}/css/style.css !-- 或者使用base标签 -- head base href${pageContext.request.contextPath}/ /head5.3 调试技巧大全日志输出// 在Servlet中 log(调试信息); // 输出到Tomcat日志 // 使用SLF4J Logger logger LoggerFactory.getLogger(getClass()); logger.debug(参数值: {}, param);浏览器开发者工具查看Network选项卡中的请求/响应检查Console中的JavaScript错误IDEA调试技巧条件断点右键断点设置条件表达式求值调试时AltF8修改值在Variables视图直接编辑6. 从Servlet到MVC的思维转变6.1 为什么需要MVC原始Servlet开发的问题HTML与Java代码混杂业务逻辑与展示逻辑耦合难以维护和扩展MVC解决方案Model数据与业务逻辑Java类View展示层JSPController调度器Servlet6.2 手动实现简易MVC创建基础Servlet作为控制器protected void doGet(HttpServletRequest request, HttpServletResponse response) { String path request.getRequestURI(); String method request.getMethod(); if (GET.equals(method) /user/list.equals(path)) { ListUser users userService.findAll(); request.setAttribute(users, users); request.getRequestDispatcher(/WEB-INF/views/user/list.jsp).forward(request, response); } // 其他路由... }在JSP中使用EL表达式展示数据c:forEach items${users} varuser tr td${user.id}/td td${user.name}/td /tr /c:forEach6.3 为明天做准备明天我们将使用Filter实现统一编码处理引入JSTL标签库简化JSP开发实现一个完整的用户CRUD案例建议预习数据库基础JDBCHTML表单提交方式HTTP状态码含义记住Web开发的核心始终是HTTP协议。理解请求-响应模型和状态管理比任何框架都重要。我见过太多开发者跳过了这些基础直接学习Spring结果遇到问题根本不知道如何排查。