Servlet——Request和Response

Servlet——Request和Response

1.Request体系结构
![](https://img2020.cnblogs.com/blog/1668748/202004/1668748-20200426225304886-1264206014.png)
    *ServletRequest:是一个接口
    *HttpServletRequest:是一个接口
    *org.apache.catalina.connector.RequestFacade:是 Tomcat 的一个类
RequestFacade 类实现了 HttpServletRequest 接口,HttpServletRequest 接口继承了 ServletRequest 接口

HttpServletRequest常用方法

*ServletRequest接口: 请求对象, 封装了获取所有请求信息(请求行, 请求头, 请求实体)的方法
*HttpServletRequest接口:是ServletRequest的子接口, 处理HTTP协议请求的方法.
1.常用方法
    1.String getMethod(): 返回请求方式(GET/POST)
    2.String getRequestURI():返回请求行中资源名字部分: 如/test/index.html(统一资源标识符)
    3.StringBuffer getRequestURL():返回浏览器地址栏内容(统一资源定位符)
    4.String getContextPath():返回虚拟目录
    5:String getRemoteAddr():返回客户端的IP地址
    6.String getHeader(String headName):根据指定的请求头获取对应的请求头的值
2.获取请求参数的方法
    1.String getParameter(String name):根据参数名称,获取对应参数的值.
    2.String[] getParameterValues(String name):根据参数名称,获取该参数的多个值.
    3.Enumeration <String> getParameterNames():获取所有请求参数的名称
    4.Map<String,String[]> getParameterMap():返回请求参数组成的Map集合.
    key:参数名称
    value:参数值,封装在String数组中.

// 注解: 表示Web.xml中给这个Servlet配置的8句
@WebServlet("/req")
public class HttpServletRequestDemo extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//- String getMethod(): 返回请求方式(GET/POST)
System.out.println(req.getMethod());
//- String getRequestURI():返回请求行中资源名字部分: 如/test/index.html
System.out.println(req.getRequestURI());
//- StringBuffer getRequestURL():返回浏览器地址栏的内容
System.out.println(req.getRequestURL());
//- String getContextPath():获取上下文路径,<Context path="上下文" ../>
System.out.println(req.getContextPath());
//- String getRemoteAddr():返回请求服务器的客户端的IP地址
System.out.println(req.getRemoteAddr());
//- String getHeader(String headName):根据指定的请求头获取对应的请求头的值.
String userAgent = req.getHeader("User-Agent");
System.out.println(userAgent.contains("MSIE"));
System.out.println(userAgent);
System.out.println("-----------获取请求参数的方法----------");
// String getParameter(String name):根据参数名称,获取对应参数的值.
System.out.println(req.getParameter("username"));
// String[] getParameterValues(String name):根据参数名称,获取该参数的多个值.
String[] hobbies = req.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
// Enumeration getParameterNames():获取所有请求参数的名字
Enumeration parameterNames = req.getParameterNames();
while (parameterNames.hasMoreElements()) {
System.out.println("====>" + parameterNames.nextElement());
}
// Map<String,String[]> getParameterMap():返回请求参数组成的Map集合.
Map<String, String[]> parameterMap = req.getParameterMap();
System.out.println(parameterMap);
}
}

请求转发

1.通过request对象获取请求转发器对象:request.getRequestDispachter(url)
2.使用RequestDispatcher对象来进行转发 forward(req,resp)
特点:
    1.浏览器地址栏路径不发生变化
    2.只能转发到当前服务器内部资源中
    3.转发只发送一次请求

共享数据

1.域对象: 一个有作用范围的对象,可以在范围内共享数据
2.request域: 代表一次请求的范围,一般用于请求转发的多个资源中共享数据
3.方法
    void setAttribute(String name,Object obj):存储数据
    Object getAttitude(String name):通过键获取值
    void removeAttribute(String name):通过键移除键值对

请求的中文乱码处理

1.在Tomcat中, 对于POST和GET请求,默认是ISO-8859-1的编码格式, 而该编码格式不支持中文, 所以会产生乱码.
解决方案 :
    1.第一种方式:
        1.对乱码使用ISO-8859-1解码—>byte数组.
        2.对byte数组重新使用UTF-8编码

String username1 = req.getParameter("username");
// 按照ISO-8859-1把乱码恢复成二进制形式
byte[] data = username1.getBytes("ISO-8859-1");
// 再把二进制形式的数据使用UTF-8重新编码
String username2 = new String(data, "UTF-8");
System.out.println(username2);
问题: 这种方式当一个参数需要使用这两行代码来转码,如果有N个中文参数,就需要写N次,如此一来, 冗余代码很多.
2.第二种方式:
针对POST请求方式
// 对于POST请求 可以设置请求的编码
req.setCharacterEncoding("UTF-8");
String username = req.getParameter("username");
System.out.println(username);
注意: 这种方式只对POST有效, 必须放在获取任意参数之前

HttpServletResponse常用方法

ServletResponse接口: 响应对象, 封装了获取所有响应信息(状态行, 响应头, 请求实体)的方法
HttpServletResponse接口:是ServletResponse的子接口, 处理HTTP协议响应的方法.
1.常用方法
    OutputStream getOutputStream():获取字节输出流对象. :文件下载
    Writer getWriter():获取字符输出流对象 :输出内容
    *使用字符输出流,中文会出现乱码,需要设置两行代码
    1.设置文档的MIME类型
        resp.setContentType("text/html");
    2.设置输出数据的编码方式
        resp.setCharacterEncoding("UTF-8");
    3.这两行可以统一设置
        resp.setContentType("text/html;character=utf-8");

重定向

1.重定向是一种资源跳转的方式
2.语法:resp.sendRedirect(url)
3.重定向的特点:redirect
    1.地址栏发生变化
    2. 重定向是两次请求。不能使用request对象来共享数据
    3. 重定向可以访问其他站点(服务器)的资源
4.路径写法:
    1.相对路径:通过相对路径不可以确定唯一资源
        *如:./index.html
        *不以/开头,以.开头路径
        规则:找到当前资源和目标资源之间的相对位置关系
        ./:当前目录
        ../:后退一级目录
    2.绝对路径:通过绝对路径可以确定唯一资源
        *如:http://localhost/day15/responseDemo2
        /day15/responseDemo2
        *以/开头的路径
        规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出
        *给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
        *建议虚拟目录动态获取:request.getContextPath()
        <a> , <form> 重定向…
        给服务器使用:不需要加虚拟目录
        转发路径
posted @ 2020-04-27 15:51  林jj  阅读(174)  评论(0编辑  收藏  举报