博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Request
阅读量:5220 次
发布时间:2019-06-14

本文共 10253 字,大约阅读时间需要 34 分钟。

一、Request原理和继承体系

1. request对象和response对象的原理    1. request和response对象是由服务器创建的。我们来使用它们    2. request对象是来获取请求消息,response对象是来设置响应消息2. request对象继承体系结构:        ServletRequest        --    接口        |    继承    HttpServletRequest    -- 接口        |    实现    org.apache.catalina.connector.RequestFacade 类(tomcat)

二、Request功能

1、获取请求行数据

1. 获取请求消息数据    1. 获取请求行数据        * GET /day14/demo1?name=zhangsan HTTP/1.1        * 方法:            1. 获取请求方式 :GET                * String getMethod()              2. (*)获取虚拟目录:/day14                * String getContextPath()            3. 获取Servlet路径: /demo1                * String getServletPath()            4. 获取get方式请求参数:name=zhangsan                * String getQueryString()            5. (*)获取请求URI:/day14/demo1                * String getRequestURI():        /day14/demo1                * StringBuffer getRequestURL()  :http://localhost/day14/demo1                * URL:统一资源定位符 : http://localhost/day14/demo1    中华人民共和国                * URI:统一资源标识符 : /day14/demo1                    共和国                        6. 获取协议及版本:HTTP/1.1                * String getProtocol()            7. 获取客户机的IP地址:                * String getRemoteAddr()---------------------------------package cn.itcast.web.request;import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;@WebServlet("/requestDemo1")public class RequestDemo1 extends HttpServlet {    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    }    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        //获取请求方式        String method = request.getMethod();        System.out.println(method);        //获取虚拟目录        String contextPath = request.getContextPath();        System.out.println(contextPath);        //获取Servlet路径        String servletPath = request.getServletPath();        System.out.println(servletPath);        //获取get方式请求参数        String queryString = request.getQueryString();        System.out.println(queryString);        //获取请求URI        String requestURI = request.getRequestURI();        System.out.println(requestURI);        StringBuffer requestURL = request.getRequestURL();        System.out.println(requestURL);        //获取协议及版本        String protocol = request.getProtocol();        System.out.println(protocol);        //获取客户机的IP地址        String remoteAddr = request.getRemoteAddr();        System.out.println(remoteAddr);    }}

2、获取请求头数据

* 方法:    * (*)String getHeader(String name):通过请求头的名称获取请求头的值    * Enumeration
getHeaderNames():获取所有的请求头名称----------------------------------@WebServlet("/requestDemo2")public class RequestDemo2 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //演示获取请求头数据:user-agent String agent = request.getHeader("user-agent"); //判断agent的浏览器版本 if(agent.contains("Chrome")) { //谷歌 System.out.println("谷歌..."); } else if(agent.contains("Firefox")) { System.out.println("火狐..."); } }}----------------------------------@WebServlet("/requestDemo4")public class RequestDemo4 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //演示获取请求头数据:referer String referer = request.getHeader("referer"); System.out.println(referer); //防盗链 if(referer != null) { if(referer.contains("/day14")) { System.out.println("正常的"); }else { System.out.println("盗链"); } } }}

3、获取请求体数据

