Java Web -- Servlet(13)HttpServletRequest详解(获取请求数据、请求分派、请求域)(2)

HttpServletRequest

----------------------------------------------------------------

(4)请求分派

Servlet API中定义了一个RequestDispatcher接口,俗称请求分派器。

它有两个方法

forward(ServletRequest request,ServletResponse response)

include(ServletRequest request,ServletResponse response)

Forward()方法用于将请求转发到RequestDispatcher实例封装的资源;

Include()方法用于将RequestDispatcher实例封装的资源作为当前响应内容的一部分包含进来。

而获取RequestDispatcher实例也主要有两种。

调用ServletContext接口提供的getRequestDispatcher(String url)方法

调用ServletRequest接口提供的getRequestDispatcher(String url)方法

区别:

调用ServletContext接口提供的getRequestDispatcher(String url)方法必须是绝对路径

调用ServletRequest接口提供的getRequestDispatcher(String url)方法可以是相对路径,也可以是绝对路径。

举例:

创建一个Servlet(demo1.java),代码如下:

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class demo1 extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,

IOException {

response.setContentType("text/html;charset=utf-8");

request.setCharacterEncoding("utf-8");

PrintWriter out

= response.getWriter();

//提交到demo2、

out.println("

method='get' action='/demo/demo2'>");

out.println("用户名:

type='text' name='username' />
");

out.println("密码:

type='password' name='pass' />
");

out.println("

type='submit' value='提交' ");

out.println("

");

}

}

创建一个Servlet(demo2.java),代码如下:

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Enumeration;

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class demo2 extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,

IOException {

response.setContentType("text/html;charset=utf-8");

request.setCharacterEncoding("utf-8");

//PrintWriter

out = response.getWriter();

//获取请求分派器

RequestDispatcher

dispatcher = request.getRequestDispatcher("demo3");

//将请求转发至指定路径的资源

dispatcher.forward(request,

response);

}

}

创建Servlet(demo3.java),代码如下:

import java.io.FileInputStream;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class demo3 extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,

IOException {

response.setContentType("text/html;charset=utf-8");

PrintWriter out

= response.getWriter();

request.setCharacterEncoding("utf-8");

//获得用户输入的用户名

String name =

request.getParameter("username");

out.println(name+"已经请求转发到demo3了");

}

}

原理:

当浏览器发起一次http请求时,Web服务器将demo2请求转发给第二个资源(即demo3),demo3将一次响应返回给服务器。

当调用这条语句时,并没有直接转发给浏览器,而是转发给Web服务器,Web服务器再调用。请求转发是发生在Web服务器。

效果如下:

在demo1中输入用户名和密码;

跳转的页面是demo2 ,显示的内容却是demo3的效果

这种情况下浏览器只发出一次请求,服务器也只返回一次响应。浏览器地址栏的URI是demo2,但服务器却只用demo3来进行响应的。在demo3中也可以获取客户端请求demo2是发送的参数数据。

(5)利用请求域属性传递对象数据

HttpServletRequest接口中提供了几个方法用来操作请求实例中存储的对象。

(1)setAttribute(String name,Object obj);

//将对象存储进HttpServletRequest实例中

(2)getAttribute(String name);

//检索存储在HttpServletRequest实例中的对象。

(3)getAttributeNames();

(4)removeAttribute(String name);

这种存储在HttpServletRequest中的对象称之为请求域属性,属于同一请求过程的多个处理模块之间可以通过请求域属性来传递对象数据,如通过请求转发的两个Servlet之间就可以通过请求域属性来传递对象数据,但通过重定向的两个Servlet之间就不能通过请求域属性来传递对象数据。

在请求分派的例子上,demo1不用改变。

demo2.java的代码如下:

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Enumeration;

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class demo2 extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,

IOException {

response.setContentType("text/html;charset=utf-8");

request.setCharacterEncoding("utf-8");

//PrintWriter

out = response.getWriter();

//将一个字符串存放在请求域属性中

String

str = "hello world!";

request.setAttribute("str",str);

RequestDispatcher

dispatcher = request.getRequestDispatcher("demo3");

dispatcher.forward(request,

response);

}

}

demo3.java代码如下:

importjava.io.FileInputStream;

importjava.io.IOException;

importjava.io.PrintWriter;

importjavax.servlet.ServletException;

importjavax.servlet.ServletOutputStream;

importjavax.servlet.annotation.WebServlet;

importjavax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

publicclassdemo3extendsHttpServlet

{

protectedvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)throwsServletException,

IOException {

response.setContentType("text/html;charset=utf-8");

PrintWriterout=response.getWriter();

request.setCharacterEncoding("utf-8");

Stringname=request.getParameter("username");

//从请求域属性中取出str这个对象。

String

str = (String)request.getAttribute("str");

out.println(name+"已经请求转发到demo3了
");

out.println("我在demo3获取demo2请求域属性的值为:&"+str);

}

}

依然输出用户名和密码,提交。

效果如下:

request中的attribute只在一次请求有效。

不可以通过sendRedirect方式取得域对象中值,因为域对象只能在一次请求有效,sendRedirect重定向后request和response都是全新的。

//因为是在Web服务器中发生的,所以只需要填写资源名

request.getRequestDispatcher(“/资源名URI”).forward(request,response);

//因为发生在浏览器,浏览器就得知道要重定向到哪个Web应用

response.sendRedirect(“/Web应用/Web资源”);

用处:

通常在Servlet中处理客户请求,然后把需要返回给用户的动态数据利用请求域属性传递到JSP页面,在JSP页面中解析成HTML,在返回给客户端。

总结:重定向和请求分派(请求转发)的区别

虽然HttpServletRequest的sendRedirect()方法和RequestDispatcher的forward()方法都可以让浏览器获得另一个URL所指向的资源所做的响应,但两者的内部运行机制有着很大的区别。

(1)请求分派只能将请求转发给同一个Web应用的其他资源。

重定向不仅可以定向到当前Web应用的其他资源,也可以重定向到其他站点的资源上。

(2) 请求分派是在接收到客户端请求后通知服务器调用另一个Web资源,http状态码为307。

重定向是在接收到客户端请求后通知浏览器调用另一个Web资源,http状态码为302。

(3)重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,有初始的URL地址变成重定向的目标URL;

而请求转发过程结束后,浏览器地址栏保持初始的URL地址不变

(4)请求分派的发起者和被调用者之间共享相同的request实例和response实例,它们属于同一个“请求/响应“过程

而重定向的发起者和被调用者使用各自的request实例和response实例,它们各自属于独立的“请求/响应”过程。

java request获取域,Java Web - Servlet(13)HttpServletRequest详解(获取请求数据、请求分派、请求域)(二)...相关推荐

  1. java获取request body_HttpServletRequest获取body内容(字符串/二进制)详解

    首页 > Java Web > SpringMvc应用 > HttpServletRequest HttpServletRequest获取body内容(字符串/二进制)详解 获取HT ...

  2. spring mvc学习(50):java.lang.ClassNotFoundException: org.springframework.web.servlet. DispatcherSe

    今天朋友发了个maven项目给我看,问我为什么启动不了.说实话,一直用Jfinal都快不会用spring了- 还是决定看看. 接收了文件,是maven构建的,打开eclipse,导入maven项目,然 ...

  3. 令新手头痛的java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet错误...

    最近在学习springMVC,做helloworld实例的时候运行服务器一直报:java.lang.ClassNotFoundException: org.springframework.web.se ...

  4. java.lang.ClassNotFoundException: org.springframework.web.servlet.HandlerMapping解决方法

    [现象] Caused by: java.lang.ClassNotFoundException: org.springframework.web.servlet.HandlerMapping at ...

  5. java web编码详解_java web 开发 编码问题详解

    java web 开发 编码问题详解 浏览器 IE/FireFox ------------->Servlet容器-------------------------->显示页面 编码   ...

  6. java 三种将list转换为map的方法详解

    这篇文章主要介绍了java 三种将list转换为map的方法详解的相关资料,需要的朋友可以参考下 java 三种将list转换为map的方法详解 在本文中,介绍三种将list转换为map的方法: 1) ...

  7. java io类库,Java利用io类库对各种文件的操作详解

    Java中文网 - Java利用io类库对各种文件的操作详解 java中提供了io类库,可以轻松的用java实现对文件的各种操作.下面就来说一下如何用java来实现这些操作. 新建目录 //Strin ...

  8. Java生产环境下性能监控与调优详解 大纲 学习感悟

    Java生产环境下性能监控与调优详解 生产环境发生了内存溢出如何处理? 生产环境应该给服务器分配多少内存合适? 如何对垃圾收集器的性能进行调优? 4.生产环境CPU负载飙高该如何处理? 5.生产环境应 ...

  9. Java中print、printf、println的区别 详解

    Java中print.printf.println的区别详解 printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和pr ...

