💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # Servlet ## 什么是 Servlet 在 Web 容器中有浏览器访问地址的特殊 Java 类。 在开发中,Servlet 一般充当的就是控制器的角色。 ## MVC模式 MVC模式(Model-View-Controller)是软件工程的一种软件框架,系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller): Controller——负责转发请求,对请求进行处理 View——负责界面显示 Model——业务功能编写、数据存取操作实现、实体类等 在JSP/Servlet开发的软件系统中,这三个部分的描述如下所示: ![](https://box.kancloud.cn/84e22786d607684943558bf0725b2282_600x232.png) 1. Web浏览器发送HTTP请求到服务端,被Controller(Servlet)获取并进行处理(例如参数解析、请求转发) 2. Controller(Servlet)调用核心业务逻辑——Model部分,获得结果 3. Controller(Servlet)将逻辑处理结果交给View(JSP),动态输出HTML内容 4. 动态生成的HTML内容返回到浏览器显示 > MVC模式在Web开发中的好处是非常明显,它规避了JSP与Servlet各自的短板,Servlet只负责业务逻辑而不会通过append()方法动态生成HTML代码;JSP中也不会充斥着大量的业务代码。这大大提高了代码的可读性和可维护性。 ## 如何创建 Servlet 创建带注解的 Servlet *第一个 Servlet* ~~~ package com.ntqn.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class IndexServlet */ @WebServlet("/IndexServlet.php") public class IndexServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * Default constructor. */ public IndexServlet() { // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.getWriter().append("<h1>Hello,Sevlet</h1>"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } } ~~~ > 1、需要继承 HttpServlet; > 2、相关 Servlet 的类文件不是存在于 JDK 的标准开发包中的,而是存在于 Tomcat 的 lib 中servlet-api.jar 中 > 3、在 Servlet 中存在 doPost 和 doGet 方法,我们一般会任一方法中调用另外一个方法,因为doPost 和 doGet 的客户端请求不一样,但是一般业务处理逻辑都是一样的; > 4、在类的注解中 @WebServlet("/IndexServlet2.php"),表示执行该 Servlet 的请求路径; > 5、Servlet 可以在 Eclipse 中进行引导式的创建,但是其本质还是一个普通的 class 文件,并无特殊之处,只不过是需要 web 容器的支持才能运行的。 ## Servlet的页面跳转 **进行服务器的跳转 - 转发** `request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);` 在实际开发中,我们会把 jsp 页面放到 WEB-INF 中,在 WEB-INF 中的资源属于服务端的资源,是不能被外部链接直接访问的。 在 WebContent 的直接目录下,我们一般放置静态资源,比如图片、CSS、Javascript 等。但是也有特殊的情况,有的应用做的比较好,会被上述的静态资源也通过 Servlet 进行转化后访问。 **进行客户端的跳转 - 重定向** `response.sendRedirect("pages/index3.jsp");` 在客户端跳转中是**不可以**使用` request.setAttribute()` 进行赋值后在跳转到的 jsp 通过 **request.getAttribute()** 获取值的,一定要理解什么是服务器端跳转,什么是客户端跳转,和值应该用什么方式传递。 > **整个 Web 应用程序的开发可以理解为就是一个传值的游戏。**