HttpServletRequest对象
Posted Vodka~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HttpServletRequest对象相关的知识,希望对你有一定的参考价值。
1.HttpServletRequest对象: 主要作用是用来接收客户端发送过来的请求信息,例如: 请求的参数,发送的头信息等都属于客户端发来的信息,service()方法中形参接收的是HttpServletRequest接口的实例化对象,表示该对象主要应用在HTTP协议上,该对象由Tomcat封装好传递过来。
2.HttpServletRequest是ServletRequest的子接口,ServletRequest只有一个子接口,不将两个接口合并的原因是,ServletRequest接口目前支持的是http协议,未来若想支持其他新的协议,该协议再继承ServletRequest接口就行了,面向接口编程,一个接口尽量完成一种功能,提高颗粒度,减少系统的冗余度。
3.接收请求常用的方法:
-getRequestURL(): 获取客户端发出请求时的完整URL
-getRequestURI(): 获取请求行中的资源名称部分(项目名称开始)
-getQueryString(): 获取请求行中的参数部分
-getMethod(): 获取客户端请求方式
-getProtocal(): 获取HTTP版本号
-getContextapp(): 获取webapp名字
-getParameter(name) : 获取指定名称的参数!!!
-getParametervalues(String): 获取指定名称参数的所有值
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author Vodka
* @date 2021/08//17:42
*/
//@WebServlet(name="web",urlPatterns={"/One","/Two"})
@WebServlet(urlPatterns = {"/One","/Two"})
public class HSR extends HttpServlet {
@Override
public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
res.getWriter().write("恭喜你已连接!");
//获取请求时的完整路径,从http开始,到“?”前结束
StringBuffer url = req.getRequestURL() ;
System.out.println("请求时的完整路径:" + url);
//获取部分路径 (从项目的站点名开始,到“?”结束)
String uri = req.getRequestURI() ;
System.out.println("获取请求时的部分路径:" + uri);
//获取请求时的参数字符串(从?后面开始,直至最后)
String QueryContent = req.getQueryString() ;
System.out.println("获取请求信息携带的参数:" + QueryContent);
//获取请求方式(get和post)
String GM = req.getMethod() ;
System.out.println("获取请求方式:" + GM);
//获取当前协议版本
String Edition = req.getProtocol();
System.out.println("当前协议版本为:" + Edition);
//获取项目站点名(项目对外访问路径,即上下文路径)
String webapp = req.getContextPath();
System.out.println("项目站点名为:"+ webapp);
// -getParameter(name) : 获取指定名称的参数
String Age = req.getParameter("Age");
System.out.println("年龄是:" + Age +"岁");
// -getParametervalues(String): 获取指定名称参数的所有值
String[] Ages = req.getParameterValues("Age");
if(Ages !=null && Ages.length > 0)
System.out.println("Ages的所有值为:" + Arrays.toString(Ages));
}
}
请求时的完整路径:http://localhost:8080/vodka/One
获取请求时的部分路径:/vodka/One
获取请求信息携带的参数:Name=%E6%9D%8E%E4%BC%9F%E4%BD%B3&Age=21&Age=100&Age=4556
获取请求方式:GET
当前协议版本为:HTTP/1.1
项目站点名为:/vodka
年龄是:21岁
所有值为:[21, 100, 4556]
4.请求乱码问题:
-因为request接收的客户端参数有默认的语言编码,在解析过程中默认使用的编码方式是"ISO-8859-1"(此编码不支持中文),所以解析时一定会出现乱码,要解决乱码问题,需要设置request中的编码方式,告诉服务器以何种方式来解析数据,或者在接收乱码数据后,以何种编码格式还原。
-方式一:
request.setCharacterEncoding(“UTF-8”); (此方式只针对post有效,必须在接收所有数据之前设定)
-方式二:
-new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8")l
( 借助String对象,对任何请求都通用,但Tomcat8.0以上的版本不用这个方式,会将本来不乱码的数据,转成了乱码)
-Tomcat8以后的版本,get方式不会出现乱码
5.请求转发跳转:
request.getRequestDispatcher(url).forward(request,response);
特点:
-服务端行为
-地址栏不发生改变
-从始至终只有一个请求
-request数据可以共享 (客户端01发送信息到服务端,服务端将信息可以发到客户端02,03,等等。。。。,除了跳转到指定链接,还可以跳转到jsp页面,和html页面)
//Transport.java
package com.StartSL;
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;
import java.io.UnsupportedEncodingException;
/**
* @author Vodka
* @date 2021/08//22:23
*/
@WebServlet(name="Vodka",urlPatterns = {"/li","/jia","/login"})
public class Transport extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res){
//设置请求编码格式,post请求中文会乱码,所以要设置编码方式
try {
req.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String Name = req.getParameter("UName");
String Age = req.getParameter("UAge");
System.out.println("Li info : " + Name + " , " + Age);
//转发跳转到 /wei
try {
req.getRequestDispatcher("wei").forward(req, res);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//wei.java
package com.StartSL;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
/**
* @author Vodka
* @date 2021/08//14:18
*/
//@WebServlet(name="Vodka",urlPatterns = {"/li","/wei","/jia","/login"})
@WebServlet(urlPatterns={"/wei"})
public class MessyCode extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res){
//设置请求的编码格式
try {
req.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//获取客户端传递的参数
String Name = req.getParameter("UName");
String Age = req.getParameter("UAge");
String PassWord = req.getParameter("UPassWord");
System.out.println("WeiInfo , Name:"+ Name + " , Age: " + Age + " , PassWord: " +PassWord );
}
}
<%--
Created by IntelliJ IDEA.
User: 伟神
Date: 2021/8/6
Time: 14:34
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<form method="post" action="login">
姓名:<input type="text" name="UName"> <br>
年龄:<input type="text" name="UAge"> <br>
密码:<input type="password" name="UPassWord"> <br>
<button>登录</button>
</form>
</body>
</html>
6.request作用域: 通过该对象可以在一个请求中传递数据(实现不同的客户端数据共享),作用范围是在一次请求中有效,即服务器跳转有效。
//设置域对象内容
request.setAttribute(String name,String value);
//获取域对象内容
request.getAttribute(String name);
//删除域对象内容
request.removeAttribute(String name);
//SOne.java
package com.StartSL;
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;
import java.util.ArrayList;
import java.util.List;
/**
* @author Vodka
* @date 2021/08//0:26
*/
@WebServlet(urlPatterns={"/One"})
public class SOne extends HttpServlet {
@Override
protected void service(HttpServletRequest req , HttpServletResponse res){
//设置域对象内容
req.setAttribute("UName","Vodka");
req.setAttribute("UAge",20);
List<String> Address = new ArrayList<>();
Address.add("GuangDong Province");
Address.add("ShenZhen City");
Address.add("Shangmeilin");
req.setAttribute("Address",Address);
System.out.println("准备请求转发跳转到Two");
//请求转发跳转到 Jump.jsp,并通过域对象传递数据
try {
req.getRequestDispatcher("Two").forward(req,res);
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//STwo.java
package com.StartSL;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* @author Vodka
* @date 2021/08//0:26
*/
@WebServlet(urlPatterns={"/Two"})
public class STwo extends HttpServlet{
@Override
protected void service(HttpServletRequest req,HttpServletResponse res){
//获取域对象自定义的内容
String Name = (String) req.getAttribute("UName");
System.out.println("Name:" + Name);
Integer Age = (Integer) req.getAttribute("UAge");
System.out.println("Age:" + Age);
List<String> Address = (List<String>) req.getAttribute("Address");
if(Address != null ){
for(String i : Address){
System.out.print(i + ",");
}
}
}
}
以上是关于HttpServletRequest对象的主要内容,如果未能解决你的问题,请参考以下文章
如何在 @service 类中获取 HttpServletRequest 对象
为啥 HttpServletRequest 对象在从一个 servlet 转发到另一个 servlet 时会发生变化?
HttpServletRequest和ServletRequest的区别以及HttpServletRequest对象方法的用法