HttpServletRequest对象表示客户端浏览器发起的请求,当客户端浏览器通过HTTP协议访问服务器时,Tomcat会将HTTP请求中的所有信息解析并封装在HttpServletRequest对象,通过该对象所提供的方法,可以获得客户端请求的所有信息。

通过HttpServletRequest对象获取请求信息

1)getRequestURL()

返回客户端浏览器发出请求时的完整URL。

2)getRequestURI()

返回请求行中的指定资源部分。

3)getRemoteAddr()

返回发出请求的客户机的IP地址。

4)getLocalAddr()

返回Web服务器的IP地址。

5)getLocalPort()

返回Web服务器处理Http协议的连接器所监听的端口。

代码:

    @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //返回客户端浏览器发出请求时的完整URL。
StringBuffer requestURL=request.getRequestURL();
//返回请求行中指定资源部分。
String requestURI=request.getRequestURI();
//返回发出请求的客户机的IP地址。
String remoteAddr=request.getRemoteAddr();
//返回WEB服务器的IP地址。
String localAddr=request.getLocalAddr();
//返回WEB服务器处理Http协议的连接器所监听的端口。
int localPort=request.getLocalPort(); //获取响应对象中的流,返回给客户端
PrintWriter pw=response.getWriter();
//将数据返回给客户端
pw.println(requestURL);
pw.println(requestURI);
pw.println(remoteAddr);
pw.println(localAddr);
pw.println(localPort);
}

运行结果:

通过HttpServletRequest对象获取表单数据

用post提交的表单数据更安全,不会在地址栏显示提交信息

getParameter("key")

根据key值获取指定value,返回一个字符串

1)创建form表单:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="getrequestdata" method="post">
姓名:<input type="text" name="username" /><br>
密码:<input type="text" name="password" /><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>

2)创建servlet

public class GetRequestData extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取用户名
String username=req.getParameter("username");
//获取密码
String password=req.getParameter("password"); //获取响应对象response的流,将结果返回给客户端
PrintWriter pw=resp.getWriter();
//输出username
pw.println("username:"+username);
//输出password
pw.println("password:"+password);
}

运行结果:

通过HttpServletRequest对象获取复选框(checkbox)的数据

getParameterValues("checkboxkey")

获取复选框(checkbox组件)中的值,返回一个字符串数组

1)添加checkbox复选框

    爱好:<br>
<input type="checkbox" name="hobby" value="shufa">书法<br>
<input type="checkbox" name="hobby" value="zuqiu">足球<br>
<input type="checkbox" name="hobby" value="ganqing">钢琴<br>
<input type="checkbox" name="hobby" value="yumaoqiu">羽毛球<br>

2)获取复选框的数据返回给客户端浏览器

//获取复选框数据
String[] hobby=req.getParameterValues("hobby");
List<String> hobbys= Arrays.asList(hobby);
//将复选框内容输出到客户端浏览器
pw.println(hobbys);

运行结果:

获取所有提交数据的key

getParameterNames()

获取请求中所有数据的key,返回一个枚举类型。

        //获取表单中的所有key,返回枚举类型
Enumeration<String> enumeration=req.getParameterNames();
List<String > paraList=new ArrayList<>();
while (enumeration.hasMoreElements()){
paraList.add(enumeration.nextElement());
} //将form表单中所有key输出到客户端浏览器
pw.println("keys"+paraList);

使用Map结构获取提交数据

getParameterMap()

获取请求中所有的数据并存放到一个Map结构中,返回一个 Map,其中key为String类型,value为String[]类型。

        //用Map结构获取提交数据
Map<String,String[]> parameterMap=req.getParameterMap();
Iterator<Map.Entry<String,String[]>> iterator=parameterMap.entrySet().iterator();
//将map中的所有数据输出到客户端浏览器
//从Iterator迭代器中取出每一个Entry,再从Entry取出每一个key-value
while (iterator.hasNext()){
Map.Entry<String,String[]> entry=iterator.next();
String key=entry.getKey();
String[] value=entry.getValue();
pw.println("key:"+key);
pw.println("value:"+Arrays.asList(value));
}

如何设置请求编码

产生乱码的原因

由于请求的数据包是基于字节在网络上传输的,Tomcat接收到请求数据包后会将数据包中的字节转换为字符。而在Tomcat中使用的是ISO-8859-1的单字节编码来完成字节与字符的转换,因此当数据中含有中文时会出现乱码

如何解决

方法一:

手动重新设置编码

        //获取用户名
String username=req.getParameter("username");
String name=new String(username.getBytes("ISO-8859-1"),"UTF-8");

方法二:

通过resquest.setCharacterEncoding("utf-8")对提交的数据根据指定编码方式重新做编码处理,必须在获取请求数据前进行设置

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

资源访问路径

绝对路径

绝对路径访问资源表示直接以”/”作为项目的Context Path。

适用于以”/”作为项目的Context Path。

相对路径

相对路径访问资源表示会相对于项目的Context Path作为相对路径。

适用于为项目指定的具体的Context Path。

获取请求头信息

getHeader("headerKey")

根据请求头中的key,获取对应的value

String headerValue = req.getHeader("headerKey");

getHeaderNames()

获取请求头所有的key,返回枚举类型

Enumeration<String> headerNames = req.getHeaderNames();
    @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取响应对象的流
PrintWriter pw=resp.getWriter();
//获取请求头的所有key,返回枚举类型
Enumeration<String> enumeration=req.getHeaderNames();
while (enumeration.hasMoreElements()){
//遍历获取key值
String key=enumeration.nextElement();
//通过key值获取value
String value=req.getHeader(key);
//输出到浏览器
pw.println(key+":"+value);
pw.flush();
}
pw.close();
}

 案例:

