## 一、Java EE的标准目录结构 ```bat ROOT/ ├── *src/ │ ├── *main/ │ │ ├── java/ # Java源代码 │ │ ├── *resources/ # 资源文件 │ │ ├── *webapp/ # Web应用文件 │ │ │ ├── *WEB-INF/ │ │ │ │ ├── *web.xml # Web部署描述符 │ │ │ │ ├── classes/ # 编译的类文件 │ │ │ │ └── lib/ # 依赖的JAR文件 │ │ │ ├── index.html # 静态页面 │ │ │ ├── css/ │ │ │ ├── js/ │ │ │ └── images/ │ │ └── *webapp/ # 或者传统的webapp目录 │ └── test/ │ ├── java/ # 测试代码 │ └── resources/ # 测试资源 ├── target/ # 构建输出目录(Maven) ├── pom.xml # Maven配置文件 └── README.md ``` 带`*`为必须的目录结构 ## 二、创建JavaWeb工程 #### 1、选择Jakarta EE项目 #### 2、添加Servlet依赖 创建即可。 ## 三、Servlet程序 #### 1、什么是Servlet **Servlet(Server Applet)**,全称 **Java Servlet**,是用 Java 编写的服务器端程序。它的核心使命是扩展服务器的功能,专门用于处理来自 Web 客户端的请求,并动态生成响应。 可以把它理解为一个专为 Web 请求定制的 Java 类。 #### 2、Servlet工作流程 #### 3、配置映射路径 ```java @WebServlet(urlPatterns = "/hello-servlet") ``` #### 4、获取向客户端响应的输出流 ```java PrintWriter out = resp.getWriter(); ``` #### 5、向客户端响应一个网页 ```java out.println(""); out.println(""); out.println("hello"); out.println(""); out.println(""); out.println("hello,world!"); out.println(""); out.println(""); ``` #### 6、关闭输出流 ```java out.close(); ``` #### 7、程序模板 在Java源文件根目录下,新建`cn.doooog.javaweb.servlet`包,创建`HelloServlet.java`类 ```java package cn.doooog.javaweb.servlet; import java.io.*; import jakarta.servlet.ServletException; import jakarta.servlet.http.*; import jakarta.servlet.annotation.*; @WebServlet(urlPatterns = "/hello-servlet") public class HelloServlet extends HttpServlet { @Override public void init() { } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter out = resp.getWriter(); // 业务代码 out.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } @Override public void destroy() { } } ``` **注意**:其中`req`为客户端请求数据,`resp`为服务端响应数据,`@WebServlet`注解定义了该类的网络路径与别名。 #### 8、处理响应字符编码 ```java // 设置响应信息的字符编码 resp.setCharacterEncoding("utf-8"); // 设置mime类型:通知浏览器使用此字符编码来处理响应数据 resp.setContentType("text/html;charset=utf-8"); ``` #### 9、处理请求字符编码 ```java // 处理请求信息的字符编码 req.setCharacterEncoding("utf-8"); // 获取请求信息的参数 String 参数名 = req.getParameter("参数名"); ``` ## 四、Servlet生命周期 #### 1、Servlet容器创建Servlet实例 #### 2、初始化`init()` #### 3、处理客户端请求`service()` #### 4、销毁`destroy()` #### 5、流程图:  ## 五、Servlet实例创建时机 Servlet对象由Servlet容器负责创建,创建的时机可以使用`loadOnStartup`属性来配置 ```java @WebServlet(urlPatterns = "/hello-servlet", loadOnStartup = 1) ``` `loadOnStartup`的值必须为整数 当值`>=0`时,表示在容器启动时就创建该Servlet对象; 当值`<0`或不设置时,表示在请求访问该对象时才会被创建; 整数值越小,该Servlet启动时优先级就越高,就越先启动; 当与其他Servlet的值相同时,容器会自动选择启动顺序。 ## 六、Servlet实例初始化 在初始化时通过`initParams`属性来传初始化参数,参数定义需要用到`@WebInitParam()`注解。 ```java @WebServlet(urlPatterns = "/hello-servlet", initParams = { // 传入字符编码类型 @WebInitParam(name = "charSet", value = "utf-8") }) ``` 获取传入的初始化参数 ```java public class HelloServlet extends HttpServlet { // 获取初始化参数 private ServletConfig config; // 初始化函数 @Override public void init() { config = this.getServletConfig(); System.out.println(config.getInitParameter("charSet")) } } ``` ## 七、HTTP状态码 #### 1、分类 ##### `1xx` - 信息性状态码(Informational) 表示请求已被接收,正在继续处理。这是一个临时响应。 **含义**:服务器收到了请求,但请求者需要继续等待最终响应。 **常见场景**:在发送最终HTTP响应之前,提前告知客户端一些信息。客户端在收到1xx响应后,应等待服务器最终的响应(如200或错误码)。 **常见状态码**: * `100 Continue`:客户端应继续其请求。通常用于客户端在发送大型请求体之前,先询问服务器是否愿意接受该请求。 * `101 Switching Protocols`:客户端要求服务器切换协议(例如,从HTTP升级到WebSocket),服务器已同意切换。 * `102 Processing`(WebDAV):服务器已收到并正在处理请求,但尚未有最终响应。用于防止客户端超时。 ##### `2xx` - 成功状态码(Success) 表示请求已被服务器成功接收、理解并处理。 **含义**:客户端的请求成功了。 **常见场景**:一切正常,服务器执行了客户端所期望的操作。 **常见状态码**: * `200 OK`:**最常见的成功状态码**。请求成功,响应报文中包含了请求的结果(如HTML页面、JSON数据等)。 * `201 Created`:请求成功,并且服务器创建了新的资源(例如,通过POST方法创建了一个新用户)。通常在响应头`Location`中会包含新资源的URL。 * `202 Accepted`:请求已被接受,但尚未处理完成。适用于异步任务,例如请求已进入队列等待处理。 * `204 No Content`:服务器成功处理了请求,但响应报文中不包含任何内容(没有响应体)。常见于AJAX请求,客户端只需知道操作成功,无需更新页面。 ##### `3xx` - 重定向状态码(Redirection) 表示需要客户端采取进一步的操作才能完成请求。 **含义**:请求的资源位置发生了变化,或者需要其他操作来获取资源。 **常见场景**:URL已更改,需要跳转到新的地址。 **常见状态码**: * `301 Moved Permanently`:**永久重定向**。请求的资源已被**永久**分配了新的URI。以后的请求应使用新的URI。搜索引擎会更新其链接。 * `302 Found`:**临时重定向**。请求的资源**临时**从不同的URI响应请求。以后的请求**应该**继续使用原始URI。搜索引擎不会更新链接。 * `304 Not Modified`:**未被修改**。当客户端使用缓存,并通过请求头(如`If-Modified-Since`)询问资源是否更新时,如果资源未修改,服务器会返回此状态码,告诉客户端直接使用本地缓存。这可以节省带宽。 ##### `4xx` - 客户端错误状态码(Client Error) 表示客户端看起来可能发生了错误,妨碍了服务器的处理。 **含义**:**错误在客户端**。例如,请求包含语法错误、无法验证身份或请求了不存在的资源。 **常见场景**:用户输入了错误的URL、没有权限访问某个页面、请求格式错误等。 **重要状态码**: * `400 Bad Request`:**坏请求**。服务器无法理解请求的格式。通常是请求的语法有误(如JSON格式错误)。 * `401 Unauthorized`:**未授权**。请求需要用户认证。客户端必须提供正确的认证信息(如用户名和密码)。 * `403 Forbidden`:**禁止访问**。服务器理解请求,但拒绝执行。与401不同,即使提供了认证信息,也因为没有权限而无法访问。 * `404 Not Found`:**最著名的错误码**。服务器无法找到请求的资源。通常是因为URL错误或资源已被删除。 * `429 Too Many Requests`:**请求过于频繁**。客户端在给定的时间内发送了太多请求(“限速”)。 ##### `5xx` - 服务器错误状态码(Server Error) 表示服务器在处理请求的过程中发生了错误。 **含义**:**错误在服务器端**。客户端请求有效,但服务器自身无法完成请求。 **常见场景**:服务器代码有bug、数据库连接失败、服务器过载等。 **重要状态码**: * `500 Internal Server Error`:**通用的服务器错误**。服务器遇到了一个未曾预料的状况,导致它无法完成对请求的处理。通常是由于服务器端应用程序的Bug引起。 * `502 Bad Gateway`:**坏网关**。当服务器作为网关或代理,从上游服务器(如应用服务器)接收到无效响应时返回。 * `503 Service Unavailable`:**服务不可用**。服务器目前无法处理请求(由于超载或停机维护)。这通常是临时状态。响应头中可能包含`Retry-After`字段,告知客户端何时可以重试。 * `504 Gateway Timeout`:**网关超时**。服务器作为网关或代理,未能及时从上游服务器收到响应。 #### 2、手动设置状态 在请求处理方法中,添加 ```java resp.setStatus(403); // 状态码 ``` **注意**:若不做处理只设置了状态码,那么代码还是会正常输出页面,只是浏览器获得的状态码为`403`。 Loading... ## 一、Java EE的标准目录结构 ```bat ROOT/ ├── *src/ │ ├── *main/ │ │ ├── java/ # Java源代码 │ │ ├── *resources/ # 资源文件 │ │ ├── *webapp/ # Web应用文件 │ │ │ ├── *WEB-INF/ │ │ │ │ ├── *web.xml # Web部署描述符 │ │ │ │ ├── classes/ # 编译的类文件 │ │ │ │ └── lib/ # 依赖的JAR文件 │ │ │ ├── index.html # 静态页面 │ │ │ ├── css/ │ │ │ ├── js/ │ │ │ └── images/ │ │ └── *webapp/ # 或者传统的webapp目录 │ └── test/ │ ├── java/ # 测试代码 │ └── resources/ # 测试资源 ├── target/ # 构建输出目录(Maven) ├── pom.xml # Maven配置文件 └── README.md ``` 带`*`为必须的目录结构 ## 二、创建JavaWeb工程 #### 1、选择Jakarta EE项目 <img src="https://pic.soki.me/file/piclist/image-20251021082935226.png" alt="image-20251021082935226" style="zoom:50%;" style=""> #### 2、添加Servlet依赖 <img src="https://pic.soki.me/file/piclist/image-20251021083034254.png" alt="image-20251021083034254" style="zoom:50%;" style=""> 创建即可。 ## 三、Servlet程序 #### 1、什么是Servlet **Servlet(Server Applet)**,全称 **Java Servlet**,是用 Java 编写的服务器端程序。它的核心使命是扩展服务器的功能,专门用于处理来自 Web 客户端的请求,并动态生成响应。 可以把它理解为一个专为 Web 请求定制的 Java 类。 #### 2、Servlet工作流程 <img src="https://pic.soki.me/file/piclist/image-20251021094258713.png" alt="image-20251021094258713" style="zoom: 33%;" style=""> #### 3、配置映射路径 ```java @WebServlet(urlPatterns = "/hello-servlet") ``` #### 4、获取向客户端响应的输出流 ```java PrintWriter out = resp.getWriter(); ``` #### 5、向客户端响应一个网页 ```java out.println("<html>"); out.println("<head>"); out.println("<title>hello</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>hello,world!</h1>"); out.println("</body>"); out.println("</html>"); ``` #### 6、关闭输出流 ```java out.close(); ``` #### 7、程序模板 在Java源文件根目录下,新建`cn.doooog.javaweb.servlet`包,创建`HelloServlet.java`类 ```java package cn.doooog.javaweb.servlet; import java.io.*; import jakarta.servlet.ServletException; import jakarta.servlet.http.*; import jakarta.servlet.annotation.*; @WebServlet(urlPatterns = "/hello-servlet") public class HelloServlet extends HttpServlet { @Override public void init() { } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter out = resp.getWriter(); // 业务代码 out.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } @Override public void destroy() { } } ``` **注意**:其中`req`为客户端请求数据,`resp`为服务端响应数据,`@WebServlet`注解定义了该类的网络路径与别名。 #### 8、处理响应字符编码 ```java // 设置响应信息的字符编码 resp.setCharacterEncoding("utf-8"); // 设置mime类型:通知浏览器使用此字符编码来处理响应数据 resp.setContentType("text/html;charset=utf-8"); ``` #### 9、处理请求字符编码 ```java // 处理请求信息的字符编码 req.setCharacterEncoding("utf-8"); // 获取请求信息的参数 String 参数名 = req.getParameter("参数名"); ``` ## 四、Servlet生命周期 #### 1、Servlet容器创建Servlet实例 #### 2、初始化`init()` #### 3、处理客户端请求`service()` #### 4、销毁`destroy()` #### 5、流程图:  ## 五、Servlet实例创建时机 Servlet对象由Servlet容器负责创建,创建的时机可以使用`loadOnStartup`属性来配置 ```java @WebServlet(urlPatterns = "/hello-servlet", loadOnStartup = 1) ``` `loadOnStartup`的值必须为整数 当值`>=0`时,表示在容器启动时就创建该Servlet对象; 当值`<0`或不设置时,表示在请求访问该对象时才会被创建; 整数值越小,该Servlet启动时优先级就越高,就越先启动; 当与其他Servlet的值相同时,容器会自动选择启动顺序。 ## 六、Servlet实例初始化 在初始化时通过`initParams`属性来传初始化参数,参数定义需要用到`@WebInitParam()`注解。 ```java @WebServlet(urlPatterns = "/hello-servlet", initParams = { // 传入字符编码类型 @WebInitParam(name = "charSet", value = "utf-8") }) ``` 获取传入的初始化参数 ```java public class HelloServlet extends HttpServlet { // 获取初始化参数 private ServletConfig config; // 初始化函数 @Override public void init() { config = this.getServletConfig(); System.out.println(config.getInitParameter("charSet")) } } ``` ## 七、HTTP状态码 #### 1、分类 ##### `1xx` - 信息性状态码(Informational) 表示请求已被接收,正在继续处理。这是一个临时响应。 **含义**:服务器收到了请求,但请求者需要继续等待最终响应。 **常见场景**:在发送最终HTTP响应之前,提前告知客户端一些信息。客户端在收到1xx响应后,应等待服务器最终的响应(如200或错误码)。 **常见状态码**: * `100 Continue`:客户端应继续其请求。通常用于客户端在发送大型请求体之前,先询问服务器是否愿意接受该请求。 * `101 Switching Protocols`:客户端要求服务器切换协议(例如,从HTTP升级到WebSocket),服务器已同意切换。 * `102 Processing`(WebDAV):服务器已收到并正在处理请求,但尚未有最终响应。用于防止客户端超时。 ##### `2xx` - 成功状态码(Success) 表示请求已被服务器成功接收、理解并处理。 **含义**:客户端的请求成功了。 **常见场景**:一切正常,服务器执行了客户端所期望的操作。 **常见状态码**: * `200 OK`:**最常见的成功状态码**。请求成功,响应报文中包含了请求的结果(如HTML页面、JSON数据等)。 * `201 Created`:请求成功,并且服务器创建了新的资源(例如,通过POST方法创建了一个新用户)。通常在响应头`Location`中会包含新资源的URL。 * `202 Accepted`:请求已被接受,但尚未处理完成。适用于异步任务,例如请求已进入队列等待处理。 * `204 No Content`:服务器成功处理了请求,但响应报文中不包含任何内容(没有响应体)。常见于AJAX请求,客户端只需知道操作成功,无需更新页面。 ##### `3xx` - 重定向状态码(Redirection) 表示需要客户端采取进一步的操作才能完成请求。 **含义**:请求的资源位置发生了变化,或者需要其他操作来获取资源。 **常见场景**:URL已更改,需要跳转到新的地址。 **常见状态码**: * `301 Moved Permanently`:**永久重定向**。请求的资源已被**永久**分配了新的URI。以后的请求应使用新的URI。搜索引擎会更新其链接。 * `302 Found`:**临时重定向**。请求的资源**临时**从不同的URI响应请求。以后的请求**应该**继续使用原始URI。搜索引擎不会更新链接。 * `304 Not Modified`:**未被修改**。当客户端使用缓存,并通过请求头(如`If-Modified-Since`)询问资源是否更新时,如果资源未修改,服务器会返回此状态码,告诉客户端直接使用本地缓存。这可以节省带宽。 ##### `4xx` - 客户端错误状态码(Client Error) 表示客户端看起来可能发生了错误,妨碍了服务器的处理。 **含义**:**错误在客户端**。例如,请求包含语法错误、无法验证身份或请求了不存在的资源。 **常见场景**:用户输入了错误的URL、没有权限访问某个页面、请求格式错误等。 **重要状态码**: * `400 Bad Request`:**坏请求**。服务器无法理解请求的格式。通常是请求的语法有误(如JSON格式错误)。 * `401 Unauthorized`:**未授权**。请求需要用户认证。客户端必须提供正确的认证信息(如用户名和密码)。 * `403 Forbidden`:**禁止访问**。服务器理解请求,但拒绝执行。与401不同,即使提供了认证信息,也因为没有权限而无法访问。 * `404 Not Found`:**最著名的错误码**。服务器无法找到请求的资源。通常是因为URL错误或资源已被删除。 * `429 Too Many Requests`:**请求过于频繁**。客户端在给定的时间内发送了太多请求(“限速”)。 ##### `5xx` - 服务器错误状态码(Server Error) 表示服务器在处理请求的过程中发生了错误。 **含义**:**错误在服务器端**。客户端请求有效,但服务器自身无法完成请求。 **常见场景**:服务器代码有bug、数据库连接失败、服务器过载等。 **重要状态码**: * `500 Internal Server Error`:**通用的服务器错误**。服务器遇到了一个未曾预料的状况,导致它无法完成对请求的处理。通常是由于服务器端应用程序的Bug引起。 * `502 Bad Gateway`:**坏网关**。当服务器作为网关或代理,从上游服务器(如应用服务器)接收到无效响应时返回。 * `503 Service Unavailable`:**服务不可用**。服务器目前无法处理请求(由于超载或停机维护)。这通常是临时状态。响应头中可能包含`Retry-After`字段,告知客户端何时可以重试。 * `504 Gateway Timeout`:**网关超时**。服务器作为网关或代理,未能及时从上游服务器收到响应。 #### 2、手动设置状态 在请求处理方法中,添加 ```java resp.setStatus(403); // 状态码 ``` **注意**:若不做处理只设置了状态码,那么代码还是会正常输出页面,只是浏览器获得的状态码为`403`。 最后修改:2025 年 10 月 21 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 👆请简单粗暴地爱我。