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协议的连接器所监听的端口。

@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/plain;charset=utf-8");

        //获取请求信息
        //返回客户端发出请求时的URI
        String uri = req.getRequestURI();
        //返回客户端发出请求的URL
        StringBuffer url = req.getRequestURL();
        //返回服务端的监听端口
        int port = req.getLocalPort();
        //返回服务端的IP地址
        String localAddr = req.getLocalAddr();
        //返回客户端的IP地址
        String remoteAddr = req.getRemoteAddr();

        PrintWriter pw = resp.getWriter();
        pw.println("返回客户端发出请求时的URI:"+uri);
        pw.println("返回客户端发出请求的URL:"+url);
        pw.println("返回服务端的监听端口:"+port);
        pw.println("返回服务端的IP地址:"+localAddr);
        pw.println("返回客户端的IP地址:"+remoteAddr);

        pw.flush();
        pw.close();
    }

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

 

表单数据:

getParameter("name");

 编写Servlet获取表单数据

public class TestRequest extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求编码
        req.setCharacterEncoding("utf-8");
        //设置响应编码
        resp.setContentType("text/plain;charset=utf-8");

        //获取表单数据
        String un = req.getParameter("username");
        String pwd = req.getParameter("password");

        PrintWriter pw = resp.getWriter();
        pw.println("username:"+un);
        pw.println("password:"+pwd);
    }
}

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

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


获取复选框数据:

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

getParameterValues("name");

public class TestRequest extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求编码
        req.setCharacterEncoding("utf-8");
        //设置响应编码
        resp.setContentType("text/plain;charset=utf-8");

        PrintWriter pw = resp.getWriter();

        //获取复选框数据
        String[] userlike = req.getParameterValues("userlike");

        pw.println("userlike:"+Arrays.toString(userlike));

        pw.flush();
        pw.close();
    }
}

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

获取所有提交的数据:

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

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

getParameterNames()

public class TestRequest extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求编码
        req.setCharacterEncoding("utf-8");
        //设置响应编码
        resp.setContentType("text/plain;charset=utf-8");

        PrintWriter pw = resp.getWriter();

        //获取所有name
        Enumeration<String> enumeration = req.getParameterNames();
        while(enumeration.hasMoreElements()){
            String name = enumeration.nextElement();
            if ("userlike".equals(name)){
                String[] value = req.getParameterValues(name);
                pw.println(name+":"+Arrays.toString(value));
            }
            else {
                String value = req.getParameter(name);
                pw.println(name+":"+value);
            }
        }
    }
}

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

设置请求编码:

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

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

setCharacterEncoding("编码")

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

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

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

获取请求头信息:

req.getHeader("key")

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

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

@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求编码
        req.setCharacterEncoding("utf-8");
        //设置响应编码
        resp.setContentType("text/plain;charset=utf-8");

        PrintWriter pw = resp.getWriter();

        //通过请求头中的key获取对应的value
        String language = req.getHeader("Accept-Language");
        pw.println("Accept-language:" + language);
        pw.flush();
        pw.close();
    }

我们还是使用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和文本)

public class TestRequest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求编码
        req.setCharacterEncoding("utf-8");
        //设置响应编码
        resp.setContentType("text/html;charset=utf-8");

        PrintWriter pw = resp.getWriter();
        pw.println("<!DOCTYPE html>");
        pw.println("<html>");
        pw.println("<head>");
        pw.println("<meta charset = UTF-8>");
        pw.println("<title>Document</title>");
        pw.println("</head>");
        pw.println("<body>");
        pw.println("<font color=blue>Hello World</font>");
        pw.println("</body>");
        pw.println("</html>");

        pw.flush();
        pw.close();
    }
}

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

 

resp.setContentType("text/plain");

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

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

 

resp.setContentType("application/json")

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

设置字节型响应:

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

常见的字节型响应:

resp.setContentType("image/jpeg")

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

