java request怎么定义_Java学习之Request篇

Java学习之Request篇

0x00 前言

在b/s架构里面,请求和响应是必不可少的。访问网页时,会发出一个request请求,服务器接收到请求后,根据设定代码,给我们响应对应的内容。

0x01 Request和Response概念

Request和Response:

request对象和response对象的原理

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

request对象是来获取请求消息,response对象是来设置响应消息

request继承体系:

ServletRequest --接口

丨继承

HttpServlet --接口

丨实现

org.apache.catalina.connector.RequestFacade 类(tomcat)

0x02 Request请求

常用方法:

String getMethod() 获取请求方式

String getContextPath() 获取虚拟路径

String getServletPath() 获取Servlet路径

String getQueryString() 获取get请求方式参数

String getRequestURI() 获取请求uri

StringBuffer getRequestURL() 获取URL

String getProtocol() 获取协议版本

String getRemoteAddr() 获取客户端ip

String getHeader(String name) 通过请求头的名称获取请求头的值

Enumeration getHeaderNames(): 获取所有的请求头名称

代码:

package it.Test.servlet;

import javax.servlet.*;

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(urlPatterns = "/demo")

public class servelet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String header = req.getHeader("user-agent");//获取ua

System.out.println(header);

String method = req.getMethod();//获取请求方式

System.out.println(method);

String contextPath = req.getContextPath(); //获取虚拟路径

System.out.println(contextPath);

String servletPath = req.getServletPath(); //获取servlet路径

System.out.println(servletPath);

String queryString = req.getQueryString();//获取get请求参数

System.out.println(queryString);

String requestURI = req.getRequestURI();//获取uri路径

System.out.println(requestURI);

StringBuffer requestURL = req.getRequestURL();//获取完整url路径

System.out.println(requestURL);

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

System.out.println("post请求");

}

}

获取post请求数据:

* BufferedReader getReader():获取字符输入流,只能操作字符数据

ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据

为了演示post请求,这里写一段html代码提交post数据。

读取post请求代码:

BufferedReader reader = req.getReader();

String line = null;

while ((line = reader.readLine())!=null){

System.out.println(line);

通用方式:

String getParameter(String name):根据参数名称获取参数值

String[] getParameterValues(String name):根据参数名称获取参数值的数组

Enumeration getParameterNames():获取所有请求的参数名称

Map getParameterMap():获取所有参数的map集合

代码实例:

package it.Test.servlet;

import javax.servlet.*;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.util.Enumeration;

import java.io.BufferedReader;

import java.io.IOException;

import java.util.Enumeration;

import java.util.Map;

import java.util.Set;

@WebServlet(urlPatterns = "/demo")

public class servelet extends HttpServlet {

private Object Enumeration;

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

req.setCharacterEncoding("utf-8"); //设置编码

//getParameter方法

String username = req.getParameter("username");//获取提交的username的值

System.out.println(username);

//getParameterValues方法

String[] usernames = req.getParameterValues("username");//根据参数获取参数值爆出为数值

for (String s : usernames) {

System.out.println(s);

}

//getHeaderNames()方法

Enumeration headerNames = req.getHeaderNames();//获取所有参数名

while (headerNames.hasMoreElements()){

String s = headerNames.nextElement(); //遍历参数名

System.out.println(s);

String value = req.getParameter(s); //使用getParameter遍历参数的值

System.out.println(value);

}

//parameterMap方法

Map parameterMap = req.getParameterMap();

Set strings = parameterMap.keySet(); //获取所有键名

for (String name : strings) {

String[] strings1 = parameterMap.get(name); //使用get方法,获取所有键的值

System.out.println(name);

for (String value : strings1) {

System.out.println(value);

}

}

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

this.doGet(req,resp);

}

}

tomcat8版本后,get请求方式乱码已解决,但是在post里面需要手工去设置。

请求转发

在一个servlet里面可能功能比较单一,我们可以定义2个servlet将该请求转发到另一个servlet里面去进行处理。

常用方法:

通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)

使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)

servlet1代码:

@WebServlet("/demo12")

public class ServletDemo extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

req.getRequestDispatcher("/demo00").forward(req,resp);

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

super.doPost(req, resp);

}

}

servlet2代码:

@WebServlet("/demo00")

public class ServletDemo2 extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

System.out.println("demo2被访问");

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

super.doPost(req, resp);

}

}

该方法只能访问服务器内部资源,而且请求被转发时url不会进行跳转。

共享数据

域对象:一个有作用范围的对象,可以在范围内共享数据

request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据

方法:

1. void setAttribute(String name,Object obj):存储数据

2. Object getAttitude(String name):通过键获取值

3. void removeAttribute(String name):通过键移除键值对

servelet1代码:

req.setAttribute("name","abc"); //存储数据到request域里面

req.getRequestDispatcher("/demo00").forward(req,resp);

在servelet1转发前先进行域数据的存储,然后再进行转发。

servelet2代码:

Object name = req.getAttribute("name");

System.out.println(name);

使用getAttribute方法获取request域共享数据。

0x03 结尾

request大致内容就这么多,主要还得多敲代码,不然容易忘。下篇文章更新Response内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值