转发 重定向HttpServletRequest & HttpServletResponse

Servlet的实现和相关的方法
一、HttpServletRequest类

HttpServletRequest类封装了从客户端传递过来的信息。

每次请求,Tomcat都会创建一个HttpServletRequest对象实例传递到service请求的方法中。

public void service(ServletRequest request, ServletResponse response);

《1》Request对象常用方法

getRequestURI()             获取请求的资源路径
getRequestURL()             获取请求的统一资源定位符
getRemoteHost()             获取请求的客户端ip地址
getHeader()                 获取请求头信息
getParameter()              获取请求参数值(只能获取请求参数的一个值)
getParameterValues()        获取请求的多个值(常用于复选框和下拉列表多选)。
getRequestDispatcher()      获取请求的转发对象。转发请求(转发的请求和原请求共享request对象和response对象)
getMethod()                 获取请求的方式GET 或 POST

setAttribute(key, value);   设置Request请求范围的属性值。
getAttribute(key);              获取Request请求范围的属性值。

ServletContext              是域对象(域的范围是整个web工程)

Request也是域对象之一 (是在同一个请求内)

getCookies()            获取Cook对象
getSession()            获取或创建Session对象

《2》获取请求行

request.getRequestURI();    获取请求的资源路径   /day07/requst1  表示访问的是day07工程下的/request1的servlet动态资源
request.getRequestURL();获取请求的统一资源定位符。
http://192.168.11.30:8080/day07/request1
192.168.11.30 是我的ip地址
8080 服务器端口号
day07是工程名
request1 是资源的路径

获取请求的资源路径:

System.out.println( "getRequestURI==>>" + request.getRequestURI() );
// 获取请求路径的统一资源定位符
System.out.println( "getRequestURL==>>" + request.getRequestURL() );

图8
这里写图片描述
2) 获取访问的客户端的ip地址:

    // 获取客户端的ip地址
    System.out.println("getRemoteHost==>>" + request.getRemoteHost());

得到客户端的请求ip地址 例如:192.168.11.10 , 192.168.10.32等等

3) 获取请求头信息

    //获取请求头的信息。
    System.out.println("getHeader('User-Agent')==>>" + request.getHeader("User-Agent"));

打印内容(不同的浏览器,得到的信息不一样):
getHeader('User-Agent')==>>Mozilla/5.0 (Windows NT 6.1; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0

(二)获取请求参数的值★★★

《1》表单如下:

<form action="http://127.0.0.1:8080/day07/params" method="get">
        用户名:<input name="username" type="text" /><br/>
        密 码:<input name="password" type="password" /><br/>
        兴趣爱好:
            <input name="hobby" type="checkbox" value="c" />C
            <input name="hobby" type="checkbox" value="cpp" />C++
            <input name="hobby" type="checkbox" value="java" />java
            <input name="hobby" type="checkbox" value="php" />php
            <br/>
        <input type="submit" />
</form>

2) 接收请求参数的代码:

public class Params extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    //获取客户端传递过来的用户名参数值
    String username = request.getParameter("username");
    System.out.println("用户名:" + username);

    // 获取密码
    String password = request.getParameter("password");
    System.out.println("密码:" + password);

-----------------------------------------------------------------------
    // 获取兴趣爱好,这个方法只能获取到一个兴趣爱好。
    //      String hobby = request.getParameter("hobby");
    //      System.out.println("getParameter得到的兴趣爱好:" + hobby);


    // 如果获取的参数有多个值的情况下。我们都使用getParameterValues方法来获取
    // 因为它可以获取到多个值。而getParameter只能获取到一个值。
    String[] hobbys = request.getParameterValues("hobby");
    if (hobbys != null) {
        for (String hb : hobbys) {
            System.out.println("getParameterValues兴趣爱好:"  + hb);
        }
    }
}

图片9

这里写图片描述

《2》做为域对象设置请求Request范围的属性值

把下面的这三行代码放到任意一个Servlet中,去请求访问。

    // 在Request中设置 属性值。
    request.setAttribute("abc", "abcValue");

    // 获取 Request域中的属性值
    String abcAttr = (String) request.getAttribute("abc");
    System.out.println(abcAttr); // 控制台打印 abcValue

如果大家读源码你会发现。其实在Request对象中,有一个Map对象用来存放 属性值。

所以属性的操作就跟操作一个map对象是一样的。


☆☆二、请求转发

