Request笔记

本文详细介绍了Java中的Request对象,包括其功能、重点API。Request对象主要用于获取和处理浏览器发送的请求信息,如请求方式、请求行、请求参数、请求头等。还涉及了请求转发、处理中文乱码问题、请求域中的数据共享以及如何使用BeanUtils工具类简化数据封装。
摘要由CSDN通过智能技术生成

笔记内容的发布主要是怕哪天自己的电脑挂了 之前总结的笔记会丢,所以在这个网站晒出来作为备份,笔记的内容也是自己对此技术的粗浅理解,仅供自己观看,并不能保证全部理解都是正确,还需网友观看时自行鉴别 谢谢

Request:

request对象和response对象的原理
request和response对象是由服务器创建的。我们来使用它们

request 对象是来获取请求消息
我的简单的理解:request 就是浏览器向服务器发出请求,这里面包括用户填写的一些信息数据,然后服务器通过request来获取这些数据,然后通过request的一些方法来处理我们想得到的东西。

						`浏览器————>服务器`

response 对象是来设置响应消息
我的理解就是它是来反回给浏览器消息的

						`服务器————>浏览器`

Request功能:

  1. 获取请求消息数据
    获取请求行:GET /day14/demo1?name=zhangsan HTTP/1.1

    下面 方法2 和5 的方法重点掌握

    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
    6. 获取协议及版本:HTTP/1.1 String getProtocol()
    7. 获取客户机的IP地址: String getRemoteAddr()

URL:统一资源定位符 : http://localhost/day14/demo1
URI:统一资源标识符 : /day14/demo1 (这个大)
这两个相比 URI>URL 就像 共和国(URI)要比 中华人民共和国(URL)大是一个道理
获取协议及版本:HTTP/1.1 String getProtocol()
获取客户机的IP地址:String getRemoteAddr()

@WebServlet("/RequestDemo1")  //这里千万注意默认是name  把它删了
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);
        //2. 获取虚拟目录(重要掌握)
        String contextPath = request.getContextPath();
        System.out.println(contextPath);
        //3.获取Servlet路径
        String servletPath = request.getServletPath();
        System.out.println(servletPath);
        //4.获取get方式请求参数
        String queryString = request.getQueryString();
        System.out.println(queryString);
        //5.获取请求URI(重要掌握)
        String requestURI = request.getRequestURI();
        System.out.println(requestURI);
        StringBuffer requestURL = request.getRequestURL();
        System.out.println(requestURL);
        //6. 获取协议及版本
        String protocol = request.getProtocol();
        System.out.println(protocol);
        //7. 获取客户机的IP地址:
        String remoteAddr = request.getRemoteAddr();
        System.out.println(remoteAddr);
    }
}

Connected to server
[2016-01-18 03:18:15,963] Artifact ServletDemo2:war exploded: Artifact is being deployed, please wait...
[2016-01-18 03:18:16,323] Artifact ServletDemo2:war exploded: Artifact is deployed successfully
[2016-01-18 03:18:16,323] Artifact ServletDemo2:war exploded: Deploy took 360 milliseconds
GET
/day14
/RequestDemo1
null
/day14/RequestDemo1
http://localhost:8080/day14/RequestDemo1
HTTP/1.1
0:0:0:0:0:0:0:1

获取请求体数据
请求体:只有post请求方式 才有请求体,在请求体中封装post请求的请求参数
步骤:
1 获取流对象
BufferedReader getReader():获取字符输入流,只能操作字符数据
ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
2 从流对象中拿数据

2 其他功能
1. 获取请求参数通用方式
不论get还是post请求方式都可以使用下列方法来获取请求参数
XXX.getParameter(String name).var:(常用) 根据传递的参数名称获取对应的参数值
比如在 username= zs & password= 123 中
往(String name)这里传递了username 它就给返回一个字符串zs
往(String name)这里传递了password 它就给返回一个字符串123

XXX.getParameterValues(要查询的键).var:根据传递的参数名称获取名称下所有的参数 打包成的数组
比如:hobby=xx&hobby=game 这两个的键是一样的 但是传递的值是不同的
所以用这个方法可以传递一个hobby的数组存储着两个元素

Enumeration<String> getParameterNames():获取所有请求的参数名称
XXX.getParameterNames().var:获取所有请求的参数名称
和获取请求头的方法差不多 代码如下:

 @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取所有请求的参数名称
        //获取请球头名称 放在枚举这个集合里
        Enumeration<String> parameterNames = request.getParameterNames();
        //然后拿着这个对象遍历他们
        while (parameterNames.hasMoreElements()){
            //根据名称获取请求体的值
            String name = parameterNames.nextElement();
            //打印出来
            System.out.println(name);
            //根据name获取name下的值命名为value
            String value = request.getParameter(name);
            System.out.println(value);
            //每输出一个键值对就用-----分隔
            System.out.println("-------------");
        }

