博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【java】-servlet之request
阅读量:2241 次
发布时间:2019-05-09

本文共 12327 字,大约阅读时间需要 41 分钟。

文章目录

前言:我们上一节已经研究了。下面这一节我们来研究request。

概述:

我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大,今天我们学习HttpServletRequest。

一、request的运行流程

我们在了解response的时候,我们已经说过了response的运行流程,其实已经包含了request的流程,下面我就仅仅贴张图算了。

在这里插入图片描述

二、http 的request的组成。

在这里插入图片描述

因为request代表请求,所以我们可以通过该对象分别获得Http请求的请求行,请 求头和请求体。

三、通过request获得请求行。

在请求行中,我们知道,只有两个重要的信息:

1、请求方式:get、post
2、请求资源:web/form.html

1、获取请求方式:String getMethod()

WebContent下创建form1.html

Insert title here
账号:
密码:

在src目录下创建servlet:requestLine

package httpservletRequest;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class requestLine */public class requestLine extends HttpServlet {
private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、获取请求方式: String method=request.getMethod(); System.out.println(method); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub doGet(request, response); }}

在这里插入图片描述

访问结果:
在这里插入图片描述

2、获取请求资源:

方式:

1、String getRequestURI()
2、StringBuffer getRequestURL()
3、String getContextPath() —web应用的名称
4、String getQueryString() ---- get方式提交url地址后的参数字符串username=zhangsan&password=123
同样适用form1.html

Insert title here
账号:
密码:

servlet 方法:

package httpservletRequest;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class requestLine */public class requestLine extends HttpServlet {
private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、获取请求方式: String method=request.getMethod(); System.out.println(method); //2、请求资源内容: String requestURI=request.getRequestURI(); System.out.println("requestURI:"+requestURI); StringBuffer requestURL=request.getRequestURL(); System.out.println("requestURL:"+requestURL); String contextpath=request.getContextPath(); System.out.println("Web 应用名称contextpath:"+contextpath); String QueryString =request.getQueryString(); System.out.println("地址后面参数的字符串QueryString:"+QueryString); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub doGet(request, response); }}

点击提交按钮后:

在这里插入图片描述

注意;

最后一样之所以是null,那是 因为我们采用 的是post提交方式,如果是采用get提交方式的话,将会打印字符串:
在这里插入图片描述
补充:
我们依旧可以使用request对象获取客户机的一些信息,比如ip
request.getRemoteAddr() — 获得访问的客户端IP地址

四、通过request获得请求头。

long getDateHeader(String name)

String getHeader(String name) —常用
Enumeration getHeaderNames() --获取所以请求头中所有的名字
Enumeration getHeaders(String name) —获取某一请求头中所有的值,即,一个请求头,对应着多个值。
int getIntHeader(String name)

创建一个新的servlet:Header

package httpservletRequest;import java.io.IOException;import java.util.Enumeration;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class Header */public class Header extends HttpServlet {
private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、获取制定的头: String header=request.getHeader("User-Agent"); System.out.println("User-Agent:"+header); System.out.println("++++++++++++++++++++++++++++++++++"); //2、获取的头的名称: Enumeration
headerNames=request.getHeaderNames(); while(headerNames.hasMoreElements()) {
String headername=headerNames.nextElement(); String headervalue=request.getHeader(headername); System.out.println(headername+":"+headervalue); } System.out.println("++++++++++++++++++++++++++++++++++"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub doGet(request, response); }}

执行结果:

在这里插入图片描述

补充:referer

在最上面的照片中,我们可以发现,请求头中还有referer。置于为什么没有在上面的例子中出现,那是因为我们直接访问的地址http://localhost:8080/httpservlet_request/Header,而不是在这个地址的基础上访问的。

举个栗子:
我们创建from2.html

Insert title here 访问servletHeader资源

界面如下:

在这里插入图片描述
点击链接:
打印如下内容;
在这里插入图片描述
大家可以清楚的看到,这个referer就是访问的来源。也就是说,用户是在http://localhost:8080/httpservlet_request/form2.html这个页面上点击的请求链接。

有甚用?

判断执行该此访问的的来源,防盗链。

比如公司A有网站:。

网站上有一个新闻,链接为:


公司B有网站:

想使用A公司的新闻,为此,在B网站上需要引入A公司的新闻链接。为此可以再B网站的页面上增加一个链接:
<a href=“”>访问A公司新闻资源</a>


但是A公司不想让其他公司引用自己的链接,只想让用户来自己的A网址上访问新闻,以增加浏览量。


为此可以采用这种防盗链技术。

因为如果是在B网址上访问A网址的新闻,那么referer中就会不包含 。为此我们通过判断referer中是否以www.AAA.com开头即可防止防盗链了。

怎么用

package httpservletRequest;import java.io.IOException;import java.util.Enumeration;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class Header */public class Header extends HttpServlet {
private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用referer进行防盗链判断: //对连接新闻的来源进行判断: String referer=request.getHeader("referer"); if(referer!=null && referer.startsWith("www.AAA.com")) {
//这是从自己网站上访问的,可以跳转。 System.out.println("这是从自己网站上访问的,可以跳转"); } else {
//这不是从自己网站上访问的,不可以跳转。 System.out.println("这不是从自己网站上访问的,不可以跳转。"); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub doGet(request, response); }}

五、通过request获得请求体。

请求体中的内容是通过post提交的请求参数,格式是:

username=zhangsan&password=123&hobby=football&hobby=basketball

获取方法:

String getParameter(String name)
String[] getParameterValues(String name)
Enumeration getParameterNames()
Map<String,String[]> getParameterMap()

增加一个网页:

Insert title here
账号:
密码:
爱好:
足球
篮球
乒乓球

在这里插入图片描述

新建一个servlet:requestBody

package httpservletRequest;import java.io.IOException;import java.util.Enumeration;import java.util.Map;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class requestBody */public class requestBody extends HttpServlet {
private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、获取单个请求表单值: String username=request.getParameter("username"); System.out.println(username); System.out.println("+++++++++++++++++++++++++++++"); //2、获取多个表单值: String[] hobbys=request.getParameterValues("hobby"); for(String hobby:hobbys) {
System.out.println(hobby); } System.out.println("+++++++++++++++++++++++++++++"); //3、获取所以的请求参数值: Enumeration
paraNames=request.getParameterNames(); while(paraNames.hasMoreElements()) {
System.out.println(paraNames.nextElement()); } System.out.println("+++++++++++++++++++++++++++++"); //4、获取所有的参数,并封装到map
Map
parameterMap=request.getParameterMap(); for(Map.Entry
entry:parameterMap.entrySet()) {
System.out.println(entry.getKey()); for(String str:entry.getValue()) {
System.out.println(str); } System.out.println("&&&&&&&&&&&&&&&"); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub doGet(request, response); }}

在这里插入图片描述

注意:get请求方式的请求参数 上述的方法一样可以获得

解决post提交方式的乱码: request.setCharacterEncoding(“UTF-8”);
解决get提交的方式的乱码: parameter = new String(parameter.getbytes(“iso8859-1”),“utf-8”);

六、通过request完成请求转发

说道请求转发,我们要和response中的重定向进行对比了。详细了解重定向用法,访问:

我们下面通过一个 图来对比重定向和请求转发:

在这里插入图片描述

转发与重定向的区别?

1)重定向两次请求,转发一次请求
2)重定向地址栏的地址变化,转发地址不变
3)重新定向可以访问外部网站 转发只能访问内部资源
4)转发的性能要优于重定向

