8、Response对象、Request对象、请求转发与重定向、JavaWeb中的路径问题

Response

响应HTML、JSON

package org.westos.demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @author lwj
 * @date 2020/8/18 9:05
 */
@WebServlet(name = "MyServlet", value = "/myServlet")
public class MyServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Tomcat默认采用的编码是ISO-8859-1,与浏览器客户端解码不一致,所以在获取流之前设置Tomcat服务器字符打印输出流的编码
        /*response.setCharacterEncoding("utf-8");
        response.setHeader("content-type", "text/html;charset=utf-8");*/
        response.setContentType("text/html;charset=utf-8");
        //可以用一行代码实现

        //普通的文本、HTML、JSON
        PrintWriter writer = response.getWriter();

        writer.write("<h2>中文乱码</h2>");

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

在这里插入图片描述

package org.westos.demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author lwj
 * @date 2020/8/18 9:33
 */
@WebServlet(name = "MyServlet2", value = "/myServlet2")
public class MyServlet2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("application/json;charset=utf-8");

        String s = "{\"username\":\"张三\",\"password\":\"123456\"}";
        response.getWriter().write(s);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

在这里插入图片描述

响应字节数据

package org.westos.demo;

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;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * @author lwj
 * @date 2020/8/18 9:54
 */
@WebServlet(name = "MyServlet3", value = "/myServlet3")
public class MyServlet3 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //响应字节数据
        //图片在/WEB-INF/目录下
        String realPath = getServletContext().getRealPath("/WEB-INF/bb812.jpg");
        FileInputStream fis = new FileInputStream(new File(realPath));
        ServletOutputStream sos = response.getOutputStream();
        //获取字节输出流
        byte[] bytes = new byte[1024];
        int len = 0;
        while ((fis.read(bytes)) != -1) {
            sos.write(bytes);
        }
        sos.close();
        fis.close();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

在这里插入图片描述

重定向

1、重定向到其它站点

package org.westos.demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author lwj
 * @date 2020/8/15 16:01
 */
@WebServlet(name = "MyServlet", value = "/myServlet")
public class MyServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //Request对象和Response对象都是由服务器创建、管理和销毁
        System.out.println(request);
        //org.apache.catalina.connector.RequestFacade@3e98bbfb
        System.out.println(response);
        //org.apache.catalina.connector.ResponseFacade@3aa738f0

        //重定向
        //response.setStatus(302);
        //response.setHeader("location", "https://www.baidu.com");

        //以上两步可以简写为
        response.sendRedirect("https://www.baidu.com");
        //1、重定向到外部站点
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

在这里插入图片描述

在这里插入图片描述

2、重定向到本Web应用内其它资源

package org.westos.demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author lwj
 * @date 2020/8/15 17:07
 */
@WebServlet(name = "MyServlet2", value = "/myServlet2")
public class MyServlet2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.sendRedirect("/index.jsp");
        //response.sendRedirect("/myServlet");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

在这里插入图片描述

在这里插入图片描述

3、特点:

两次请求、两次响应

地址栏会发生变化

可以跳转内部资源,也可以跳转外部资源。

在重定向时,/后面需要添加Web项目的上下文路径,在该项目中上下文路径为空,所以可以直接/index.jsp、/myServlet。

Request

获取请求行

package org.westos.demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;

/**
 * @author lwj
 * @date 2020/8/18 11:18
 */
@WebServlet(name = "MyServlet", value = "/myServlet")
public class MyServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求行
        String method = request.getMethod();
        System.out.println("请求方式:" + method);
        //请求方式:GET

        String contextPath = request.getContextPath();
        System.out.println("项目上下文路径:" + contextPath);
        //项目上下文路径:

        String requestURI = request.getRequestURI();
        System.out.println("统一资源标识符:" + requestURI);
        //统一资源标识符:/myServlet

        StringBuffer requestURL = request.getRequestURL();
        System.out.println("统一资源定位符:" + requestURL);
        //统一资源定位符:http://localhost:8080/myServlet

        String remoteAddr = request.getRemoteAddr();
        System.out.println("请求的IP地址:" + remoteAddr);
        //请求的IP地址:0:0:0:0:0:0:0:1

        String queryString = request.getQueryString();
        System.out.println("请求参数:" + queryString);
        //请求参数:username=%E5%BC%A0%E4%B8%89&password=123456&vercifyCode=Xc3e
        //GET请求参数在请求行,POST请求参数在请求体
        //浏览器会对中文URL进行编码
        String decode = URLDecoder.decode("%E5%BC%A0%E4%B8%89", "utf-8");
        System.out.println(decode);
        //张三

        String protocol = request.getProtocol();
        System.out.println("协议版本:" + protocol);
        //协议版本:HTTP/1.1
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

在这里插入图片描述

URI与URL

URI标记了一个网络资源,仅此而已; URL标记了一个WWW互联网资源(用地址标记),并给出了他的访问地址。(URI是Uniform Resource Identifier,表示是一个资源; URL是Uniform Resource Locator,表示是一个地址。

URL是URI的子集,所有的URL都是URI,但不是每个URI都是URL,还有可能是URN

获取请求体

POST请求的请求体

获取字符数据:getReader()

package org.westos.demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;

/**
 * @author lwj
 * @date 2020/8/18 13:38
 */
@WebServlet(name = "MyServlet2", value = "/myServlet2")
public class MyServlet2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        BufferedReader reader = request.getReader();
        //返回一个高效的字符流 我们通过一次读取一行的方法来获取请求参数数据,然后拆分字符串获取我们想要的数据
        String s = reader.readLine();
        //System.out.println(s);
        //username=zhangsan&password=123456
        String[] split = s.split("&");
        String[] split1 = split[0].split("=");
        System.out.println(split1[0] + "=" + split1[1]);
        //username=zhangsan
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

在这里插入图片描述

获取字节数据:getInputStream(上传文件)

通用获取请求参数

1、GET

package org.westos.demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author lwj
 * @date 2020/8/18 14:02
 */
@WebServlet(name = "MyServlet3", value = "/myServlet3")
public class MyServlet3 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
    }

    @Override
    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);
        //张三
        //123456
    }
}

