程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-05(1)

JavaWeb阶段Request的详情介绍

发布于2021-06-12 12:38     阅读(136)     评论(0)     点赞(14)     收藏(1)


Request

通过浏览器访问服务器时,tomcat将http请求所有信息都封装在Request中
开发人员可以通过request对象方法,来获取浏览器发送的所有信息。
在这里插入图片描述

Request获取请求信息

获取请求行

相关方法

String getMethod()获取请求方式
String getContextPath()获取项目虚拟路径(项目名)
String getRequestURI()获取URI
StringBuffer getRequestURL()获取URL http://localhost:8080/day03_request&response/requestDemo01
String getProtocol()获取协议和版本号 HTTP/1.1
String getRemoteAddr()获取客户端IP地址

代码演示

@WebServlet("/test/getHttpRequestLineServlet")
public class GetHttpRequestLineServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 处理post请求乱码问题
        request.setCharacterEncoding("utf-8");
        //获取请求信息的相关方法
        /**
         * 方法说明
         * String  getMethod()获取请求方式
         * String getContextPath()获取项目虚拟路径(项目名)
         * String getRequestURI()获取URI day03_request&response/requestDemo01
         * StringBuffer getRequestURL()获取URL http://localhost:8080/day03_request&response/requestDemo01
         * String getProtocol()获取协议和版本号	HTTP/1.1
         * String getRemoteAddr()获取客户端IP地址
         */
        //String  getMethod()获取请求方式
        String method = request.getMethod();
        System.out.println("method:"+method);
        //String getContextPath()获取项目虚拟路径(项目名)
        String contextPath = request.getContextPath();
        System.out.println("contextPath:"+contextPath);
        //String getRequestURI()获取URI day03_request&response/requestDemo01
        //返回该请求的URL的一部分,从协议名一直到HTTP请求的第一行中的查询字符串。
        String requestURI = request.getRequestURI();
        System.out.println("requestURI:"+requestURI);
        //StringBuffer getRequestURL()获取URL http://localhost:8080/day03_request&response/requestDemo01
        //获取浏览器访问绝对路径名
        StringBuffer requestURL = request.getRequestURL();
        System.out.println("绝对路径名:"+requestURL);
        //String getProtocol()获取协议和版本号	HTTP/1.1
        String protocol = request.getProtocol();
        System.out.println("协议版本号:"+protocol);
        //String getRemoteAddr()获取客户端IP地址
        String remoteAddr = request.getRemoteAddr();
        System.out.println("remoteAddr"+remoteAddr);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

获取请求头信息

相关方法

String getHeader(String name)获取请求头名称对应的值
Enumeration getHeaderNames()获取所有请求头的名称

代码演示

@WebServlet("/getHttpRequestHeaderServlet")
public class GetHttpRequestHeaderServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 处理post请求乱码问题
        request.setCharacterEncoding("utf-8");
        //String getHeader(String name)获取请求头名称对应的值
        // Enumeration<String> getHeaderNames()获取所有请求头的名称
        //获取请求头
        Enumeration<String> headerNames = request.getHeaderNames();
        //迭代遍历
        while (headerNames.hasMoreElements()){
            //获取每一个请求头
            String key = headerNames.nextElement();
            //根据请求头得到相应的值
            String value = request.getHeader(key);
            System.out.println(key+":"+value);
        }
        //单独获取头
        String user_agent = request.getHeader("USER-AGENT");
        System.out.println(user_agent);

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

请求头小案例

浏览器兼容
在这里插入图片描述
代码实现

