Servlet 学习笔记

Servlet 概念

Servlet( Server Applet ),全称Java Servlet是运行在Web服务器或应用服务器上的程序,是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层

个人理解Servlet就是作为客户端界面和服务器端中间层的处理程序。

作用主要是
  1. 接受用户端(浏览器)的Request请求数据
  2. 处理请求并生成结果,可能需要访问数据库。
  3. 返回Response响应到用户端。

Servlet生命周期

1.init()方法,Servlet 通过调用 init () 方法进行初始化。

init()方法只在第一次创建Servlet时被调用一次,在后续每次用户请求时不再调用。

2. service()方法,Servlet 调用 service() 方法来处理客户端的请求。

service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。

doGet() 和 doPost() 方法是每次服务请求中最常用的方法。

2.1 doGet()方法

GET 请求来自于:1. 一个 URL 的正常请求,2. 一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。

GET调用会在URL里显示正传送给SERVLET的数据,这在系统的安全方面可能带来一些问题,比如用户登录,表单里的用户名和密码需要发送到服务器端, 若使用Get调用,就会在浏览器的URL中显示用户名和密码。

2.2 doPost()方法

POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。

Post通过HTTP post机制,将表单内的信息放在Form中传递给服务器。好处是可以隐藏传送给服务器的任何数据。Post适合发送大量的数据

3. destroy()方法,Servlet 通过调用 destroy() 方法终止(结束)。

destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。
destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

4. 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

实现Servlet接口的三种方式

1. Servlet接口

Servlet 类提供了五个方法,其中三个生命周期方法和两个普通方法。
但是通过实现Servlet接口来编写Servlet必须要实现接口中定义的所有方法,还需要自己手动的维护ServletConfig这个对象的引用,所以基本不会用这种方法实现Servlet。

以下是Servlet接口代码:

package javax.servlet;

import java.io.IOException;

public interface Servlet {
	 //生命周期方法:当Servlet第一次被创建对象时执行该方法,该方法在整个生命周期中只执行一次
    void init(ServletConfig var1) throws ServletException;
        
	//生命周期方法:对客户端响应的方法,该方法会被执行多次,每次请求该servlet都会执行该方法
    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
    
	//生命周期方法:当Servlet被销毁时执行该方法
    void destroy();
    
    //两个普通方法
	ServletConfig getServletConfig();
	
    String getServletInfo();
    
	
}

1.1 ServletRequest接口
public interface ServletRequest {
  
    int getContentLength();//返回请求主体的字节数
 
    String getContentType();//返回主体的MIME类型
 
    String getParameter(String var1);//返回请求参数的值
 
}

getParameter是在ServletRequest中最常用的方法,可用于获取查询字符串的值。

例:URL = "http://localhost:8080/ProjectName/FormName?username=root&password=123”
利用**getParameter(“username”)**即可得到username的值为root

1.2 ServletResponse接口
public interface ServletResponse {
    String getCharacterEncoding();
 
    String getContentType();
 
    ServletOutputStream getOutputStream() throws IOException;
 
    PrintWriter getWriter() throws IOException;
 
    void setCharacterEncoding(String var1);
 
    void setContentLength(int var1);
 
    void setContentType(String var1);
 
    void setBufferSize(int var1);
 
    int getBufferSize();
 
    void flushBuffer() throws IOException;
 
    void resetBuffer();
 
    boolean isCommitted();
 
    void reset();
 
    void setLocale(Locale var1);
 
    Locale getLocale();
}

其中getWriter方法,它返回了一个可以向客户端发送文本的的Java.io.PrintWriter对象。

在发送HTML之前,应该先调用setContentType(“text/html;charset=UTF-8”)方法

  • 将“text/html”作为一个参数传入,告诉浏览器响应的内容类型为HTML,需要以HTML的方法解释响应内容而不是普通的文本
  • 加上“charset=UTF-8”改变响应的编码方式以防止发生中文乱码现象。

2. GenericServlet类

GenericServlet 是一个抽象类,为Servlet接口中的所有方法提供了默认的实现。通过继承该类,实现Servlet只需要更改自己的需要的部分。