在这里插入图片描述

2、POST

package org.westos.demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author lwj
 * @date 2020/8/18 14:02
 */
@WebServlet(name = "MyServlet3", value = "/myServlet3")
public class MyServlet3 extends HttpServlet {
    @Override
    protected void doPost(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);
        //??????
        //123456
    }

    @Override
    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);
        //张三
        //123456
    }
}

在这里插入图片描述

通用处理方式:处理get post 请求提交中文数据乱码问题

tomcat 8.0 以上 GET请求 中文参数 不乱码 tomcat已经处理了 我们不用处理

post 请求特有的方式 处理中文乱码

request.setCharacterEncoding("utf-8");
package org.westos.demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author lwj
 * @date 2020/8/18 14:02
 */
@WebServlet(name = "MyServlet3", value = "/myServlet3")
public class MyServlet3 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        String username = request.getParameter("username");
        System.out.println(username);
        String password = request.getParameter("password");
        System.out.println(password);
        //张三
        //123456
    }

    @Override
    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);
        //张三
        //123456
    }
}

通用获取表单数据

package org.westos.demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;

/**
 * @author lwj
 * @date 2020/8/18 14:46
 */
@WebServlet(name = "MyServlet4", value = "/myServlet4")
public class MyServlet4 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        Map<String, String[]> parameterMap = request.getParameterMap();
        Set<String> strings = parameterMap.keySet();
        for (String str : strings) {
            String[] strings1 = parameterMap.get(str);
            System.out.println(str + ":" + Arrays.toString(strings1));
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

在这里插入图片描述

在这里插入图片描述

请求转发

package org.westos.demo2;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author lwj
 * @date 2020/8/18 15:11
 */
@WebServlet(name = "ServletDemo", value = "/servletDemo")
public class ServletDemo extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("请求到达ServletDemo...");
        request.getRequestDispatcher("/servletDemo2").forward(request, response);
        System.out.println("请求回到ServletDemo.");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
package org.westos.demo2;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author lwj
 * @date 2020/8/18 15:11
 */
@WebServlet(name = "ServletDemo2", value = "/servletDemo2")
public class ServletDemo2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("请求到达ServletDemo2...");
        request.getRequestDispatcher("/servletDemo3").forward(request, response);
        System.out.println("请求回到ServletDemo2.");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
package org.westos.demo2;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author lwj
 * @date 2020/8/18 15:11
 */
@WebServlet(name = "ServletDemo3", value = "/servletDemo3")
public class ServletDemo3 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("请求到达ServletDemo3");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

在这里插入图片描述

特点:

1、一次请求、一次响应;

2、地址栏不发生变化;

3、只能转发到内部资源

请求转发与重定向的区别 ※

1、重定向是在浏览器的url上进行,所以不能重定向到WEB-INF目录下的文件;请求转发可以访问WEB-INF目录下的资源;

2、路径区别

重定向response.sendRedirect(“xxx”)是服务器向客户端发送一个请求头信息,由客户端再请求一次服务器。/指的Tomcat的根目录,写绝对路径应该写成"/当前Web程序根名称/资源名" 。如"/WebModule/login.jsp","/bbs/servlet/LoginServlet"
转发是在服务器内部进行的,写绝对路径/开头指的是当前的Web应用程序。绝对路径写法就是"/login.jsp"或"/servlet/LoginServlet"。

总结:在请求转发时,/代表当前Web应用,在重定向时,/后面需要添加Web项目的上下文路径。

路径的书写:
建议以/开头
请求转发:不需要加项目上下文路径

request.getRequestDispatcher("/myservlet2").forward(request, response);

页面上的路径和重定向:需要加上项目的上下文路径,

<img src="/MyServlet/mydemo4" id="img1"></img>
response.sendRedirect("")
<form action="" method="">

Request域对象

package org.westos.demo4;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author lwj
 * @date 2020/8/18 16:08
 */
@WebServlet(name = "MyDemo", value = "/demo")
public class MyDemo extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("username", "张三");
        request.getRequestDispatcher("/demo2").forward(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
package org.westos.demo4;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author lwj
 * @date 2020/8/18 16:09
 */
@WebServlet(name = "MyDemo2", value = "/demo2")
public class MyDemo2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = (String) request.getAttribute("username");
        System.out.println(username);
        //张三
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

默认的欢迎页

当我们在IDEA启动Tomcat服务器,发布Web项目后,浏览器会自动打开某些页面。

在tomcat的conf目录的web.xml中默认配置了

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

所以,当我们有想要改动欢迎页面为home.html这样的需求时,可以修改Web项目的web.xml。

项目上下文路径

在这里插入图片描述

package org.westos.demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author lwj
 * @date 2020/8/18 16:15
 */
@WebServlet(name = "ServletDemo", value = "/demo")
public class ServletDemo extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println(request.getContextPath());
        //  /20200818_Servlet_war_exploded
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

当重定向时,参数需要项目上下文路径,大多数时候需要用request.getContextPath()动态获取,前面不要加/。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值