最新文章

  1. Bugku杂项(二)
  2. 零基础在学习Java时如何才能打好基础呢
  3. reentrantlock非公平锁不会随机挂起线程?_程序员必须要知道的ReentrantLock 及 AQS 实现原理...
  4. sql server中select语句需要申请的锁
  5. java.io.IOException: Connection reset by peer
  6. 串口通信实例vb.net serialport
  7. 离散数学(下)第十章 群与环
  8. Ubuntu安装LXDE桌面环境
  9. 阿里云Landing Zone系列--2 资源目录之--多账号
  10. office办公软件插件推荐word插件excel插件ppt插件
  11. MIUI12或android11找不到QQ文件的问题
  12. idea插件开发的时候找不到com.intellij.psi.PsiClass
  13. 计算机等级二级公共基础
  14. 安卓手机格式化怎么弄_安卓手机怎样进入格式化?
  15. HTML期末学生大作业 响应式动漫网页作业 html+css+javascript
  16. 微计算机原理及应用第八章,微型计算机原理及应用课件第八章中断.docx
  17. python学习—几个简单小程
  18. 你看到的是乱,我看到的是月亮,如是而已。
  19. 象与骑象人-幸福的假设
  20. 移动互联网开发技术教学网站项目研究综述

热门文章

  1. Java Web学习总结(1)——JavaWeb开发入门
  2. win 二进制门安装mysql_PG二进制包编译Windows下mysql_fdw
  3. 变换例题_小学语文学习攻略9:句式变换知识点概述+例题讲练
  4. JS判断两个日期的差或者判断两个日期的大小
  5. 呕心之作:支付宝的手机网站支付接口的应用
  6. 新手学跨域之iframe
  7. 【iCore3 双核心板_FPGA】例程二:GPIO输出实验——点亮三色LED
  8. 25条提高iOS App性能的建议和技巧
  9. fckeditor 中文乱码问题
  10. 自己动手,开发项目辅助工具