• Tomcat的各种对象HttpServletRequest、HttpServletResponse、ServletContext、ServletConfig


    目录

    处理请求的HttpServletRequest对象:

            获取请求信息:

    表单数据:

    getParameter("name");

    获取复选框数据:

    getParameterValues("name");

    ​编辑

    获取所有提交的数据:

    getParameterNames()

    ​编辑

    设置请求编码:

    setCharacterEncoding("编码")

    获取请求头信息:

    req.getHeader("key")

    HttpServletRequest对象的生命周期:

    产生响应的HttpServletResponse对象:

    设置响应类型:

    resp.setContentType("MIME")

    设置字符型响应:

    resp.setContentType("text/html");

    ​编辑

    resp.setContentType("text/plain");

    resp.setContentType("application/json")

    设置字节型响应:

    resp.setContentType("image/jpeg")

    ​编辑

    resp.setContentType("image/gif")

    设置响应编码:

    response.setContentType("text/html;charset=utf-8");

    response.setCharacterEncoding("utf-8");

    重定向响应:

    response.sendRedirect(URL地址)

    ​编辑

    文件下载:

    ​编辑

    解决文件名中文乱码问题:

    全局的ServletContext对象:

    ServletContext对象介绍

    如何获取ServletContext对象:

    相对路径转绝对路径:

    ​编辑 

    ​编辑

    读取容器附加信息:

    读取配置信息:

    servletContext.getInitParameter("key")

    servletContext.getInitParameterNames()

    全局容器:

    servletContext.setAttribute("key",ObjectValue)

    servletContext.getAttribute("key")

    servletContext.removeAttribute("key")

    获取配置信息的ServletConfig对象:

    ServletConfig对象

    servletConfig.getInitParameter("key")

    servletConfig.getInitParameterNames()


    Tomcat有各种对象,处理请求的HttpServletRequest对象,产生响应的HttpServletResponse对象,全局的ServletContext对象,获取配置信息的ServletConfig对象

    处理请求的HttpServletRequest对象:

            获取请求信息:

    req.getRequestURL()

    返回客户端浏览器发出请求时的完整URL。

    req.getRequestURI()

    返回请求行中指定资源部分。

    req.getRemoteAddr()

    返回发出请求的客户机的IP地址。

    req.getLocalAddr()

    返回WEB服务器的IP地址。

    req.getLocalPort()

    返回WEB服务器处理Http协议的连接器所监听的端口。

    1. @Override
    2. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    3. resp.setContentType("text/plain;charset=utf-8");
    4. //获取请求信息
    5. //返回客户端发出请求时的URI
    6. String uri = req.getRequestURI();
    7. //返回客户端发出请求的URL
    8. StringBuffer url = req.getRequestURL();
    9. //返回服务端的监听端口
    10. int port = req.getLocalPort();
    11. //返回服务端的IP地址
    12. String localAddr = req.getLocalAddr();
    13. //返回客户端的IP地址
    14. String remoteAddr = req.getRemoteAddr();
    15. PrintWriter pw = resp.getWriter();
    16. pw.println("返回客户端发出请求时的URI:"+uri);
    17. pw.println("返回客户端发出请求的URL:"+url);
    18. pw.println("返回服务端的监听端口:"+port);
    19. pw.println("返回服务端的IP地址:"+localAddr);
    20. pw.println("返回客户端的IP地址:"+remoteAddr);
    21. pw.flush();
    22. pw.close();
    23. }

    注意:编写完Servlet过后一定要在web.xml文件中对Servlet和URL的绑定

     

    表单数据:

    getParameter("name");

     编写Servlet获取表单数据

    1. public class TestRequest extends HttpServlet {
    2. @Override
    3. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. //设置请求编码
    5. req.setCharacterEncoding("utf-8");
    6. //设置响应编码
    7. resp.setContentType("text/plain;charset=utf-8");
    8. //获取表单数据
    9. String un = req.getParameter("username");
    10. String pwd = req.getParameter("password");
    11. PrintWriter pw = resp.getWriter();
    12. pw.println("username:"+un);
    13. pw.println("password:"+pwd);
    14. }
    15. }

    我们这里通过addUser.html来演示表单数据

     通过访问addUser.html提交数据给url:testUser.do绑定的Servlet


    获取复选框数据:

    通过getParameter("name")这个方法,一个name只能获取一个value,那么如果是复选框的话有多个value数据,此时就需要使用getParameterValues("name")方法获取name对应的所有value

    getParameterValues("name");

    1. public class TestRequest extends HttpServlet {
    2. @Override
    3. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. //设置请求编码
    5. req.setCharacterEncoding("utf-8");
    6. //设置响应编码
    7. resp.setContentType("text/plain;charset=utf-8");
    8. PrintWriter pw = resp.getWriter();
    9. //获取复选框数据
    10. String[] userlike = req.getParameterValues("userlike");
    11. pw.println("userlike:"+Arrays.toString(userlike));
    12. pw.flush();
    13. pw.close();
    14. }
    15. }

    我们还是使用addUser.html文件进行测试

    获取所有提交的数据:

    以上都是通过一个name对应一个value或多个value,那么如果有多个name,如何获取呢?

    通过getParameterNames()方法获取所有name

    getParameterNames()

    1. public class TestRequest extends HttpServlet {
    2. @Override
    3. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. //设置请求编码
    5. req.setCharacterEncoding("utf-8");
    6. //设置响应编码
    7. resp.setContentType("text/plain;charset=utf-8");
    8. PrintWriter pw = resp.getWriter();
    9. //获取所有name
    10. Enumeration enumeration = req.getParameterNames();
    11. while(enumeration.hasMoreElements()){
    12. String name = enumeration.nextElement();
    13. if ("userlike".equals(name)){
    14. String[] value = req.getParameterValues(name);
    15. pw.println(name+":"+Arrays.toString(value));
    16. }
    17. else {
    18. String value = req.getParameter(name);
    19. pw.println(name+":"+value);
    20. }
    21. }
    22. }
    23. }

    我们还是使用addUser.html文件进行测试

    设置请求编码:

    看了上面如何获取请求数据,大家可能会有一些疑问,因为最上面一直都有两行代码,一个是设置请求编码,一个是设置响应编码,我们这里先讲一下请求编码,响应编码在讲HttpServletResponse对象的时候讲

    通过HttpServletRequest对象的setCharacterEncoding("编码")方法设置编码

    setCharacterEncoding("编码")

    代码我就不演示了,这里讲一下为什么要设置请求编码:

    因为Tomcat在获取请求数据时,通过ISO8859-1的方式将请求数据字节转为字符,而ISO8859-1只支持英文和数字,如果此时请求数据中有中文的话,那么中文通过ISO8859-1的方式将字节转为字符此时就会出现乱码的问题

    所以需要通过HttpServletRequest对象下的setCharacterEncoding("编码")的方法,给定编码格式,告诉Tomcat,请求数据该由什么编码的格式转换

    获取请求头信息:

    req.getHeader("key")

    通过请求头中的key获取对应的value

    请求头中有很多的信息,我们这里获取Accept-Language获取对应的value 

    1. @Override
    2. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    3. //设置请求编码
    4. req.setCharacterEncoding("utf-8");
    5. //设置响应编码
    6. resp.setContentType("text/plain;charset=utf-8");
    7. PrintWriter pw = resp.getWriter();
    8. //通过请求头中的key获取对应的value
    9. String language = req.getHeader("Accept-Language");
    10. pw.println("Accept-language:" + language);
    11. pw.flush();
    12. pw.close();
    13. }

    我们还是使用addUser.html文件进行测试

     

     

    HttpServletRequest对象的生命周期:

    学完了如何使用HttpServletRequest获取请求信息,获取表单数据,获取多选框数据,获取所有提交的数据,设置请求编码,获取请求信息

    那么我们也需要了解一下该对象的生命周期,通过生命周期更加深刻的了解该对象

    当有请求到达Tomcat时,Tomcat会创建HttpServletRequest对象,并将该对象通过参数的方式传递到我们的Servlet中,当请求处理完毕并产生响应过后该对象的生命周期结束

    产生响应的HttpServletResponse对象:

    设置响应类型:

    resp.setContentType("MIME")

    该方法可通过MIME-Type设置响应类型。

    Type

    Meaning

    application/msword

    Microsoft Word document

    application/octet-stream

    Unrecognized or binary data

    application/pdf

    Acrobat (.pdf) file

    application/postscript

    PostScript file

    application/vnd.lotus-notes

    Lotus Notes file

    application/vnd.ms-excel

    Excel spreadsheet

    application/vnd.ms-powerpoint

    PowerPoint presentation

    application/x-gzip

    Gzip archive

    application/x-java-archive

    JAR file

    application/x-java-serialized-object

    Serialized Java object

    application/x-java-vm

    Java bytecode (.class) file

    application/zip

    Zip archive

    application/json

    JSON

    audio/basic

    Sound file in .au or .snd format

    audio/midi

    MIDI sound file

    audio/x-aiff

    AIFF sound file

    audio/x-wav

    Microsoft Windows sound file

    image/gif

    GIF image

    image/jpeg

    JPEG image

    image/png

    PNG image

    image/tiff

    TIFF image

    image/x-xbitmap

    X Windows bitmap image

    text/css

    HTML cascading style sheet

    text/html

    HTML document

    text/plain

    Plain text

    text/xml

    XML

    video/mpeg

    MPEG video clip

    video/quicktime

    QuickTime video clip

    MIME对象有很多但是常用的只有那么几种,所有我们通过字符型响应和字节型响应记忆常用的MIME类型

    设置字符型响应:

    resp.setContentType("text/html");

    设置响应类型为文本型,内容还有html字符串,是浏览器默认的响应类型(浏览器可识别html和文本)

    1. public class TestRequest extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. this.doPost(req,resp);
    5. }
    6. @Override
    7. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    8. //设置请求编码
    9. req.setCharacterEncoding("utf-8");
    10. //设置响应编码
    11. resp.setContentType("text/html;charset=utf-8");
    12. PrintWriter pw = resp.getWriter();
    13. pw.println("");
    14. pw.println("");
    15. pw.println("");
    16. pw.println("");
    17. pw.println("Document");
    18. pw.println("");
    19. pw.println("");
    20. pw.println("Hello World");
    21. pw.println("");
    22. pw.println("");
    23. pw.flush();
    24. pw.close();
    25. }
    26. }

    通过地址栏直接访问该servlet,大家可以发现这个hello world拥有了css样式,说明设置响应类型成功了

     

    resp.setContentType("text/plain");

    设置响应类型为文本型,内容是普通文本

    还是上面那个例子,如果将响应类型改为文本型的话,浏览器就不会识别html标签,而是以文本的方式展现出来

     

    resp.setContentType("application/json")

    设置响应类型为JSON格式的字符串

    设置字节型响应:

    前面响应的测试忘记换类了,现在换一个TestResponse类,抱歉抱歉

    常见的字节型响应:

    resp.setContentType("image/jpeg")

    设置响应类型为图片类型,图片类型为jpeg或jpg格式。

    1. @Override
    2. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    3. //设置请求编码
    4. req.setCharacterEncoding("utf-8");
    5. //设置响应编码
    6. resp.setContentType("image/jpeg;charset=utf-8");
    7. //读取图片
    8. FileInputStream fis = new FileInputStream("C:\\Users\\27645\\IdeaProjects\\ServletDemo\\web\\image\\t.jpg");
    9. byte[] bytes = new byte[1024];
    10. //获取响应流
    11. OutputStream os = resp.getOutputStream();
    12. //读取文件,一次读取1024个字节
    13. while(fis.read(bytes) != -1){
    14. os.write(bytes);
    15. }
    16. os.flush();
    17. os.close();
    18. }

     

    resp.setContentType("image/gif")

    设置响应类型为图片类型,图片类型为gif格式。

    设置响应编码:

    前面的请求编码讲过,Tomcat在接收数据的时候会通过ISO8859-1的编码格式将字节转为字符,而ISO8859-1只支持英文和数字,所以如果有中文的话需要设置请求编码

    但是Tomcat在接收请求时将数据以ISO8859-1的编码格式将字节转为字符,而在响应时Tomcat也是默认使用ISO8859-1的方式响应给客户端,而如果我们有中文需要响应给客户端,此时就需要设置响应编码,告诉Tomcat该以什么编码格式将字符转为字节

    设置响应编码有两种方式

    1. response.setContentType("响应类型; charset=UTF-8");(推荐)
    2. response.setCharacterEncoding("UTF-8");

    response.setContentType("text/html;charset=utf-8");

    不仅发送到浏览器的内容会使用UTF-8编码,而且还通知浏览器使用UTF-8编码方式进行显示。所以总能正常显示中文

    response.setCharacterEncoding("utf-8");

    仅仅是发送的浏览器的内容是UTF-8编码的,至于浏览器是用哪种编码方式显示不管。 所以当浏览器的显示编码方式不是UTF-8的时候,就会看到乱码,需要手动指定浏览器编码。

    重定向响应:

    response.sendRedirect(URL地址)

    重定向响应会在响应头中的Location设置给定的URL。客户端浏览器在解析响应头后发现状态码为302时,自动向Location中的URL发送请求。

    1. public class TestResponse extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. this.doPost(req,resp);
    5. }
    6. @Override
    7. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    8. //设置请求编码
    9. req.setCharacterEncoding("utf-8");
    10. //设置响应编码
    11. resp.setContentType("text/html;charset=utf-8");
    12. //设置重定向响应
    13. resp.sendRedirect("http://www.baidu.com");
    14. }
    15. }

     看似我们只有一次请求一次响应,其实是有两次请求两次响应的

     

    文件下载:

    在实现文件下载时,我们需要在响应头中添加附加信息。

    以key,value的方式添加

    response.addHeader("Content-Disposition", "attachment; filename="+文件名);

    attachment就是附件的意思,filename需要给定文件名

    1. public class TestResponse extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. this.doPost(req,resp);
    5. }
    6. @Override
    7. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    8. //设置请求编码
    9. req.setCharacterEncoding("utf-8");
    10. //设置响应编码
    11. resp.setContentType("text/html;charset=utf-8");
    12. File file = new File("C:\\Users\\27645\\IdeaProjects\\ServletDemo\\web\\image\\t.jpg");
    13. //文件下载
    14. resp.addHeader("Content-Disposition","attachment;filename="+file.getName());
    15. FileInputStream fis = new FileInputStream(file);
    16. byte[] bytes = new byte[1024];
    17. OutputStream os = resp.getOutputStream();
    18. //文件读取与响应
    19. while(fis.read(bytes) != -1){
    20. os.write(bytes);
    21. }
    22. os.flush();
    23. os.close();
    24. }
    25. }

    访问该url后浏览器会直接下载附件

     

    解决文件名中文乱码问题:

    在响应头中设置文件下载时,需要给定文件名,如果该文件名是中文的,那么就会出现乱码的问题因为我们的是“gbk”编码,而Tomcat在传输时会基于“iso8859-1”的方式将字符转为字节,那么此时中文就是乱码

    1. @Override
    2. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    3. //设置请求编码
    4. req.setCharacterEncoding("utf-8");
    5. //设置响应编码
    6. resp.setContentType("text/html;charset=utf-8");
    7. File file = new File("C:\\Users\\27645\\IdeaProjects\\ServletDemo\\web\\image\\小熊.jpg");
    8. //文件下载
    9. resp.addHeader("Content-Disposition","attachment;filename="+file.getName());
    10. FileInputStream fis = new FileInputStream(file);
    11. byte[] bytes = new byte[1024];
    12. OutputStream os = resp.getOutputStream();
    13. //文件读取与响应
    14. while(fis.read(bytes) != -1){
    15. os.write(bytes);
    16. }
    17. os.flush();
    18. os.close();
    19. }

     所以我们需要通过URLEncoding类下的静态方法encode("文件名","编码格式")将我们的文件名以指定编码格式编码

    1. @Override
    2. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    3. //设置请求编码
    4. req.setCharacterEncoding("utf-8");
    5. //设置响应编码
    6. resp.setContentType("text/html;charset=utf-8");
    7. File file = new File("C:\\Users\\27645\\IdeaProjects\\ServletDemo\\web\\image\\小熊.jpg");
    8. //文件下载
    9. resp.addHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(file.getName(),"utf-8"));
    10. FileInputStream fis = new FileInputStream(file);
    11. byte[] bytes = new byte[1024];
    12. OutputStream os = resp.getOutputStream();
    13. //文件读取与响应
    14. while(fis.read(bytes) != -1){
    15. os.write(bytes);
    16. }
    17. os.flush();
    18. os.close();
    19. }

     

    全局的ServletContext对象:

    ServletContext对象介绍

    ServletContext官方叫Servlet上下文。服务器会为每一个Web应用创建一个ServletContext对象。这个对象全局唯一,而且Web应用中的所有Servlet都共享这个对象。所以叫全局应用程序共享对象。

    ServletContext对象的作用

    • 相对路径转绝对路径
    • 获取容器的附加信息
    • 读取配置信息
    • 全局容器

    如何获取ServletContext对象:

    GenericServlet有一个方法叫getServletContext(),通过该方法可获取ServletContext对象

    但是你的类必须继承或者间接继承该抽象类

    相对路径转绝对路径:

    Java的特点就是跨平台,而当我们需要某个文件的路径名时,如果在window系统中,这个文件在某个盘符下是可以正常访问的,但是如果在linux系统中是没有盘符的概念的,所以我们需要使用相对的路径转为绝对路径这种方法,解决跨平台的问题

    ServletContext对象下有一个getRealPath("相对路径")

    该方法可以将相对路径转为绝对路径,但是该路径对应的文件必须为web目录下或者在web目录的子目录中,但是不能放在WEB-INF目录

    1. @Override
    2. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    3. //设置请求编码
    4. req.setCharacterEncoding("utf-8");
    5. //设置响应编码
    6. resp.setContentType("image/jpeg;charset=utf-8");
    7. //获取ServletContext对象
    8. ServletContext sc = this.getServletContext();
    9. String absolute = sc.getRealPath("image/小熊.jpg");
    10. FileInputStream fis = new FileInputStream(absolute);
    11. byte[] bytes = new byte[1024];
    12. OutputStream os = resp.getOutputStream();
    13. while(fis.read(bytes) != -1){
    14. os.write(bytes);
    15. }
    16. os.flush();
    17. os.close();
    18. }

     

    读取容器附加信息:

    servletContext.getServerInfo()

    返回Servlet容器的名称和版本号

    servletContext.getMajorVersion()

    返回Servlet容器所支持Servlet的主版本号。

    servletContext.getMinorVersion()

    返回Servlet容器所支持Servlet的副版本号。

    读取配置信息:

    获取web.xml文件中的信息

      key

      value

    servletContext.getInitParameter("key")

    该方法可以读取web.xml文件中标签中的配置信息。(value)

     

    servletContext.getInitParameterNames()

    该方法可以读取web.xml文件中所有param-name标签中的值。(name)

     

    注意:context-param必须在web-app下面

    全局容器:

    servletContext.setAttribute("key",ObjectValue)

    向全局容器中存放数据。

    servletContext.getAttribute("key")

    从全局容器中获取数据。

    servletContext.removeAttribute("key")

    根据key删除全局容器中的value。

     

    例子:

    获取配置信息的ServletConfig对象:

    ServletConfig对象

    ServletConfig对象对应web.xml文件中的节点。当Tomcat初始化一个Servlet时,会将该Servlet的配置信息,封装到一个ServletConfig对象中。我们可以通过该对象读取节点中的配置信息

    servletConfig.getInitParameter("key")

    该方法可以读取web.xml文件中标签中标签中的配置信息。(value)

    servletConfig.getInitParameterNames()

    该方法可以读取web.xml文件中当前标签中所有标签中的值。(name)

     

      servletName

      servletClass

     

        key

        value

     

  • 相关阅读:
    【Python机器学习】利用专家知识
    Uncaught TypeError: i.createPopper is not a function
    Power Modeling and Analysis
    GBPC2510W-ASEMI马达专用方桥GBPC2510W
    TPM零知识学习六 —— tpm模拟器安装
    大模型部署手记(3)通义千问+Windows GPU
    MetaFormer-3
    Pyside6 QFileDialog
    华为云云耀云服务器L实例评测 | 搭建企业级 Registry 服务器 Harbor
    Visual Studio2019配置Lua及sol2框架
  • 原文地址:https://blog.csdn.net/cccccccmmm/article/details/126737659