Map<String,String[]> getParameterMap():获取所有参数的map集合
XXX.getParameterMap().var :(常用)获取所有参数的map集合

@Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取所有的参数map集合
        Map<String, String[]> parameterMap = request.getParameterMap();
        //遍历
        Set<String> 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("______");
        }

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

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

     request.setCharacterEncoding("utf-8");
 }

2.获取请求头数据
String getHeader(String name): 通过请求头的名称获取请求头的值(重点掌握)
Enumeration<String> getHeaderNames(): 获取所有的请求头名称

第一种:获取全部请求头名称

   @Override
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //1 获取请求头数据
       //2 获取请球头名称
       Enumeration<String> headerNames = request.getHeaderNames();
       //3 遍历
       while (headerNames.hasMoreElements()){
           String name = headerNames.nextElement();
           //根据名称获取请求头的值
           String value = request.getHeader(name);
           System.out.println(name+"+"+value);
       }
   }

第二种:通过请求头名称获取请求头的值

	 @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //演示 获取请求头数据:user-agent
        String agent = request.getHeader("user-agent");
        System.out.println(agent);
--------------------
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36

请求转发
一种在服务器内部进行资源跳转方式
1. 步骤:

  1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
  2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)

一般使用链式编程:

 request.getRequestDispatcher("/要转发的路径").forward(request,response);

例题:从sDemo2转发到sDemo3
sDemo2代码

@WebServlet("/sDemo2")
public class ServletDemo2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        System.out.println("sdemo2被访问了");
        request.getRequestDispatcher("/sdemo3").forward(request,response);
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

sDemo3代码

@WebServlet("/sdemo3")
public class ServletDemo3 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("sdemo3被访问了");
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, 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()

login.html中form表单的action路径的写法 虚拟目录+Servlet的资源路径

BeanUtils工具类:

简化数据封装 简单的说它是用于封装JavaBean的
1. JavaBean:标准的Java类
要求:
1 必须被public修饰
2 必须提供空参的构造器
3 成员变量必须使用private修饰
4 提供公共的setter和getter方法

成员变量 和属性:
  public class User {
    private String username;	---->这里的username是成员变量
  
 public String getUsername() {   ---->这里的username是属性(U转换成小写)
        return username;
    }
   大多数的时候 成员变量和属性是一样的  但是也有不一样的时候  这个需要注意
  1. 方法:
    1. setProperty(): 设置属性 赋值 BeanUtils.setProperty(空容器对象,“要赋予值的对象名”,“要赋予的值”)
    2. getProperty(): 获取属性 获取值 BeanUtils.getProperty(空容器对象,“要获取的值”)
    3. populate(Object obj , Map map): 封装JavaBean的方法 将map集合的键值对信息,封装到对应的JavaBean对象中

批量获取参数,一次性把数据封装成一个对象,简化封装
1.导入commons-beanutils-1.8.0.jar包
2. request对象使用getParameterMap返回一个map类型的值,这个返回值是全部的前端参数,但是这个map集合不能修改只能读,所以需要新建一个map对象来接收方便日后修改。
3. 新建一个空的user对象
4. 使用位于org.apache.commons.beanutils.BeanUtils下面的BeanUtils.populate(第三步获得的空容器,打包数据的map集合),括号里面传递获取的容器和map集合
5. 有异常 抓一下

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1设置编码
        req.setCharacterEncoding("utf-8");
		//1 获取全部请求参数
        Map<String, String[]> map = req.getParameterMap();
        //2 创建一个空的user对象
        User loginuser = new User();
        //3 使用BeanUtils封装
        try {
            BeanUtils.populate(loginuser,map);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

重点API

// 获取请求方式
req.getMethod();
// 获取工程名
req.getContextPath();
// 获取URL
req.getRequestURL();
// 获取IP
req.getRemoteAddr();

// 获取请求头
req.getHeader("use-agent");

// 获取请求参数
req.getParameter("username");
req.getParameterValues("hobby");
req.getParameterMap();

// 解决post请求的中文乱码
req.setCharacterEncoding("utf-8");

// 封装Javabean
BeanUtils.populate(user,map);
// 操作域对象
req.setAttribute();
req.getAttribute();
// 转发
req.getRequestDispatcher().forward();
~~~

```java

	ctrl+Ait+T 在IDEA中能召唤出很多方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值