@WebServlet("/getUserAgentRequestServlet")
public class GetUserAgentRequestServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 处理post请求乱码问题
        request.setCharacterEncoding("utf-8");

        // 1.获取浏览器版本信息
        String userAgent = request.getHeader("user-agent");
        // 2.判断浏览器版本
        if (userAgent.contains("Chrome")) {
            System.out.println("浏览器:谷歌");
        } else if (userAgent.contains("Firefox")) {
            System.out.println("浏览器:火狐");
        } else {
            System.out.println("浏览器:其他");
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

获取请求题

相关方法

String getParameter(String name)根据参数名称获取参数值
String[] getParameterValues(String name)根据参数名称获取参数值的数组
Enumeration getParameterNames()获取所有请求的参数名称
Map<String,String[]> getParameterMap()获取所有参数的map集合
不论是post或者是get请求方式,都可以使用下列方法来获取请求参数

代码演示

@WebServlet("/getHttpRequestBodyServlet")
public class GetHttpRequestBodyServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 处理post请求乱码问题
        request.setCharacterEncoding("utf-8");
        System.out.println("==========手动获取=========");
        String username = request.getParameter("username");
        System.out.println("用户名:"+username);
        String password = request.getParameter("password");
        System.out.println("密码:"+password);
        String[] hobbies = request.getParameterValues("hobby");
        System.out.println("爱好:"+ Arrays.toString(hobbies));
        System.out.println("===========自动获取============");
        Map<String, String[]> map = request.getParameterMap();
        Set<Map.Entry<String, String[]>> entrySet = map.entrySet();
        for (Map.Entry<String, String[]> entry : entrySet) {
            String key = entry.getKey();
            String[] value = entry.getValue();
            System.out.println(key+":"+Arrays.toString(value));
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

前端页面提交代码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>form</title>

</head>
<body>
<h3>get方式:</h3>
<form action="/getHttpRequestBodyServlet" method="get">
    用户:<input type="text" name="username"> <br>
    密码:<input type="password" name="password"> <br>
    爱好:
    <input type="checkbox" name="hobby" value="somke"/>抽烟
    <input type="checkbox" name="hobby" value="drink"/>喝酒
    <input type="checkbox" name="hobby" value="perm"/>烫头
    <input type="submit" value="get提交...">
</form>
<h3>post方式:</h3>
<form action="/day09_request/requestDemo3" method="post">
    用户:<input type="text" name="username"> <br>
    密码:<input type="password" name="password"> <br>
    爱好:
    <input type="checkbox" name="hobby" value="somke"/>抽烟
    <input type="checkbox" name="hobby" value="drink"/>喝酒
    <input type="checkbox" name="hobby" value="perm"/>烫头
    <input type="submit" value="post提交...">
</form>
</body>
</html>

请求乱码

前端与后台的编码不一致,tomcat默认编码是ISO-8859-1(拉丁文)
而浏览器的编码通常是UTF-8或GBK编码

解决乱码

在HttpServletRequest中,设置编码,例如:
request.setCharacterEncoding("utf-8);
这一种不利于后期的维护
或者在web.xml中配置全变变量来设置编码,例如

encode
utf-8

有利于后期的维护

Request其他功能

请求转发

由多个Servlet来分工完成一个功能
请求转发步骤

  1. 通过request对象获取请求转发对象:RequestDispacther
  2. 使用RequestDispacther对象进行转发forward(req,resp)
    代码演示
@WebServlet("/requestServletDemo01Servlet")
public class RequestServletDemo01Servlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 处理post请求乱码问题
        request.setCharacterEncoding("utf-8");
        //获取请求转发器对象
        RequestDispatcher dispatcher = request.getRequestDispatcher("/requestServletDemo02Servlet");
//      //转发
        dispatcher.forward(request,response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
@WebServlet("/requestServletDemo02Servlet")
public class RequestServletDemo02Servlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 处理post请求乱码问题
        request.setCharacterEncoding("utf-8");
        System.out.println("请求转发到这里");

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

请求转发特点

  1. 浏览器地址栏不会发生变化
  2. 只能转发当前服务器内部资源中
  3. 转发是一次请求
  4. 共享同一个请求中的数据
  5. 请求转发可以访问WEB-INF目录下的内容

域对象

一个有作用范围的对象,可以在范围内共享数据
常见域对象
Request
Session
ServletContext(application)

域对象共有方法

void setAttribute(String name,Object obj)设置数据
Object getAttribute(String name)获取数据
void removeAttribute(String name)删除数据

Request域

代表一次引用,用于一次请求中转发的多个资源中共享数据

代码实现

@WebServlet("/requestDomain01Servlet")
public class RequestDomain01Servlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 处理post请求乱码问题
        request.setCharacterEncoding("utf-8");
        System.out.println("处理功能的地方不在这");
        request.setAttribute("tom","password");
        request.getRequestDispatcher("/requestDomain02Servlet").forward(request,response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
@WebServlet("/requestDomain02Servlet")
public class RequestDomain02Servlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 处理post请求乱码问题
        request.setCharacterEncoding("utf-8");
        System.out.println("处理功能");
        Object tom = request.getAttribute("tom");
        System.out.println(tom);
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

ServletContext

ServletContext官方叫上下文,服务器会为每一个工程创建一个ServletContext对象,全局唯一,该工程内部共享该ServletContext对象

作用

  1. 作用
  2. 是一个域对象
  3. 读取全局配置参数
  4. 可以搜索当前目录下面的资源文件
  5. 可以获取当前工程名

获取方式

  1. 通过request对象获取
    request.getServletContext();
  2. 通过this获取
    this.getServletContext();

生命周期

项目创建时,ServletContext()创建
项目卸载时,ServletContext()销毁
作用范围:与项目共存亡

代码演示


@WebServlet("/servletContextDomain01Servlet")
public class ServletContextDomain01Servlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 处理post请求乱码问题
        request.setCharacterEncoding("utf-8");
        //配置全局变量
        ServletContext servletContext = request.getServletContext();
        //设置属性
        servletContext.setAttribute("encode","gbk");

        System.out.println("已保存全局变量数据");

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
@WebServlet("/servletContextDomain02Servlet")
public class ServletContextDomain02Servlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 处理post请求乱码问题
        request.setCharacterEncoding("utf-8");
       //获取全局变量ServletContext
        ServletContext servletContext = request.getServletContext();
        Object encode = servletContext.getAttribute("encode");
        System.out.println(encode);

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

获取资源文件真实路径

方法

String getRealPath(String path)获取文件的真实路径

代码演示

@WebServlet("/getRealPathServlet")
public class GetRealPathServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 处理post请求乱码问题
        request.setCharacterEncoding("utf-8");
        //获取gril.jpg文件的真实路径
        String realPath = request.getServletContext().getRealPath("/WEB-INF/img/gril.jpg");
        System.out.println(realPath);
        String realPath1 = request.getServletContext().getRealPath("/index.jsp");
        System.out.println(realPath1);
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

资源文件
在这里插入图片描述

获取MIME类型

互联网通信过程中定义的一种文件数据类型

代码演示
前端代码

<h3>post方式:</h3>
<form action="/getMimeTypeServlet" method="get">
    <input type="file" name="filename">
    <input type="submit" value="post提交...">
</form>
</body>

后端判断文件类型代码

@WebServlet("/getMimeTypeServlet")
public class GetMimeTypeServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 处理post请求乱码问题
        request.setCharacterEncoding("utf-8");
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
        //获取文件name属性
        String filename = request.getParameter("filename");
        String mimeType = request.getServletContext().getMimeType(filename);
        System.out.println("文件类型:"+mimeType);
    }
}


所属网站分类: 技术文章 > 博客

作者:小胖子爱java

链接:http://www.javaheidong.com/blog/article/221847/b85f31ea3e2df3021c75/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

14 0
收藏该文
已收藏

评论内容:(最多支持255个字符)