Java培优班 - 第三十天 - Servlet(核心) - request域对象、 请求转发 - getRequestDispatcher、jsp - getAttribute
发布日期:2021-06-30 16:59:36 浏览次数:2 分类:技术文章

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


7.7 request对象

7.7.1 获取请求参数

问题1、什么是请求参数?

通过浏览器向服务器发送请求时,

在请求中可以携带一些数据,
这些数据就称之为请求参数

例如:

http://localhost/day10/RequestDemo1?user=张三&like=篮球&like=足球&age=18
中的
user=张三&like=篮球&like=足球&age=18

问题2、如何获取请求参数?

request.getParameter(String paramName);-- 通过请求参数的名字,											获取对应的参数值。												返回值是一个字符串。												request.getParameterValues(String paramName);-- 通过请求参数的名字,													获取对应的所有参数值组成的数组。

因此,

以后获取单值的参数时,推荐使用getParameter方法
如果获取的多值的参数(即一个参数名对应多个参数值),推荐使用getParameterValues方法

示例:

//获取请求参数(user和like)String user = request.getParameter("user");System.out.println("user="+user);String like = request.getParameter("like");System.out.println("like="+like);String[] likes = request.getParameterValues("like");System.out.println( "likes="+ Arrays.toString( likes ) );

问题3、获取请求参数时的中文乱码问题?

  • 如果是GET提交,并且tomcat服务器是8.0及以后的版本,GET提交的中文参数是没有乱码问题的
    (因为tomcat自8.0版本以后,已经处理了GET提交的中文参数乱码问题!)
  • 如果是GET提交,并且tomcat服务器是7.0及以前的版本,GET提交的中文参数也会有乱码问题。
    如何处理??
    在服务器的server.xml文件中的修改端口的Connector标签上添加一个属性, URIEncoding="utf-8",如下:

这样,在tomcat7.0及以前的版本中,GET提交也没有乱码问题!

  • 如果是POST提交,无论是哪个版本的tomcat服务器,POST提交的中文参数都会有乱码
    处理方式如下:
//在任何获取请求参数的代码之前,加上一行代码:request.setCharacterEncoding("utf-8");//获取请求参数......

在这里插入图片描述

在这里插入图片描述

protected void doGet(HttpServletRequest request, HttpServletResponse response)			throws ServletException, IOException {
// TODO Auto-generated method stub //response.getWriter().append("Served at: ").append(request.getContextPath()); //不加这个,有中文,一定乱码 response.setContentType("text/html;charset=utf-8"); request.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); String user = request.getParameter("user"); String[] ls = request.getParameterValues("like"); System.out.println("user=["+user+"] like="+Arrays.toString(ls)+""); }

在这里插入图片描述

7.7.2 实现请求转发

请求转发是服务器内部资源的一种跳转方式,

即:
当浏览器发送请求访问服务器中的某一个资源时,该资源将请求转交给另外一个资源进行处理的过程,就叫做请求转发

请求转发重定向都是资源的跳转方式,但是跳转的过程有所不同。

请求转发的特点

  • 请求转发前后是一次请求、一次响应
  • 请求转发前后,浏览器地址栏地址不会发生变化
    (转发是服务器内部的跳转,浏览器看不到)
  • 请求转发前后的request对象是同一个
    (因为请求只有一次
    服务器根据一次请求,只会创建一个request对象
    转发前后都需要request
    所以只能在转发时,将request对象传递给转发后的那个资源)。
  • 只能在同一个web应用内部中的两个资源之间进行转发
    即转发前后的两个资源必须属于同一个web应用。

在这里插入图片描述

请求转发实现:

request.getRequestDispatcher("转发到资源的路径").forward(req, res);

Dispatcher - 派遣

7.7.3 作为域对象使用

request在实现转发时,通过request.setAttribute方法和request.getAttribute方法带数据到目的地时,

就是通过request对象中的map集合带数据
这个request对象上的map集合以及request对象所在的范围即称之为是一个域对象

域对象…

  • pageContext - 访问时存在,访问后消失
  • request - 多次转发,同一个请求
  • session - 一次对话,包含多次请求(request
  • application - 包含一个web程序

例子

Servlet

/**	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)	 */	protected void doGet(HttpServletRequest request, HttpServletResponse response)			throws ServletException, IOException {
// TODO Auto-generated method stub //response.getWriter().append("Served at: ").append(request.getContextPath()); //不加这个,有中文,一定乱码 response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); request.setAttribute("name", "刘德华"); //将请求转发到 index.jsp request.getRequestDispatcher("index.jsp"). forward(request, response); }

jsp

<%@page import="java.util.Date"%><%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
主页 ^(* ̄(oo) ̄)^

day10...index.jsp...

<% String name = request.getRemoteAddr(); Object port = request.getRemotePort() ; Object user = request.getAttribute("name"); out.print("Remote Info : " + name +":" + port + " --> "+user); %>
<%="

"+new Date() +"

"%>

JSP(全称JavaServer Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。

chrome

在这里插入图片描述

如果一个对象具备可以被访问的范围,通过这个对象上的map集合可以在整个范围内实现数据的共享。

这样的对象就叫做域对象。

在request对象上提供了往域对象中存数据的方法以及取数据的方法:

request.setAttribute(String attrName, Object attrValue);			-- 添加一个域属性,将属性存入request域中(request对象的map集合里),							属性名 - attrName - 只能是字符串,							属性值 - attrValue - 可以是任意类型。								request.getAttribute(String attrName)			-- 根据 属性名 从request域中获取对应的 属性值 。				返回值是一个Object。

request域对象所具备 - 三大特征:

  • 生命周期:(什么时候出生、什么时候死亡)

    一次请求开始时,会创建代表请求的request对象,
    一次请求结束时(响应已完成),会销毁request对象。

  • 作用范围

    一次请求范围内
    (
    由于请求转发前后是一次请求,
    所以在请求转发前后可以通过request域带数据到目的地;
    如果是重定向,由于重定向前后是两次请求,request对象也不是同一个,因此在重定向前后不能通过request域带数据。
    )

  • 主要功能

    和转发配合使用,带数据到目的地。

转载地址:https://lawsssscat.blog.csdn.net/article/details/103521910 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java培优班 - 第三十天 - Servlet(核心) - response对象、重定向 - sendRedirect、request数据丢失、乱码问题
下一篇:Java培优班 - 第三十天 - Servlet(核心) - 查询门店请求 - 【案例】

发表评论

最新留言

很好
[***.229.124.182]2024年04月30日 14时21分07秒