HttpServlet学习中的常见问题(个人珍藏笔记)

目录

一、HttpServlet

1.1核心方法

1.2、面试:谈谈Servlet的生命周期

二、HttpServletRequest

2.1、核心方法

2.2、如何获取请求头

三、HttpServletResponse

3.1核心方法

四、setCharacterEncoding和setContentType区别?

五、Json格式的转换问题

5.1 ObjectMapper类的readValue方法

5.2 ObjectMapper类的writeValueAsString方法

六、对页面进行刷新

七、重定向网页的两种实现

八、对jquery方法中的success: function的理解

九、对JOSN.stringify()和JOSN.parse()的认识

十、jquery的自动转换类型机制


一、HttpServlet

1.1核心方法

方法名称调用时机作用及扩展解释
init在HttpServlet实例化之后调用一次

作用:用来初始化;

扩展解释:首次访问的到时会实例化,创建出HttpServlet实力会调用一次;

destroy在HttpServlet实例不再使用时调用一次

作用:关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动;

扩展解释:他是通过8005端口控制Tomcat,来告诉Tomcat执行destroy;但是,不一定真的可以调用到,Tomcat关闭(杀进程:比如点击x,来关闭idea,或者拔电源...),则不调用HttpServlet;

service收到HTTP请求时调用

作用:通过Tomcat收到的请求来调用service,service根据请求中不同的方法,调用不同的doXXX;

扩展解释:实际开发中,很少重写service,一般重写doXXX就可以了;

doGet收到GET请求时调用作用:根据请求计算响应
doPost收到POST请求时调用作用:根据请求计算响应
doPut/doDelete/doOptions/...收到对应的请求时调用作用:根据请求计算响应

1.2、面试:谈谈Servlet的生命周期

什么是声明周期?

        声明周期实际上就是,正确的时间干正确的事情;

回答:(根据以下,可以简略回答)

        初始阶段,实例化的时候,会调用一次init;

        每次收到请求,就会调用service,service根据请求中不同的方法,调用不同的doXXX;

        结束销毁之前,调用destroy,用来关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动;


二、HttpServletRequest

2.1、核心方法

方法描述
String getProtocol()返回请求协议的名称和版本。
String getMethod()返回请求的 HTTP 方法的名称,例如,GET、POST 或 PUT。
String getRequestURI()从协议名称直到 HTTP 请求的第一行的查询字符串中,返回该请求的 URL 的一部分。
String getContextPath()返回指示请求URL的一级路径
String getQueryString()返回包含在路径后的请求 URL 中的查询字符串。

Enumeration

getHeaderNames()

返回一个枚举,包含在该请求中包含的所有的头名。
String getHeader(Stringname)以字符串形式返回指定的请求头的值。

2.2、如何获取请求头

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

@WebServlet("/showRequest")
public class showRequest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求头
        Enumeration<String> headerName = req.getHeaderNames();
        while(headerName.hasMoreElements()) {
            String name = headerName.nextElement();
            String value = req.getHeader(name);
            stringBuilder.append(name + ":" + value);
            stringBuilder.append("<br>");
        }
        resp.setContentType("text/html");
        resp.getWriter().write(stringBuilder.toString());
    }
}

三、HttpServletResponse

3.1核心方法

        HttpServletRequest的方法都是get系列,HttpServletResponse的方法都是set系列,doGet/doPost 这样的方法里的HttpServletResponse对象都是一个空对象;

方法描述
void setStatus(int sc)为该响应设置状态码。
void setHeader(String name,String value)

设置一个带有给定的名称和值的 header. 如果 name 已经存在,

则覆盖旧的值.

void addHeader(Stringname, String value)

添加一个带有给定的名称和值的 header. 如果 name 已经存在,

不覆盖旧的值, 并列添加新的键值对

void setContentType(Stringtype)设置被发送到客户端的响应的内容类型。

void

setCharacterEncoding(Stringcharset)

设置被发送到客户端的响应的字符编码(MIME 字符集)例如,UTF-8。
void sendRedirect(Stringlocation)使用指定的重定向位置 URL 发送临时重定向响应到客户端。
PrintWriter getWriter()用于往 body 中写入文本格式数据.

OutputStream

getOutputStream()

用于往 body 中写入二进制格式数据.


四、setCharacterEncoding和setContentType区别?

setCharacterEncoding只能设置字符编码;

setContentType不仅可以设置字符编码,还可以设置文档内容类型;