1)问题:什么是请求的转发?

请求的转发主要用在把Servlet中的数据转发到Jsp中去显示
jsp是一个Servlet程序

如图

图10
这里写图片描述

2)请求转发的具体实现代码:

从Servlet1转发到Servlet2

Servlet1实现如下:

图11
这里写图片描述
Servlet2实现如下:

图12
这里写图片描述
3) 直接在浏览器地址栏中输入 http://127.0.0.1:8080/day07/servlet1?username=abc 访问第1个Servlet1 程序

4) 控制台打印如下内容:

这里写图片描述
请求转的的小结:

比如Servlet1把请求转发给Servlet2

1.首先Servlet1和Servlet2中request和response对象是同一个对象。

2.在Servlet1,中和Servlet2都可以获取到相同的请求的参数值,
并且也可以获取到相同属性值

3.转发的时候,浏览器地址栏的地址不发会生变化

5)、Base标签转发中的相对路径

base 标签它会把所有的相对路径,设定在base指定的路径的基础之上做操作。

图14

这里写图片描述

三、HttpServletResponse类

Response对象封装了服务器到客户端返回的信息。

1)、获取输出流

getOutoutStream() 拿到的是二进制流。

主要用于返回二进制数据。比如说下载,图片验证码等。

getWriter() 拿到字符流。大部分的返回都用writer。

这两个输出流,我们不能同时获取两个,只能使用一个做为返回。

只要同时获取两个输出流就会报错,不管你是先获取二进制输出,还是先获取字符串输出流。

代码如下:

/**
 * 同时通过response对象获取两个输出流对象,就会报错。
 * 不管你是先获取二进制的字节流,还是字符流
 */
protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    // 获取二进制输出流
    response.getOutputStream();
    // 获取字符串输出流
    response.getWriter();

}

图15
这里写图片描述
2)、输出字符串内容到客户端

往客户端输出。分两个步骤:

第一步:先获取输出流(二进制返回用获取字节流,字符出获取字符流)

第二步:调用输出流对象,写出数据第客户端

如:

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    // 通过response响应对象获取到字符输出流
    Writer writer = response.getWriter();
    // 往 客户 端 输出数据。
    writer.write("this is response content!");
}

3)设置响应状态码,和设置响应头

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    /**
     * 当响应状态码为302的时候,表示要重定义。
     * 浏览器会检测Location的值,去重新发起请求。
     */
    // 设置响应状态码 302 表示重定向
    response.setStatus(302);
    // 设置响应头 Location中的信息
    // 浏览器会把Location中的值重新发起一次请求。
    //  response.setHeader("Location", "http://127.0.0.1:8080/day07/response2");
    // 浏览器会重新 发起请求http://www.baidu.com
    response.setHeader("Location", "http://www.baidu.com");
}

2)在浏览器中访问响应状态的代码。得到的响应内容如下:

图16
这里写图片描述
并且浏览器收到响应后会马上自动发生起第二次的请求。

第二次请求的地址是Location对应的值。

总结重定向:

请求重定向。是两次请求,浏览器地址栏会发生改变。

第一次请求返回的响应码为302.并且有响应头Location的内容。

第二次请求的地址就是Location对应的值。

重定向,第二次请求不仅可以是站内的资源,也可以是站外的资源。

4.5、请求重定向 sendRedirect的方式

除了通过设置响应状态码和响应头可以实现重定向之外。

我们还可以通过HttpServletResponse对象的sendRedirect方法实现重定向。
这里写图片描述
代码如:

    protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    /**
     * 当响应状态码为302的时候,表示要重定向。
     * 浏览器会检测Location的值,去重新发起请求。
     */
    // 设置响应状态码 302 表示重定向
//      response.setStatus(302);
    // 设置响应头 Location中的信息
    // 浏览器会把Location中的值重新发起一次请求。
    //  response.setHeader("Location", "http://127.0.0.1:8080/day07/response2");
    // 浏览器会重新 发起请求http://www.baidu.com
//      response.setHeader("Location", "http://www.baidu.com");

    //方式二、、 通过sendRedirect方法直接重定向到你需要的网址。
    response.sendRedirect("http://www.baidu.com");
}

浏览器访问后,会有两次请求。
第一次是http://127.0.0.1:8080/day07/response3 访问上面的java代码。

第二次是访问Location中的地址。


最后:请求转发和重定向的对比

图18
这里写图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值