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内容。