@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求编码
        req.setCharacterEncoding("utf-8");
        //设置响应编码
        resp.setContentType("image/jpeg;charset=utf-8");

        //读取图片
        FileInputStream fis = new FileInputStream("C:\\Users\\27645\\IdeaProjects\\ServletDemo\\web\\image\\t.jpg");
        byte[] bytes = new byte[1024];
        //获取响应流
        OutputStream os = resp.getOutputStream();
        //读取文件,一次读取1024个字节
        while(fis.read(bytes) != -1){
            os.write(bytes);
        }
        os.flush();
        os.close();
    }

 

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发送请求。

public class TestResponse extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求编码
        req.setCharacterEncoding("utf-8");
        //设置响应编码
        resp.setContentType("text/html;charset=utf-8");

        //设置重定向响应
        resp.sendRedirect("http://www.baidu.com");


    }
}

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

 

文件下载:

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

以key,value的方式添加

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

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

public class TestResponse extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求编码
        req.setCharacterEncoding("utf-8");
        //设置响应编码
        resp.setContentType("text/html;charset=utf-8");

        File file = new File("C:\\Users\\27645\\IdeaProjects\\ServletDemo\\web\\image\\t.jpg");
        //文件下载
        resp.addHeader("Content-Disposition","attachment;filename="+file.getName());

        FileInputStream fis = new FileInputStream(file);
        byte[] bytes = new byte[1024];
        OutputStream os = resp.getOutputStream();
        //文件读取与响应
        while(fis.read(bytes) != -1){
            os.write(bytes);
        }
        os.flush();
        os.close();

    }
}

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

 

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

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

@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求编码
        req.setCharacterEncoding("utf-8");
        //设置响应编码
        resp.setContentType("text/html;charset=utf-8");

        File file = new File("C:\\Users\\27645\\IdeaProjects\\ServletDemo\\web\\image\\小熊.jpg");
        //文件下载
        resp.addHeader("Content-Disposition","attachment;filename="+file.getName());

        FileInputStream fis = new FileInputStream(file);
        byte[] bytes = new byte[1024];
        OutputStream os = resp.getOutputStream();
        //文件读取与响应
        while(fis.read(bytes) != -1){
            os.write(bytes);
        }
        os.flush();
        os.close();

    }

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

@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求编码
        req.setCharacterEncoding("utf-8");
        //设置响应编码
        resp.setContentType("text/html;charset=utf-8");

        File file = new File("C:\\Users\\27645\\IdeaProjects\\ServletDemo\\web\\image\\小熊.jpg");
        //文件下载
        resp.addHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(file.getName(),"utf-8"));

        FileInputStream fis = new FileInputStream(file);
        byte[] bytes = new byte[1024];
        OutputStream os = resp.getOutputStream();
        //文件读取与响应
        while(fis.read(bytes) != -1){
            os.write(bytes);
        }
        os.flush();
        os.close();

    }

 

全局的ServletContext对象:

ServletContext对象介绍

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

ServletContext对象的作用

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

如何获取ServletContext对象:

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

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

相对路径转绝对路径:

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

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

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

@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求编码
        req.setCharacterEncoding("utf-8");
        //设置响应编码
        resp.setContentType("image/jpeg;charset=utf-8");

        //获取ServletContext对象
        ServletContext sc = this.getServletContext();
        String absolute = sc.getRealPath("image/小熊.jpg");
        FileInputStream fis = new FileInputStream(absolute);
        byte[] bytes = new byte[1024];

        OutputStream os = resp.getOutputStream();
        while(fis.read(bytes) != -1){
            os.write(bytes);
        }
        os.flush();
        os.close();

    }

 

读取容器附加信息:

servletContext.getServerInfo()

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

servletContext.getMajorVersion()

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

servletContext.getMinorVersion()

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

读取配置信息:

获取web.xml文件中的信息

<context-param>

  <param-name>key</param-name>

  <param-value>value</param-value>

</context-param>

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)

 

<servlet>

  <servlet-name>servletName</servlet-name>

  <servlet-class>servletClass</servlet-class>

  <init-param>

    <param-name>key</param-name>

    <param-value>value</param-value>

  </init-param>

</servlet>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值