在 GenericServlet 中,主要完成了以下任务:

  • 将 init() 中的 ServletConfig 参数赋给了一个内部的ServletConfig引用从而来保存ServletConfig对象,可以由 getServletConfig()方法获得;
  • 为Servlet 所有方法提供默认实现;
  • 可以直接调用 ServletConfig 中的方法;

如果继承GenericServlet类的话,我们必须重写 service() 方法来对处理请求。

GenericServlet类的基本结构

abstract class GenericServlet implements Servlet,ServletConfig{
 
   //GenericServlet通过将ServletConfig赋给类级变量
   private ServletConfig Config;
 
   public void init(ServletConfig servletConfig) throws ServletException {

      this.servletConfig=servletConfig;

      /*自定义不带参数的init()的原因是?见下方*/
      this.init();
   }
   
   //自定义的init()方法,可以由子类覆盖  
   public void init(){
  
   }
 
   //实现service()空方法,并且声明为抽象方法,强制子类必须实现service()方法 
   public abstract void service(ServletRequest request,ServletResponse response) 
     throws ServletException,java.io.IOException{
   }
 
   //实现空的destroy方法
   public void destroy(){ }
}

自定义不带参数init()方法的原因:
如果在类中覆盖了GenericServlet抽象类的init(ServletConfig servletConfig)方法,那么程序员就必须手动的去维护ServletConfig对象了,这样会给程序员带来很大的麻烦。

这个不带参数的 init() 方法,是在ServletConfig对象被赋给ServletConfig引用后,由第一个带参数的init(ServletConfig servletconfig)方法调用的,那么这意味着,当程序员如果需要覆盖这个GenericServlet的初始化方法,则只需要覆盖那个不带参数的init( )方法就好了,此时,servletConfig对象仍然有GenericServlet保存着。

3. HttpServlet类

HttpServlet 也是一个抽象类,它进一步继承并封装了 GenericServlet,使得使用更加简单方便,由于是扩展了 Http 的内容,所以还需要使用 HttpServletRequest 和 HttpServletResponse,这两个类分别是 ServletRequest 和 ServletResponse 的子类。

开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。

abstract class HttpServlet extends GenericServlet{
 
   //HttpServlet类中的service()方法
   protected void service(HttpServletRequest httpServletRequest,
                       HttpServletResponse httpServletResponse){
        //该方法通过httpServletRequest.getMethod()判断请求类型,
        //并调用以下方法之一:doGet,doPost,doHead,doPut,doTrace,doOptions和doDelete
        //其中doGet() doPost()是最常用的
        //所以,通过继承HttpServlet类,不再需要覆盖service方法,只需要覆盖doGet或者doPost就好了。
        //以下具体实现省略
   }
 
   //必须实现父类GenericServlet的service()方法
   public void service(ServletRequest servletRequest,ServletResponse servletResponse){
      HttpServletRequest request;
      HttpServletResponse response;
      try{
         request=(HttpServletRequest)servletRequest;
         response=(HttpServletResponse)servletResponse;
      }catch(ClassCastException){
         throw new ServletException("non-http request or response");
      }
      //调用自己的service()方法
      this.service(request,response);
   }
}

HttpServlet有两个特性是GenericServlet所不具备的:

  1. 不用覆盖service方法,而是覆盖doGet()或者doPost()方法。在少数情况,还会覆盖其他的5个方法。
  2. 使用的是HttpServletRequest和HttpServletResponse对象。

3.1 HttpServletRequest接口

HttpServletRequest扩展于ServletRequest接口,并添加了几个方法。
因为Request代表请求,所以我们可以通过该对象分别获得HTTP请求的请求行,请求头和请求体。

String getContextPath();//返回请求上下文的请求URI部分

Cookie[] getCookies();//返回一个cookie对象数组

String getHeader(String var1);//返回指定HTTP标题的值

String getMethod();//返回生成这个请求HTTP的方法名称

String getQueryString();//返回以GET方式提交,URL地址后的参数字符串

HttpSession getSession();//返回与这个请求相关的会话对象	

3.2 HttpServletResponse接口

HttpServletResponse接口,它继承自ServletResponse接口,专门用来封装HTTP响应消息。
由于HTTP请求消息分为状态行,响应消息头,响应消息体三部分,因此,在HttpServletResponse接口中定义了向客户端发送响应状态码,响应消息头,响应消息体的方法。

