企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] ## 问题01:Servlet的概念及体系结构。 * 继承了HttpServlet的Java类(实现了Servlet接口) * 功能强大(Java API、Servlet API) * 性能高效(采用线程而非进程) > servlet在处理请求采用的是线程,而不是一个进程。web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法。 > 但是如果访问了同一个资源的话,就有可能引发线程安全问题。 > 采用synchronized关键字解决 ![](https://img.kancloud.cn/81/14/8114fb8ec0fff6ca4e7aa39ee3c0a81d_622x398.png) * [ ] serializable是java.io包中的序列化接口; * [ ] servlet接口、servletConfig接口定义了servlet的基本方法(用于接收和响应用户的请求)并封装了servlet的相关配置信息; * [ ] GenericServlet对象是一个抽象类,实现了上述的3个接口,并为servlet接口及ServletConfig接口提供了部分实现; * [ ] httpServlet子类继承了GenericServlet,并对其中http请求处理进行了实现。 ## 问题02:Servlet的生命周期。 ![](https://img.kancloud.cn/51/d1/51d1bb4bca19a061e2caaf86ff3fc686_512x416.png) * [ ] **constructor**创建实例 > 由服务器容器自动完成—— 当客户端向Servlet容器**首次**发出HTTP请求访问Servlet时——**只调用一次** * [ ] **init**初始化 > 由服务器容器自动完成—— 当客户端向Servlet容器**首次**发出HTTP请求访问Servlet时——**只调用一次** ``` public void init(ServletConfig config) throws ServletException { String code = config.getInitParameter("code"); System.out.println("Servlet初始化编码为:"+code); } ``` * [ ] **service**运行 > 根据用户请求进行执行—— 当客户端向Servlet容器发出HTTP请求访问Servlet时——**每次请求都会调用** ``` public void service(ServletRequest req, ServletResponse res) ``` > Dispatches client requests to the protected service method. There's no need to override this method. ``` protected void service(HttpServletRequest req, HttpServletResponse resp) ``` > Receives standard HTTP requests from the public service method and **dispatches** them to the **doMethod** methods defined in this class. This method is an HTTP-specific version of the javax.servlet.Servlet.service method. **There's no need to override this method**. * [ ] **destroy**销毁 > 由服务器容器自动完成—— 当服务器**关闭**或web应用**被移除出容器**时——**只调用一次** ![](https://img.kancloud.cn/08/ec/08ec6ed56d56224429e82b54570e0534_862x430.png) ## 问题03:Servlet的创建与配置。 ### Servlet的创建 ![](https://img.kancloud.cn/4d/53/4d53bb4562c570fd865d71d4ad22c06c_1144x870.png) ### Servlet的注解配置 ![](https://img.kancloud.cn/8b/c1/8bc15cf1a0ace2756048895e245fc2f0_1045x225.png) ### Servlet的XML配置 ![](https://img.kancloud.cn/77/fe/77fe9fbca9563f27a1369797759f9961_999x386.png) ## 问题04:如何控制Servlet的加载 * [ ] 注解方式 ``` loadOnStartup=number ``` ![](https://img.kancloud.cn/ed/f8/edf843e49ed3025bb4874a4063ad2c33_165x75.png) * [ ] 配置文件 ``` <load-on-startup>number<load-on-startup> ``` ![](https://img.kancloud.cn/e6/92/e692b720b621da578e2d360951baa966_400x53.png) load-on-startup 是 web.xml 中的一个节点,是 servlet 元素的子元素,用来标记 Servlet 容器启动时是否初始化当前 Servlet,以及当前 Servlet 的初始化顺序。 load-on-startup 元素取值规则如下: 1. 它的取值必须是一个整数; 2. 当值小于 0 或者没有指定时,则表示容器在该 Servlet 被首次请求时才会被加载; 3. 当值大于 0 或等于 0 时,表示容器在启动时就加载并初始化该 Servlet,取值越小,优先级越高; 4. 当取值相同时,容器就会自行选择顺序进行加载。 > @WebServlet 注解的 loadOnStartup 属性与 web.xml 中的 load-on-startup 元素相对应,取值的规则和含义相同。 ## 问题05:Servlet编码初始化(读取编码) ### 配置默认值 ![](https://img.kancloud.cn/96/57/965792afc5ef55b9434b14d8d242b513_906x214.png) ### ServletConfig读取配置 ![](https://img.kancloud.cn/9f/3d/9f3d923b6e60961dc80b21e6683832f8_824x188.png) ``` response.setContentType("text/html;charset="+code); response.getWriter().print("编码已经设置为:"+code); ``` ![](https://img.kancloud.cn/6c/15/6c159fb60bdb25a81d9bcc5ac7f8f07a_377x120.png) ## 问题06:ServletContext的获取 ``` ServletContext application = request.getServletContext(); ``` > 可以通过上述方法,来获得Servlet的一些基本信息,或者是将部分数据存储在该对象中。 ## 问题07:Servlet开发步骤 1. 处理编码 2. 接收视图层传递的参数 3. 进行必要的数据验证和类型转换,若验证失败跳转到步骤9 4. 对数据进行封装 5. 初始化模型层对象,并调用模型层方法 6. 初始化结果变量保存模型层方法处理结果 7. 对必要的信息或者是标识进行保存 8. 根据处理结果,如果符合预期,请求转发或者重定向到**正确**页面 9. 如果不符合预期,请求转发或者重定向到**错误**页面