• 06-ServletRequest


    ServletRequest

    简介

    先看一下官方对ServletRequest的描述

    public interface ServletRequest
    Defines an object to provide client request information to a servlet. The servlet container creates a ServletRequest object and passes it as an argument to the servlet’s service method.

    A ServletRequest object provides data including parameter name and values, attributes, and an input stream. Interfaces that extend ServletRequest can provide additional protocol-specific data (for example, HTTP data is provided by HttpServletRequest.

    它的功能是将客户端的请求信息提供给servlet,servlet容器会创建一个ServletRequest对象,并会将其作为一个参数传给servlet的service方法。

    ServletRequest对象是在用户发送一个请求时创建的,并在下一个请求到来时销毁,也就是说一个请求对应一个ServletRequest对象。

    获取GET和POST请求的信息

    Map<String, String[]> getParameterMap();
    String getParameter(String name);
    Enumeration<String> getParameterNames();
    String[] getParameterValues​(String name);
    
    • 1
    • 2
    • 3
    • 4

    这四个方法的作用主要是获得客户端发送过来的参数和对应的值,由于每个参数可能对应多个值,所以Map的key是个String,而value是个String数组。
    在这里插入图片描述
    在前端页面中编写一个form表单

    <form action="/http/test" method="get">
        <label for="username"> username:label>
        <input type="text" name="username" id="username">
        <label for="passwd"> password:label>
        <input type="password" name="passwd" id="passwd">
       hobby<br>
        guitar<input type="checkbox" name="hobby" value="guitar"><br>
        piano<input type="checkbox" name="hobby" value="piano"><br>
        keyboard <input type="checkbox" name="hobby" value="keyboard"><br>
        <button type="submit">提交button>
    form>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    无论是get还是post,它发送请求参数以及相关信息都会被封装到ServletRequest对象中,我们可以很方便的通过上面的接口拿到信息。

    利用请求域缓存区

    setAttribute(String, Object)
    getAttribute(String)
    removeAttribute(String)
    
    • 1
    • 2
    • 3

    这三个接口功能类似于ServletContext的,只不过这是在请求域中设置属性,它的生命周期是一次请求的过程。

    在一个service访问其它资源

    public class A extends GenericServlet {
        @Override
        public void service(ServletRequest req, ServletResponse res)
                throws ServletException, IOException {
            req.setAttribute("from_a", "aaaa");
            req.getRequestDispatcher("/b").forward(req, res);
        }
    }
    public class B extends GenericServlet{
        @Override
        public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
            PrintWriter writer = res.getWriter();
            Object from_a = req.getAttribute("from_a");
            writer.write(from_a.toString());
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    首先往A的请求域中添加一个字段,下面调用getRequestDispatcher可以获得一个服务派发者对象,这里是派发到/b对应的服务中,然后调用forward方法传入req,res,这样两个服务共享一个ServletRequest对象。这也是从一个服务跳转到另一个服务的方式。

    String	getRemoteAddr()	
    Returns the Internet Protocol (IP) of the remote end of the connection on which the request was received.
    String	getRemoteHost()	
    Returns the fully qualified name of the address returned by getRemoteAddr().
    int	getRemotePort()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ServletRequest还有一些其它的方法,比如获得客户端的地址,主机名和端口等

  • 相关阅读:
    python设计模式12:状态模式
    互联网技术大佬独立博客推荐
    Ant Design Mobile 5.6.0版本来了
    基于Istio的高级流量管理三
    品达通用权限系统(Day 7~Day 8)
    scrapy返回400
    第四章 网络层
    easyrecovery15最新版数据恢复类软件测评
    你还准备参加软件测试培训吗?
    【重走 java 路】IDEA控制台中文乱码解决方案
  • 原文地址:https://blog.csdn.net/qq_43152622/article/details/127131598