* 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数    * 步骤:        1. 获取流对象            *  BufferedReader getReader():获取字符输入流,只能操作字符数据            *  ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据                * 在文件上传知识点后讲解        2. 再从流对象中拿数据-----------------------------------@WebServlet("/requestDemo5")public class RequestDemo5 extends HttpServlet {    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        //获取请求消息体--请求参数        //1.获取字符流        BufferedReader br = request.getReader();        //2.读取数据        String line = null;        while ((line = br.readLine()) != null) {            System.out.println(line);        }    }    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    }}

4、获取请求参数

1. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数    1. String getParameter(String name):根据参数名称获取参数值    username=zs&password=123    2. String[] getParameterValues(String name):根据参数名称获取参数值的数组  hobby=xx&hobby=game    3. Enumeration
getParameterNames():获取所有请求的参数名称 4. Map
getParameterMap():获取所有参数的map集合--------------------------------package cn.itcast.web.request;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.BufferedReader;import java.io.IOException;import java.util.Enumeration;import java.util.Map;import java.util.Set;@WebServlet("/requestDemo6")public class RequestDemo6 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //post 获取请求参数 //根据参数名称获取参数值 String username = request.getParameter("username"); System.out.println("post"); System.out.println(username); //根据参数名称获取参数值的数组 String[] hobbies = request.getParameterValues("hobby"); for(String hobby : hobbies) { System.out.println(hobby); } //获取所有请求的参数名称 Enumeration
parameterNames = request.getParameterNames(); while (parameterNames.hasMoreElements()) { String name = parameterNames.nextElement(); System.out.println(name); String value = request.getParameter(name); System.out.println(value); System.out.println("--------------"); } //获取所有参数的map集合 Map
parameterMap = request.getParameterMap(); //遍历 Set
keyset = parameterMap.keySet(); for(String name : keyset) { String[] values = parameterMap.get(name); System.out.println(name); for(String value: values) { System.out.println(value); } System.out.println("-------------"); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //get 获取请求参数 //根据参数名称获取参数值// String username = request.getParameter("username");// System.out.println("post");// System.out.println(username); this.doPost(request,response); }}

5、中文乱码问题

* get方式:tomcat 8 已经将get方式乱码问题解决了* post方式:会乱码    * 解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");

6、请求转发

请求转发:一种在服务器内部的资源跳转方式    1. 步骤:        1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)        2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)     2. 特点:        1. 浏览器地址栏路径不发生变化        2. 只能转发到当前服务器内部资源中。        3. 转发是一次请求            3. 共享数据:        * 域对象:一个有作用范围的对象,可以在范围内共享数据        * request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据        * 方法:            1. void setAttribute(String name,Object obj):存储数据            2. Object getAttitude(String name):通过键获取值            3. void removeAttribute(String name):通过键移除键值对    4. 获取ServletContext:        * ServletContext getServletContext()------------------------------------@WebServlet("/requestDemo8")public class RequestDemo8 extends HttpServlet {    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        System.out.println("demo8888被访问了。。。");        //转发到demo9资源/*        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/requestDemo9");        requestDispatcher.forward(request,response);        */        //存储数据到request域中        request.setAttribute("msg","hello");        request.getRequestDispatcher("/requestDemo9").forward(request,response);        //request.getRequestDispatcher("http://www.itcast.cn").forward(request,response);    }    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        this.doPost(request,response);    }}@WebServlet("/requestDemo9")public class RequestDemo9 extends HttpServlet {    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        //获取数据        Object msg = request.getAttribute("msg");        System.out.println(msg);        System.out.println("demo9999被访问了。。。");    }    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        this.doPost(request,response);    }}---------------------------获取ServletContext@WebServlet("/requestDemo10")public class RequestDemo10 extends HttpServlet {    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        ServletContext servletContext = request.getServletContext();        System.out.println(servletContext);    }    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        this.doPost(request,response);    }}

转载于:https://www.cnblogs.com/weiyiming007/p/11584141.html

你可能感兴趣的文章
CSS编写技巧
查看>>
linux中fork()函数详解 ...
查看>>
12个常用的js正则表达式
查看>>
win7:你需要来自Administrators的权限才能对此文件进行修改的一个文件
查看>>
正则表达式划分CSV
查看>>
笔记 2、分布式系统基础设施
查看>>
git
查看>>
Cisco设备管理
查看>>
【ACM从零开始】LeetCode OJ-Delete Node in a Linked List
查看>>
把ajax包装成promise的形式(3)
查看>>
手指长按事件
查看>>
简单斐波那契
查看>>
Linux内核TC工具链路带宽设计--无类队列规定
查看>>
LAMP环境搭建
查看>>
筹集资金只为那一个梦
查看>>
chkdsk 命令对Raid盘检测和查错、修复
查看>>
什么是文件系统?
查看>>
bootstrap 02
查看>>
python 一些小知识
查看>>
Linux - CentOS JDK-6u32-linux-i586.bin的安装
查看>>