Servlet 是 Java EE(Java Enterprise Edition)平台上的一项技术,用于创建动态 Web 应用程序。Servlet 是运行在服务器端的小程序,它们可以响应客户端的请求并生成动态的 Web 内容。Servlet 通常用于处理 HTTP 请求并生成 HTTP 响应,常见的使用场景包括处理表单提交、生成动态网页内容、管理会话等。
Servlet 的基本工作流程
-
客户端请求:客户端(通常是浏览器)向服务器发送一个 HTTP 请求。
-
服务器接收请求:Web 服务器(如 Tomcat、Jetty 等)接收客户端的请求,并将请求转发给适当的 Servlet。
-
Servlet 处理请求:Servlet 接收请求后,处理请求参数,执行相应的业务逻辑,生成动态内容。
-
生成响应:Servlet 将生成的动态内容(通常是 HTML)封装在 HTTP 响应中,并发送回客户端。
-
客户端接收响应:客户端接收并处理服务器发送的响应,展示动态内容。
编写 Servlet 的基本步骤
-
创建一个 Servlet 类:该类需要继承
HttpServlet
类,并重写doGet
或doPost
方法来处理 GET 或 POST 请求。 -
配置 Servlet:在 web.xml 文件中配置 Servlet 或使用注解来配置 Servlet。
-
部署并运行:将编写好的 Servlet 部署到 Web 服务器上,并启动服务器进行测试。
示例代码
以下是一个简单的 Servlet 示例,它处理 GET 请求并生成一个简单的 HTML 响应:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应内容类型
response.setContentType("text/html");
// 获取响应的输出流
PrintWriter out = response.getWriter();
// 生成 HTML 响应
out.println("<html><body>");
out.println("<h1>Hello, World!</h1>");
out.println("</body></html>");
}
}
详细解释
-
类声明:
public class HelloServlet extends HttpServlet
表明这是一个继承自HttpServlet
的 Servlet 类。 -
注解配置:
@WebServlet("/hello")
注解用来配置这个 Servlet 映射到的 URL 路径为/hello
。 -
重写
doGet
方法:doGet
方法用来处理 GET 请求。HttpServletRequest
对象封装了请求的所有信息,HttpServletResponse
对象用于生成响应。 -
设置响应类型:
response.setContentType("text/html");
设置响应内容的类型为 HTML。 -
获取输出流:
PrintWriter out = response.getWriter();
获取用于发送响应的输出流。 -
生成 HTML 响应:使用
out.println
方法输出 HTML 内容。
总结
Servlet 是 Java EE 技术栈中的核心组件,用于创建动态 Web 应用程序。通过 Servlet,开发者可以处理客户端请求、执行服务器端逻辑、生成动态内容并返回给客户端。在实际开发中,Servlet 通常与 JSP、JSTL 以及其他 Java EE 组件配合使用,以构建功能强大且灵活的 Web 应用程序。
==========================================================================================
Spring MVC 的工作流程
Spring MVC 是基于 Servlet 构建的,但它提供了更高层次的抽象,使得开发 Web 应用程序更加方便。下面是 Spring MVC 的基本工作流程:
- 客户端请求:客户端发送一个 HTTP 请求到服务器。
- DispatcherServlet:这个请求被 Spring 的
DispatcherServlet
接收。DispatcherServlet
是一个前端控制器(Front Controller),它本质上是一个 Servlet。 - 处理请求:
DispatcherServlet
根据请求 URL 和配置,选择合适的@Controller
类和方法来处理这个请求。 - 执行控制器方法:
@Controller
类的方法被调用,处理请求参数并执行相应的业务逻辑。 - 返回视图:控制器方法返回一个视图名(或直接返回数据),
DispatcherServlet
会根据这个视图名选择合适的视图(如 JSP)来渲染响应。 - 生成响应:视图生成最终的 HTML 内容,
DispatcherServlet
将这个内容返回给客户端。
3. @Controller 示例
以下是一个简单的 @Controller
示例:
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello(@RequestParam(name="name", required=false, defaultValue="World") String name, Model model) {
model.addAttribute("name", name);
return "hello";
}
}
详细解释
- 类声明:
@Controller
注解标识HelloController
类是一个控制器。 - 处理请求:
@GetMapping("/hello")
注解表示该方法处理 GET 请求,URL 为/hello
。 - 请求参数:
@RequestParam
注解用于绑定请求参数到方法参数name
,并提供默认值。 - 返回视图:方法返回一个字符串
"hello"
,表示视图名为hello
。视图解析器会找到名为hello.jsp
或其他配置的视图。
4. Servlet 和 @Controller 的关系
DispatcherServlet
是 Spring MVC 的核心组件,它本身是一个 Servlet,用来接收和分发 HTTP 请求。@Controller
是处理请求的组件,DispatcherServlet
会将请求转发给相应的@Controller
。- 通过这种方式,Spring MVC 框架将 Servlet 的复杂性隐藏在
DispatcherServlet
后面,开发者只需要关注业务逻辑,而不需要处理低层的 HTTP 细节。
总结来说,Spring MVC 框架通过 DispatcherServlet
将请求转发给标有 @Controller
注解的控制器类,使得开发 Web 应用程序更加简洁和高效。@Controller
与传统的 Servlet 紧密相关,但提供了更高层次的抽象和更丰富的功能。
在 Spring MVC 应用中,通常只会配置一个 DispatcherServlet。DispatcherServlet 是 Spring MVC 框架的核心前端控制器(Front Controller),它负责接收所有的 HTTP 请求,并将它们分派给适当的处理程序(如控制器方法)。