栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

HttpServletRequest 接口

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

HttpServletRequest 接口

HttpServletRequest 是一个接口HttpServletRequest  接口是Servlet规范中的一员。HttpServletRequest  的父接口:ServletRequestorg.apache.catalina.connector.RequestFacade    这个类实现了HttpServletRequest 接口。HttpServletRequest  中封装了 HTTP 的请求信息。

HttpServletRequest 接口中常用的方法:

String

getParameter(String name) 

获取value数组中第一个元素

这是比较常用的

Map

getParameterMap()

获取map集合

Enumeration

getParameterNames()

获取集合中所有的key

String[]

getParameterValues(String name)

获取集合中所有的value

以上四个方法,与用户提交的数据有关。 

可以思考一下:当前端发送请求信息的时候,那么数据是怎么存储的?

前端发送的数据:userName=m0001&password=123&hobby=drink&hobby=smoke

我们首先可以想到的是 Map 集合:

map: key 存储 name,value 存储value

        key                value

---------------------------------------------------

     userName         "m0001"

 password        "123"

   hobby               "drink"

       hobby                " smoke"

但是这样存储当 key 重复的时候,value  会被覆盖。

我们可以采用:map 这样的形式存储数据

        key                value

---------------------------------------------------

         userName         {"m0001"}

  password        {"123"}

               hobby              { "drink","smoke"}

测试方法:

public class RequestTest extends HttpServlet {
    //重写 doGet
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html");
        response.setCharacterEncoding("GBK");
        PrintWriter writer = response.getWriter();
        
        
        Map map = request.getParameterMap();
        writer.print("遍历map集合"+ "
"); Set set = map.keySet(); for (String s : set) { writer.print(s + "=" + Arrays.toString(map.get(s)) + "
"); } Enumeration key = request.getParameterNames(); writer.print("遍历集合中key"+ "
"); while (key.hasMoreElements()) { String k = key.nextElement(); writer.print(k + "
"); } writer.print("遍历集合中所有的value"+ "
"); String[] userName = request.getParameterValues("userName"); String[] password = request.getParameterValues("password"); String[] hobby = request.getParameterValues("hobby"); writer.print(Arrays.toString(userName) + "
"); writer.print(Arrays.toString(password) + "
"); writer.print(Arrays.toString(hobby) + "
"); writer.print("hobby数组中第一个元素" + "
"); String first = request.getParameter("hobby"); writer.print(first + "
"); } }

 

 Request 对象 又叫 请求域。

请求域相对应用域来说,生命周期短很多,范围小很多。请求域中也有 存,取,删,三个方法。 

Object

getAttribute(String name)

从请求域中取数据

void

setAttribute(String name, Object o)

向请求域中存放数据

void

removeAttribute(String name)

从请求域中删除数据

 如果我们在 AServlet 中 向请求域中存放数据,在BServlet 中取出数据。能取出来吗?

不能,因为这是俩次请求。请求域存在每次请求之中。那么,可不可以将AServlet 和 BServlet 都放在一次请求当中呢?

思考一个问题:既然我们想 把 AServlet 和 BServlet 放到一次请求当中,那么看看下面的代码行不行:new 一个 BServlet 对象,调用 doGet方法,将 request 和 response 传进去,这样 AServlet 和 BServlet 使用的就是一个 Request 对象。是不是就能访问到了呢?

这样是不行的。虽然看着能实现功能,但是我们自己所new的Servlet对象,它的生命周期不会受Tomcat 服务器的管理,无法销毁。无法被回收。

    BSerlvet b = new BServlet() ;
    b.doGet(request,response);
我们可以使用跳转/转发 机制。 
RequestDispatcher

getRequestDispatcher(String path)

ServletRequest中的方法:获取请求转发器对象

path:跳转资源的路径

void

forward(ServletRequest request, ServletResponse response)

RequestDispatcher中的方法:实现转发功能

    //    第一步:获取请求转发器对象
        RequestDispatcher request =  req.getRequestDispatcher("/b");
    //    第二步:使用RequestDispatcher中的forward方法,实现跳转
        request.forward(req,resp);


    //    也可以一行代码搞定
        RequestDispatcher request = req.getRequestDispatcher("/b").forward(req,resp);

 如果实现俩个Servlet共享数据?

使用 ServletContext 域【应用域】,可以实现,但是范围太广。生命周期太长【Tomcat 启动创建,关闭销毁】。使用请求域,使用跳转/转发机制,保证俩个Servlet在同一次请求当中。即可实现共享。跳转不仅能跳转到一个 Servlet 还能跳转到一个HTML 页面。

HttpServlet 接口中的其他常用方法:

String

getRemoteAddr()

获取客户端IP地址

void

setCharacterEncoding(String env)

设置请求体的字符编码形式

可以解决Post请求乱码的问题【Post请求在请求体中,Get请求在请求行上】

 当我们发送POST请求时乱码问题:使用setCharacterEncoding()方法解决发送请求时乱码问题。

当我们发送GET请求出现乱码问题时:修改 Tomcat 中的 webappsdocsconfig 下的 service.html 文件中 标签中增加:URIEncoding="UTF-8"  

注意:Tomcat 8 之后 默认就是UTF-8,不会出现乱码问题。

Tomcat 10 默认就是UTF-8 字符集,所以不会出现乱码问题!

 当我们响应中出现乱码问题:Tomcat 10 不会出现乱码问题。

//使用response中的设置编码的方法
response.setCharacterEncoding();
String

getMethod()

获取请求方式(七种中的一种)

String

getRequestURI()

获取请求信息的URI

String

getServletPath()

获取Servlet路径

       //获取 请求方式
        String method = request.getMethod();
        System.out.println(method);

        //获取请求信息的URI
        String uri = request.getRequestURI(); //  /servlet10/a
        System.out.println(uri);

        // 获取Servlet的路径
        String servletPath = request.getServletPath(); // /a
        System.out.println(servletPath);

 控制台输出结果

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/715721.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号