编写一个Servlet,如果浏览器的语言是zh-CN,显示“你好, 聪明的中国人!”,如果浏览器的语言设置为en-US,那么则显示 “Hello,American”。

    @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应编码
resp.setContentType("text/html;charset=utf-8");
//获取响应对象的流
PrintWriter pw=resp.getWriter();
//获取浏览器所支持的语言
String vlaue=req.getHeader("accept-language");
//是否包含"zh-CN"字符串
if (vlaue.contains("zh-CN")){
pw.println("你好,中国人!");
}//是否包含"en-US"字符串
else if(vlaue.contains("en-US")){
pw.println("Hello,American!");
}
pw.flush();
pw.println();
}

HttpServletRequest对象的生命周期

1)有请求到达Tomcat时,Tomcat会解析请求

2)创建HttpServletResquest对象,将解析出来的请求封装到HttpServletResques对象中

3)将该对象通过参数的方式传递到Servlet的方法中

4)当请求处理完毕并产生响应后该对象的生命周期结束

servlet中的HttpServletRequest对象的更多相关文章

  1. Servlet中的request对象、重定向和转发的差别(6)

    1.这里所说的request对象指的是HttpServletRequest对象,它代表client的请求,当client通过HTTP协议訪问server时.HTTP请求头中的全部信息都封装在这个对象中 ...

  2. Java web 中的HttpServletRequest对象

    一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...

  3. servlet中的ServletConfig对象

    ServletConfig对象对应web.xml文件中的<servlet>节点.当Tomcat初始化一个Servlet时,会创建ServletConfig对象,并将该Servlet的配置信 ...

  4. servlet中的ServletContext对象

    ServletContext官方叫Servlet上下文.服务器会为每一个Web应用创建一个ServletContext对象.这个对象全局唯一,而且Web应用 中的所有Servlet都共享这个对象(在整 ...

  5. 在Spring MVC Controller中注入HttpServletRequest对象会不会造成线程安全的问题

    做法: 1.比如我们在Controller的方法中,通常是直接将HttpServletRequest做为参数,而为了方便节省代码,通常会定义为全局变量,然后使用@Autowire注入. 说明: 1.观 ...

  6. servlet中的HttpServletResponse对象

    当有多个客户端浏览器去请求Tomcat时,Tomcat会为每一个客户端浏览器创建一对独立的HttpServletRequest与HttpServletResponse对象 HttpServletRes ...

  7. [原创]java WEB学习笔记05:Servlet中的ServletConfig对象

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  8. 关于Servlet中的HttpServletRequest和HttpServletResponse

    1.HttpServletRequest 方    法 说    明 getAttributeNames() 返回当前请求的所有属性的名字集合 getAttribute(String name) 返回 ...

  9. spring mvc在普通类中获取HttpServletRequest对象

    如题,需要在web.xml中配置request监听,如下 <listener> <description>spring request监听器</description&g ...

随机推荐

  1. 通过ILSpy反编译工具和ilasm修改.NET程序

    文章来源:https://blog.peos.cn/2016/12/26/ilspy-ilasm-ildasm-net.html 金庸群侠传X中,田青文.木婉清.王语嫣的点穴游戏忒难过了,所以上网摸索 ...

  2. KTL 一个支持C++14编辑公式的K线技术工具平台 - 第四版,稳定支持Qt5编程,zqt5语法升级,MA函数提升性能1000%,更多公式算法的内置优化实现。

    K,K线,Candle蜡烛图. T,技术分析,工具平台 L,公式Language语言使用c++14,Lite小巧简易. 项目仓库:https://github.com/bbqz007/KTL 国内仓库 ...

  3. linux中rlwrap安装

    转至:https://www.cnblogs.com/hw-1015/p/6601294.html 在linux上使用sqlplus命令的时候,上下键.空格键.删除键都不能使用,非常麻烦.安装了rlw ...

  4. 小白文-SpringMVC-解读DispatcherServlet源码

    SpringMVC 学习完Spring框架技术之后,差不多会出现两批人: 一批是听得云里雾里,依然不明白这个东西是干嘛的: 还有一批就是差不多理解了核心思想,但是不知道这些东西该如何去发挥它的作用. ...

  5. Chrome:查看用户代理User-Agent

    用户代理(User-Agent)是浏览器客户端与服务器交互时的重要信息之一,用于帮助服务器识别请求用户的浏览器类别,以便于网站发送相应的网页数据. 用户代理数据包括:操作系统标识.加密等级标识和浏览器 ...

  6. P1424

    #include <stdio.h> int main(){ int s = 250; int x, n, distance = 0; scanf("%d %d",&a ...

  7. js和C# 编码 解码

    C#中对URL编码的方法... 编码:Server.UrlEncode(string) 解码:Server.UrlDecode(string) HttpUtility.UrlEncode(string ...

  8. 『现学现忘』Docker相关概念 — 1、云计算概念

    目录 1.云计算的概念 2.示例说明云计算 3.小故事说明云计算 "云计算"这个词,相信大家都非常熟悉. 作为信息科技发展的主流趋势,它频繁地出现在我们的眼前.伴随它一起出现的,还 ...

  9. 创建 maven项目时:Cannot resolve Plugin org.apache.maven.plugins:maven-install-plugin报错

    Maven在每一次下载jar包的过程中,一旦第一次下载完成后,就会有一个lastUpdate文件,表示该jar包已经下载.下次再检索这个包,也就不会去远程仓库进行下载. 解决办法:找到自己的maven ...

  10. 02 基础 卸载JDK 安装JDK Java程序运行机制

    基础 JDK:Java Development Kit(Java开发者工具 包含JRE和JVM) JRE:Java Runtime Environment(java运行时环境,包含JVM) JVM:J ...