五、Json格式的转换问题

5.1 ObjectMapper类的readValue方法

        可以把json格式的数据转换成java的对象,第一个参数是可以是字符串也可以是输入流,第二个参数是类对象,是要解析出的结果的对象的类;

例如:(json格式的数据转换成java的对象)

import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

class Student {
    //1.所有属性必须要是公开的
    //2.必须要有无参的构造方法
    public int studentId;
    public int studentName;
}
public class Post extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        Student s = objectMapper.readValue(req.getInputStream(), Student.class);
        //在服务器打印日志
        System.out.println(s.studentId);
        System.out.println(s.studentName);
        resp.setContentType("application/json; charset=utf8");
        //写入浏览器
        objectMapper.writeValue(resp.getWriter(), s);
    }
}

5.2 ObjectMapper类的writeValueAsString方法

可以把java的对象转换成json格式的数据;

例如:

import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

class Student {
    //1.所有属性必须要是公开的
    //2.必须要有无参的构造方法
    public int studentId;
    public String studentName;
}
@WebServlet("/json")
public class Post extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        Student s = objectMapper.readValue(req.getInputStream(), Student.class);
        //在服务器打印日志
        System.out.println(s.studentId);
        System.out.println(s.studentName);
        resp.setContentType("application/json; charset=utf8");
        //写入浏览器
        resp.getWriter().write(objectMapper.writeValueAsString(s));
    }
}

六、对页面进行刷新

例如:(每隔一秒对页面进行刷新)

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/autoRefresh")
public class AutoRefresh extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setHeader("refresh", "1");
        resp.getWriter().write(System.currentTimeMillis() + " ");
    }
}

解释:

        header中的refresh属性,值是一个“秒数”,浏览器会在时间到了之后自动刷新;

        虽然当前设置的时间是 1s 刷新一次,但是并不是精确的1000ms,会比1000ms略多一点,为什么呢?原因:调度要消耗时间、网络传输消耗时间、服务器响应、本身对ms级别的计时存在误差;


七、重定向网页的两种实现

如下代码:(方法一:设置状态,再跳转;方法二:一步到位)

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //方法一:设置状态,进行跳转
        resp.setStatus(302);
        resp.setHeader("Location", "https://www.baidu.com");
        //方法二:一步到位
        resp.sendRedirect("https://www.baidu.com");
    }
}

八、对jquery方法中的success: function的理解

代码如下:

            $.ajax({
                type: 'post',
                url: 'message',//这里是相对路径
                data: JSON.stringify(data),//这里放的是body的内容
                contentType: "application/json; charset=utf8",
                success: function(body) {
                    console.log("数据提交成功!");
                }
            });

解释和理解:

        上述代码浏览器给服务器发送了一个带有数据data的post请求,随后服务器接收到了请求,如果服务器能正确的处理请求,则会调用浏览器的success方法,而body就是服务器请求后返回的信息,但如果没有正确处理请求,发生错误,就会不会调用success方法,而是会调用jquery的error方法;

        以上,success就是一个回调函数,而浏览器用ajax请求服务器就是注册回调函数;


九、对JOSN.stringify()和JOSN.parse()的认识

JOSN.stringify(参数):

        JOSN.stringify()方法将一个 JavaScript 对象或值转换为 JSON 字符串,这就和 jackson 的writeValueAsString是一样的;

例如,如下代码:

<script>
    $('#d1').click(function(){ // button按钮触发点击事件
        $.ajax({
            url:'user',
            type:'post',
            data:JSON.stringify({'username':'jaychou','age':18}),//数据也需要转为JSON格式。
            contentType:'application/json; charset=utf8',//指定字符编码格式
            success:function (){
 
            }
        })
    })
</script>

JOSN.parse(参数):

        JOSN.parse()方法是将 JSON 字符串成转换成 JavaScript的对象或值,这就和 jackson 的readValue是一样的;


十、jquery的自动转换类型机制

如下代码

        function getMessages() {
            $.ajax({
                type: 'get',
                url: 'message',
                success: function(body) {//这里body由于jquery的特殊机制,已经转换成了数组
                    //业务逻辑
                    let container = document.querySelector('.container');
                    for(let i = 0; i < body.length; i++) {
                        let message = body[i];
                        let div = document.createElement('div');
                        div.className = 'row';
                        div.innerHTML = message.from + ' 对 ' + message.to + ' 说: ' + message.message;
                        container.appendChild(div);
                    }
                }
            });
        }

