request详解

request
1.request
代表HTTP请求的对象。Servlet
2.request继承结构
ServletRequest 基础request接口
–HttpServletRequest 在基础request接口之上添加了和HTTP协议相关的api。
3.request的组成
一个请求行 GET 请求资源名 协议版本
若干请求头 Host:
Accecpt:
一个空行 用户区别请求头和请求实体内容
请求实体内容 请求的参数内容 参数名和参数值
4.request的功能 (!!!重要)
获取浏览器相关的信息
getRequestURL方法 – 返回客户端发出请求完整URL
getRequestURI方法 – 返回请求行中的资源名部分
getQueryString方法 – 返回请求行中的参数部分
getRemoteAddr方法 – 返回发出请求的客户机的IP地址
getMethod – 得到客户机请求方式
!!getContextPath – 获得当前web应用虚拟目录名称 – 在写路径时不要将web应用的虚拟路径的名称写死, 应该在需要写web应用的名称的地方通过getContextPath方法动态获取
获取请求头信息
getHeader(name)方法 — String
getHeaders(String name)方法 — Enumeration
getHeaderNames方法 — Enumeration
getIntHeader(name)方法 — int
getDateHeader(name)方法 — long(日期对应毫秒)
获取请求参数
getParameter(String name) — String 通过name获得值
getParameterValues(String name) — String[ ] 通过name获得多值 checkbox
getParameterMap() — Map<String,String[ ]> key :name value: 多值 将查询的参数保存在一个Map中
getParameterNames() — Enumeration 获得所有name
获取参数时乱码问题的解决:
i.出现乱码的原因:编码解码不一致。
ii.浏览器在发送数据的时候会对数据进行编码操作。浏览器在发送数据的时候使用的字符集和编辑页面的时候指定的字符集统一。
1.在当前页面param.html中使用的是UTF-8。
iii.服务器接受数据的时候会对数据进行解码操作。服务器在接收数据时使用的字符集为ISO8859-1.
iv.由于ISO8859-1字符集中没有中文,所以需要将浏览器和服务器的字符集统一成UTF-8字符集。
v.post提交乱码解决:
将浏览器和服务器字符集统一成utf-8之后,发现乱码已经被解决,解决原因为:
post提交请求参数在请求实体内容中,这些数据会在底层传输,最终经过tomcat底层的字符集进行解析,我们已经使用setCharcterEncoding通知服务器临时修改其其字符集,所以post提交才不会出现乱码。
get提交乱码解决:
i.get提交在面对request.setCharacterEncoding时不受用,因为其参数是在地址栏种进行传输,并未经过tomcat底层临时指定的字符集,所以接收到的数据仍然是乱码。
get提交需要先将乱码使用iso8859-1编码,再使用utf-8解码。
实现过程如下:
//1.使用iso8859-1编码
byte[] bytes = username.getBytes(“iso8859-1”);
//2.使用utf-8解码
username = new String(bytes,“utf-8”);
new String(username.getBytes(“iso8859-1”),“utf-8”);
以上处理方式get和post两种提交方式都可以解决乱码。
5.request功能–请求转发
a.请求转发概述:
请求转发是一种资源的跳转方式。
可以在访问一个资源的时候跳转到另外一个资源身上,使用第二个资源执行操作。
2.//TODO:请求转发图

请求转发的特点:
一次请求,一次响应
地址栏不发生变化
服务器内部的资源跳转
c.请求转发的实现

package cn.tedu.request;
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;
//Request请求转发操作,和RequestDemo5一组
public class RequestDemo4 extends HttpServlet {
 
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.引入调度器
RequestDispatcher rd = request.getRequestDispatcher("/servlet/RequestDemo5");
//2.利用调度器实现请求转发
rd.forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

d.请求转发时的异常处理:
i.请求转发之前如果reponse缓冲区中有数据,则会将缓冲区中的数据清空再进行请求转发操作。
1.原因:在请求转发中只能出现一次请求和一次响应。
ii.如果在请求转发之前调用respones.flushBuffer(),会造成一次响应,请求转发前响应已经出现,再执行请求转发则会发生异常。
1.原因:请求转发过程中只能出现一次请求,一次响应。
iii.请求转发前后的语句会正常执行。而且语句的执行顺序是安装请求流向顺序执行。请求转发之后的语句会安装转发顺序相反顺序执行。
iv.请求转发可以在多个servlet中进行多重转发操作。
RequestDemo6 -> RequestDemo7 ->RequestDemo8
e.在一个servlet中是不允许进行多次请求转发操作的。
6.request功能-域对象
a.域对象的概述
一个对象身上有一个可以被看见的范围,在这个范围内利用对象身上的map实现数据的共享,这样一个对象就可以称之为域对象。
request.setAttribute(“域属性的名称”,“域属性的值”);
request.getAttribute(String name);
request.removeAttribute(String name);
request.getAttributeNames();
2.RequestDemo9和RequestDemo10和index.jsp案例
a.RequestDemo9

package cn.tedu.request;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//request作为域对象使用
//在域中共享数据
public class RequestDemo9 extends HttpServlet {
 
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//利用request,向其域中添加数据
 
request.setAttribute("name", "李帅");
request.setAttribute("age", 18);
request.setAttribute("addr", "北京");
request.setAttribute("gender", "男");
//请求转发到demo10中
//demo9和demo10用的是同一个request对象,所以会具有同一个可以被看见的范围,可以进行数据共享。
//                request.getRequestDispatcher("/servlet/RequestDemo10").forward(request, response);
//请求转发到index.jsp
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
 
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
 
}
 
}

b.RequestDemo10

  package cn.tedu.request; 
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//request作为域对象使用。与demo9一组。
public class RequestDemo10 extends HttpServlet {
 
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//从域中取出name域属性
String name = (String) request.getAttribute("name");
System.out.println("name:"+name);
}
 
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
 
}
 
}

c.iii.index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML >
<html>
  <head>
   
  </head>
  
  <body>
           姓名:<%=request.getAttribute("name") %>
           年龄:<%=request.getAttribute("age") %>
           地址:<%=request.getAttribute("addr") %>
           性别:<%=request.getAttribute("gender") %>
  </body>
</html>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值