实现请求转发需要以下两个方法:

获得请求转发器----path是转发的地址

RequestDispatcher getRequestDispatcher(String path)
通过转发器对象转发
requestDispathcer.forward(ServletRequest request, ServletResponse response)

Demo

我们分别创建servlet1和servlet2

servlet1

package httpservletRequest;import java.io.IOException;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class servlet1 */public class servlet1 extends HttpServlet {
private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//servlet1将请求转给servlet2 RequestDispatcher dispatcher=request.getRequestDispatcher("/servlet2");//注意,这里的地址是相对servlet1的。 //执行转发方法: dispatcher.forward(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub doGet(request, response); }}

servlet2

package httpservletRequest;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class servlet2 */public class servlet2 extends HttpServlet {
private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("hello ,my name is servlet2"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub doGet(request, response); }}

在这里插入图片描述

补充:request是一个域对象

通过上面转发的实例中,我们可以发现,从servlet1向servlet2传送的request是同一个数据域。在此次访问中,如果在servlet1中将request稍加改动,那么在servlet2中接收 到的request就是改动后的结果。

为此,我可以知道:
request对象也是一个存储数据的区域对象,只要是域对象,那么就具有如下方法:

setAttribute(String name, Object o)

getAttribute(String name)
removeAttribute(String name)

我们前面了解到ServletContext对象也是个域对象。它也具有如上三种方法,详见:

注意:request域的作用范围:一次请求中。

七、总结:

ServletContext域与Request域的生命周期比较?

1、ServletContext:
创建:服务器启动
销毁:服务器关闭
域的作用范围:整个web应用
2、request:
创建:访问时创建request
销毁:响应结束request销毁
域的作用范围:一次请求中

转发与重定向的区别?

1)重定向两次请求,转发一次请求
2)重定向地址栏的地址变化,转发地址不变
3)重新定向可以访问外部网站 转发只能访问内部资源
4)转发的性能要优于重定向

客户端地址与服务器端地址的写法?

1、客户端地址: 是客户端去访问服务器的地址,服务器外部的地址,特点:写上web应用名称
  应用: 重定向
2、服务器端地址:服务器内部资源的跳转的地址,特点:不需要写web应用的名称
  应用: 转发

八、源码连接:

转载地址:http://pxhbb.baihongyu.com/

你可能感兴趣的文章
springboot整合rabbitmq及rabbitmq的简单入门
查看>>
mysql事务和隔离级别笔记
查看>>
事务的传播属性(有坑点)自调用失效学习笔记
查看>>
REDIS缓存穿透,缓存击穿,缓存雪崩原因+解决方案
查看>>
动态代理实现AOP
查看>>
23种常见的java设计模式
查看>>
关于被final修饰的基本数据类型一些注意事项
查看>>
java Thread中,run方法和start方法的区别
查看>>
在 XML 中有 5 个预定义的实体引用
查看>>
XML 元素是可扩展的
查看>>
避免 XML 属性?针对元数据的 XML 属性
查看>>
XML DOM nodeType 属性值代表的意思
查看>>
JSP相关知识
查看>>
JDBC的基本知识
查看>>
《Head first设计模式》学习笔记 - 适配器模式
查看>>
《Head first设计模式》学习笔记 - 单件模式
查看>>
《Head first设计模式》学习笔记 - 工厂方法模式
查看>>
《Head first设计模式》学习笔记 - 装饰者模式
查看>>
《Head first设计模式》学习笔记 - 模板方法模式
查看>>
《Head first设计模式》学习笔记 - 外观模式
查看>>