解释:

        以上代码,body是响应正文,本来是String类型,但是由于jquery的特殊机制,将body自动转换成了js的对象数组了,如果没有jquery做这件事情,就需要使用JSON.parse来完成;


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: HttpServlet的service方法是一个重要的方法,它是处理客户端请求的核心方法。当客户端发送请求时,服务器会调用HttpServlet的service方法来处理请求。在service方法,我们可以根据请求的类型(GET、POST、PUT、DELETE等)来执行相应的操作,例如读取请求参数、处理请求数据、生成响应等。此外,我们还可以在service方法实现一些自定义的逻辑,例如验证用户身份、记录日志等。总之,HttpServlet的service方法是一个非常重要的方法,它为我们提供了处理客户端请求的灵活性和可扩展性。 ### 回答2: HTTPServlet是一个Java EE的Servlet,用来处理HTTP请求和响应。HTTPServlet的具体实现,它会提供一个service方法,这个方法接收用户的Http请求,并作出响应。下面我会详细介绍HttpServlet的service方法。 1. 概述 Service()方法是为HTTPServlet的子类提供的实现HTTP请求处理方法。在service()方法,可以通过不同的参数类型,通过转发或者重定向请求,向客户端提供响应。 Service()方法有多个重载版本,其有大多数是用于处理请求的,而一些不需任何请求参数的方法,例如,doGet(),doPost()等。 2. 参数 在service()方法,接收到的参数为HttpServletRequest对象和 HttpServletResponse对象。由于这两个对象可以传递信息和状态,从而获取所需的响应或多个响应,所以非常重要。HttpServletRequest对象包含有关请求的信息,包括HTTP GET或POST所发送的数据。同样,HttpServletResponse对象包含有关响应的信息,包括HTTP响应代码、响应头、响应主体等。 3. 方法 HttpServlet的service方法必须存在,并且在不同的情况下会执行不同的方法,包括: - doGet(HttpServletRequest request, HttpServletResponse response):处理GET请求; - doPost(HttpServletRequest request, HttpServletResponse response):处理POST请求; - doPut(HttpServletRequest request, HttpServletResponse response):处理PUT请求; - doDelete(HttpServletRequest request, HttpServletResponse response):处理DELETE请求; - Service(HttpServletRequest request, HttpServletResponse response):在每次请求前,会调用 service()方法获取请求的 HTTP 方法并将请求调配到 doGet()、doPost()、doPut()、doDelete() 等方法之一。 4. 实现 HttpServlet的子类需要实现一些特定的方法,包括doGet()、doPost()、doPut()、doDelete()等。HttpServlet会根据请求的类型来调用不同的方法,如果需要实现自己的逻辑,可以重写这些方法,同时可以调用父类的方法。 在使用HttpServlet时,需要继承这个类,并根据需要重写类的不同方法来实现特定的功能。在代码,通常对"service"方法进行重写,以处理不同的请求。 综上所述,HttpServlet的service方法是Servlet接收用户请求并做出响应的核心方法,在此方法可以实现不同的处理逻辑,以实现服务端的业务流程。同时,开发者需要针对不同的请求类型,实现对应的方法,并在其编写具体的业务逻辑。 ### 回答3: HttpServlet的service方法是Servlet API的一个核心方法,它在每次客户端请求Servlet时被调用。service方法的主要功能是根据请求的方法(GET、POST、PUT等)来决定调用哪种HTTP请求方法处理此次请求,并将请求和响应对象传给相应的方法进行处理。 service方法是HttpServlet的最高级别的处理方法,它是由Servlet容器负责调用的,一旦Servlet容器将请求分配给Servlet,便会调用service方法。 HttpServlet的service方法通常会被重写,以便根据具体的需求来处理请求。例如,若只需处理GET请求,则可以将doGet方法实现,并在service方法进行判断;若需要处理POST请求,则需要将doPost方法实现,并在service方法进行判断等等。 HttpServlet的service方法还有一个重要的作用,即根据请求头部的Accept-Encoding属性确定对请求的响应是否进行压缩。如果客户端没有请求压缩响应,则服务器则不会返回压缩响应,否则,会进行压缩响应。 总之,HttpServlet的service方法是Servlet容器用来调用Servlet处理HTTP请求的方法,它根据请求方法的不同,调用相应的处理方法,并负责决定是否对响应进行压缩,是整个Servlet处理过程最核心的方法之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈亦康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值