void addCookie(Cookie var1);//给这个响应添加一个cookie

void addHeader(String var1, String var2);//给这个请求添加一个响应头

void sendRedirect(String var1) throws IOException;//发送一条响应码,讲浏览器跳转到指定的位置

void setStatus(int var1);//设置响应行的状态码


参考资料:
菜鸟教程Servlet
JavaWeb——Servlet(全网最详细教程包括Servlet源码分析)

源码来自:https://pan.quark.cn/s/a4b39357ea24 ### 操作指南:洗衣机使用方法详解#### 1. 启动与水量设定- **使用方法**:使用者必须首先按下洗衣设备上的“启动”按键,同时依据衣物数量设定相应的“水量选择”旋钮(高、中或低水量)。这一步骤是洗衣机运行程序的开端。- **运作机制**:一旦“启动”按键被触发,洗衣设备内部的控制系统便会启动,通过感应器识别水量选择旋钮的位置,进而确定所需的水量高度。- **技术执行**:在当代洗衣设备中,这一流程一般由微处理器掌管,借助电磁阀调控进水量,直至达到指定的高度。#### 2. 进水过程- **使用说明**:启动后,洗衣设备开始进水,直至达到所选的水位(高、中或低)。- **技术参数**:水量的监测通常采用浮子式水量控制器或压力感应器来实现。当水位达到预定值时,进水阀会自动关闭,停止进水。- **使用提醒**:务必确保水龙头已开启,并检查水管连接是否牢固,以防止漏水。#### 3. 清洗过程- **使用步骤**:2秒后,洗衣设备进入清洗环节。在此期间,滚筒会执行一系列正转和反转的动作: - 正转25秒 - 暂停3秒 - 反转25秒 - 再次暂停3秒- **重复次数**:这一系列动作将重复执行5次,总耗时为280秒。- **技术关键**:清洗环节通过电机驱动滚筒旋转,利用水流冲击力和洗衣液的化学效果,清除衣物上的污垢。#### 4. 排水与甩干- **使用步骤**:清洗结束后,洗衣设备会自动进行排水,将污水排出,然后进入甩干阶段,甩干时间为30秒。- **技术应用**:排水是通过泵将水抽出洗衣设备;甩干则是通过高速旋转滚筒,利用离心力去除衣物上的水分。- **使用提醒**:...
代码下载地址: https://pan.quark.cn/s/c289368a8f5c 在安卓应用开发领域,构建一个高效且用户友好的聊天系统是一项核心任务。 为了协助开发者们迅速达成这一目标,本文将分析几种常见的安卓聊天框架,并深入说明它们的功能特性、应用方法及主要优势。 1. **环信(Easemob)** 环信是一个专为移动应用打造的即时通讯软件开发套件,涵盖了文本、图片、语音、视频等多种消息形式。 通过整合环信SDK,开发者能够迅速构建自身的聊天平台。 环信支持消息内容的个性化定制,能够应对各种复杂的应用场景,并提供多样的API接口供开发者使用。 2. **融云(RongCloud)** 融云作为国内领先的IM云服务企业,提供了全面的聊天解决方案,包括一对一交流、多人群聊、聊天空间等。 融云的突出之处在于其稳定运行和高并发处理性能,以及功能完备的后台管理工具,便于开发者执行用户管理、消息发布等操作。 再者,融云支持多种消息格式,如位置信息、文件传输、表情符号等,显著增强了用户聊天体验。 3. **Firebase Cloud Messaging(FCM)** FCM由Google提供的云端消息传递服务,可达成安卓设备与服务器之间的即时数据交换。 虽然FCM主要应用于消息推送,但配合Firebase Realtime Database或Firestore数据库,开发者可以开发基础的聊天软件。 FCM的显著优势在于其全球性的推送网络,保障了消息能够及时且精确地传输至用户。 4. **JMessage(极光推送)** 极光推送是一款提供消息发布服务的软件开发工具包,同时具备基础的即时通讯能力。 除了常规的文字、图片信息外,极光推送还支持个性化消息,使得开发者能够实现更为复杂的聊天功能。 此...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值