HttpServletRequest对象简介
HttpServletRequest对象:主要作用是用来接受客户端发送来的请求信息,例如:请求的参数,发送的头信息等,都属于客户端发送来的信息,service方法中形参接受的是HttpServlet接口的实例化对象,表示该对象主要应用在HTTP协议上,该对象是由Tomact封装好传递过来。
HttpServletRequest是ServletRequest的子接口,ServletRequest只有一个子接口,就是HttpServletRequest接口,既然只有一个子接口为什么不合并呢?
从长远上讲,现在使用的协议大多是Http协议,但以后可能会出来更多新的协议,若以后想要支持新的协议就只需要继承ServletRequest接口就可以了。
在HttpServletRequest接口中,定义的方法有很多,但都是围绕接受客户端参数的,但是怎么拿到该对象呢?不需要,直接Service方法中由容器传入过来,而我们需要做的就是提取对象中的数据进行分析处理。
接受请求常用方法
获取请求参数
package com.classStudy.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/s01")
public class ServletClass01 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 常用方法
*/
//1.获取请求时的完整路径,从http开始到?前面结束
String url=request.getRequestURI().toString();//StringBuffer类型需要toString转换
System.out.println("获取请求的完整路径:"+url);
//2.获取请求时的部分路径,从项目的站点名开始到?前面结束
String uri=request.getRequestURI();
System.out.println("获取部分路径:"+uri);
//3.获取请求时的参数字符串,从?后面开始,到最后的字符串
String queryString=request.getQueryString();
System.out.println("获取请求时的参数字符串"+queryString);
//4.获取请求方式,(Get,Post)
String method=request.getMethod();
System.out.println("获取请求方式:"+method);
//5.获取当前协议版本(Http1.1)
String protocol=request.getProtocol();
System.out.println("获取当前的协议版本"+protocol);
//6.获取项目的站点名(项目的对外访问路径)
String webapp=request.getContextPath();//上下文路径,其实就是项目名
System.out.println("获取站点名:"+webapp);
/**
* 获取请求的参数
*/
//1.获取指定名称的参数值(重点!!!!!!)返回字符串
String uname=request.getParameter("uname");//不管那边传过来的是什么数据类型,到这边都是一个字符串。
String upwd=request.getParameter("upwd");
System.out.println(uname+upwd);
//2.获取指定名称的参数的全部参数值(用于复选框传值)返回字符串数组
String[] hobbys=request.getParameterValues("hobby");
//做遍历前做非空判断,养成这个好习惯。判断数组是否为空
if (hobbys!=null&&hobbys.length>0){
for (String hobby:hobbys) {
System.out.println("爱好"+hobby);
}
}
}
}
请求乱码问题
由于现在的request属于接受客户端的参数,所以必然有其默认的语言编码,主要是由于在解析过程中默认的编码方式为ISO-8859-1(此编码不支持中文),所以解析时会出现乱码。想要解决这个乱码问题,需要设置request中的编码方式,告诉服务器以何种方式来分析数据。或者在接受到乱码以后再通过相应的编码格式还原。
方法1:
乱码原因是因为request的默认编码不支持中文,Tomact10及以上版本不会乱码。
改变解析编码后就不会乱码了
设置服务器的编码request.setCharacterEncoding("UTF-8");必须在获取之前设置。这个方法只针对Post请求。
Tomact8以下版本会出现问题。
方乱码原因是因为request的默认编码不支持中文,Tomact10及以上版本不会乱码。
改变解析编码后就不会乱码了。
设置服务器的编码request.setCharacterEncoding("UTF-8");必须在获取之前设置。这个方法只对Post请求有用,其他请求还是会乱码。
方法2:
new String的方式,先得到你乱码的再给你还原。
解决Tomcat7及以下版本的Get请求乱码 。 String name=new String(request.getParameter("uname").getBytes("ISO-8859-1"),"UTF-8");
new String 不能随便用,在Tomcat8及以上版本用回出现新的乱码问题 。 new String 主要是用在Tomcat7及以下版本用于解决get请求的问题。
如果数据本身不乱码,还使用new String 会出现新的乱码问题。
package com.classStudy.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 请求乱码问题
* 只有中文会出现乱码英文不会的
* Tomcat8以上版本Get请求不会乱码Post请求会乱码
* Tomcat10及以上版本都不会乱码
* 从地址栏直接访问就是Get请求
*
* 乱码原因是因为request的默认编码不支持中文,Tomact10及以上版本不会乱码。
*
* 改变解析编码后就不会乱码了
*
* 设置服务器的编码request.setCharacterEncoding("UTF-8");必须在获取之前设置。
*
*/
@WebServlet("/s02")
public class ServletClass02 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置请求的编码格式
request.setCharacterEncoding("UTF-8");//这个方法只针对Post请求其他请求没用
//获取客户端传递的参数
String uname=request.getParameter("uname");
String upwd=request.getParameter("upwd");
System.out.println("姓名:"+uname);
System.out.println("密码:"+upwd);
//解决Tomcat7及以下版本的Get请求乱码
//String name=new String(request.getParameter("uname").getBytes("ISO-8859-1"),"UTF-8");
//new String 不能随便用,在Tomcat8及以上版本用回出现新的乱码问题
//new String 主要是用在Tomcat7及以下版本用于解决get请求的问题
}
}
请求转发
请求转发是一种服务器行为,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的URL地址不会改变,得到响应后服务器端再将响应发送给客户端,从始至终只有一个请求发出。实现方式如下,达到多个资源协同响应的效果。
request.getRequestDispatcher(url).forward(request,response);
请求转发就是让我们能够从后台跳转到前台,可以进行后台Servlet的跳转,也可以进行后台跳转到jsp和html页面等。
特点:
- 1.地址栏不发生改变。
- 2.服务端行为。
- 3.从始至终只有一个请求也就是04当中用的就是03的请求
- 4.request数据可以共享。
package com.classStudy.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 请求转发 跳转
* request.getRequestDispatcher(url).forward(request,response);
* 可以让请求从服务端跳转到我们的客户端
* 或者跳转到指定的servlet
* 服务端行为
* 特点:
* 1.地址栏不发生改变。
* 2.服务端行为。
* 3.从始至终只有一个请求也就是04当中用的就是03的请求
* 4.request数据可以共享。
*
*/
@WebServlet("/s03")
public class ServletClass03 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接受客户端请求的参数
String uname=request.getParameter("uname");
System.out.println("ServletClass03 uname"+uname);
//从03跳转到04
//请求转发跳转到ServletClass04
//request.getRequestDispatcher("s04").forward(request,response);
//请求转发跳转到jsp页面
// request.getRequestDispatcher("login.jsp").forward(request,response);
//请求跳转到HTML页面
request.getRequestDispatcher("login.html").forward(request,response);
}
}
request作用域
通过该对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效。
域对象,就是一个对象放到了一个特殊的作用域里面。这个域的特点在于,它的数据可以被我们的客户端获取。我们写的变量和对象浏览器或者说客户端拿不到,只有java代码可以拿到,客户端想要拿到就必须在一个特殊的作用域里面。
通过request作用域在一个请求中传递数据,想要有数据传递给客户端,我们就通过域对象来传递。只会在请求转发中有效。
//设置域对象
request.setAttribute(String name,String value);
//获取域对象内容
request.getAttribute(String name);
//删除域对象内容
request.removeAttribute(String name);
Servlet代码:
package com.classStudy.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* request作用域
* 通过该对象可以在一个请求中传递数据
* 作用范围:在一次请求中有效,即服务器跳转有效,也就是跳转时有效
*/
@WebServlet("/s05")
public class ServletClass05 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Servlet05..................");
//设置域对象
request.setAttribute("name","admin");
request.setAttribute("age",18);
List<String> list=new ArrayList<>();
list.add("aaa");
list.add("bbb");
request.setAttribute("list",list);
//请求转发跳转到Servlet06
// request.getRequestDispatcher("/s06").forward(request,response);
//请求转发跳转到jsp并通过域对象传输数据,因为html是一个静态页面无法来操作后台数据
request.getRequestDispatcher("index.jsp").forward(request,response);
}
}
jsp代码:
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA.
User: 28246
Date: 2023/2/4
Time: 15:38
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h2>index页面</h2>
<%--如果要在jsp中写java代码,需要写在脚本段中--%>
<%
//获取域对象,这里用来写java代码
String name= (String) request.getAttribute("name");
System.out.println("name:"+name);
Integer age= (Integer) request.getAttribute("age");
System.out.println("age:"+age);
List<String> list= (List<String>) request.getAttribute("list");
System.out.println(list.get(0));
%>
</body>
<h1>name</h1>
</html>