Javaweb04-Servlet技术2(HttpServletResponse, HttpServletRequest)

Servlet技术基础

HttpServletResponse对象

HttpServletResponce对象是继承ServletResponse接口,专门用于封装Http请求

  • HttpServletResponce有关响应行的方法
方法说明 功能描述
void setStatus(int stauts) 用于设置HTTP响应消息的状态码,并生成响应状态行。正常情况下,Web服务器会默认产生一个状态码为200的状态行。
void sendError(int stauts) 用于发送表示错误信息的状态码
void sendError(int stauts, String message) 除了设置状态码,还会向客户端发出一条错误信息。服务器默认会创建一个HTML格式的错误服务页面作为响应结果,其中包含参数message指定的文本信息,这个HTML页面的内容类型为"text/html",保留cookies和其他未修改的响应头信息。
  • HttpServletResponce有关响应头的方法

设置响应头字段的方法

方法说明 功能描述
void addHeader(String name, String value) void setHeader(String name, String value) 这两个方法都是用来设置HTTP协议的响应头字段,其中,参数name用于指定响应头字段的名称,参数value用于指定响应头字段的值。不同的是,addHeader()方法可以增加同名的响应头字段,而setHeader()方法则会覆盖同名的头字段
void addIntHeader(String name, int value) void setIntHeader(String name, int value) 这两个方法专门用于设置包含整数值的响应头。避免了调用addHeader()与setHeader()方法时,需要将int类型的设置值转换为String类型的麻烦

设置常见响应头字段

方法说明 功能描述
void setContentLength(int len) 该方法用于设置响应消息的实体内容的大小,单位为字节
void setContentType(String type) 该方法用于设置Servlet输出内容的MIME类型,对于HTTP协议来说,就是设置Content-Type响应头字段的值。
void setLocale(Locale loc) 设置Content-Language响应头字段和Content-Type头字段中的字符集编码部分。 如果HTTP消息没有设置Content-Type头字段,setLocale()方法设置的字符集编码不会出现在HTTP消息的响应头中,如果调用setCharacterEncoding()或setContentType()方法指定了响应内容的字符集编码,setLocale()方法将不再具有指定字符集编码的功能
void setCharacterEncoding(String charset) 设置Content-Type头字段中的字符集编码部分。如果没有设置Content-Type头字段,setCharacterEncoding方法设置的字符集编码不会出现在HTTP消息的响应头中。setCharacterEncoding()方法比setContentType()和setLocale()方法的优先权高
  • HttpServletResponce有关响应消息体的方法
方法说明 功能描述
ServletOutputStream getOutputStream() 获取的字节输出流对象为ServletOutputStream类型。由于ServletOutputStream是OutputStream的子类,它可以直接输出字节数组中的二进制数据。
PrintWriter getWriter() 由于PrintWriter类型的对象可以直接输出字符文本内容

注意:一个Servlet中只可以有一个流对象,否则会报500的错误

java 复制代码
/**
 * HttpServletResponse基本方法
 */
@WebServlet("/TextServlet07")
public class TextServlet07 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*设置响应行内容*/
        //关于设置状态行
        response.setStatus(404);
        //发送错误状态码
        response.sendError(404, "找不到页面hhh");

        /*设置响应头内容*/
        //添加刷新页面的头字段,3秒后跳转到百度
        response.addHeader("Refresh", "3;url=http://www.baidu.com");
        response.setHeader("Refresh", "5;url=http://www.baidu.com");
        response.addIntHeader("Refresh", 3);
        response.setIntHeader("Refresh", 5);

        //设置常见响应头字段
        response.setContentLength(1000);
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("GB2312");

        //设置响应消息体
        ServletOutputStream os = response.getOutputStream();
        os.write("I love tyut".getBytes());

        PrintWriter out = response.getWriter();
        out.write("I love tyut");
    }
  • HttpServletResponce实现重定向

1.定义:请求重定向,指的是Web服务器接收到客户端的请求后,可能由于某些条件限制,不能访问当前请求URL所指向的Web资源,而是指定了一个新的资源路径,让客户端重新发送请求。

2.实现思路:在学习response的的时候我们学习过302状态码,就是表明当前页面处理不了此请求,并且通过Location头字段指定建议处理的路径。

3.实现方法:为了实现请求重定向,HttpServletResponse接口定义了一个sendRedirect()方法,该方法用于生成302响应码和Location响应头,从而通知客户端重新访问Location响应头中指定的URL。此处的URL可以是相对路径,也可以是绝对路径。

java 复制代码
void sendRedirect(String url)

4.工作原理:

java 复制代码
@WebServlet("/TextServlet08")
public class TextServlet08 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        if ("tyut".equals(username) && "123456".equals(password)) {
            response.sendRedirect("/servlet-demo/html/welcome.html");
        } else {
            response.sendRedirect("/servlet-demo/html/login.html");
        }
    }

注意:重定向的位置要发给浏览器,所以要添加需目录及/servlet-demo

  • HttpServletResponce解决输出响应消息乱码问题

1.原因:由于浏览器解码和服务器编码方式不一致,所以就会出现中文乱码

对于服务器端:Tomcat的编码方式是ISO-8869-1,而浏览器的解码方式与操作系统有关为中文为GB2312

2.解决方法

java 复制代码
@WebServlet("/TextServlet09")
public class TextServlet09 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//        //1.方案一:设置浏览器解码与服务器编码方式为一样的格式
//        response.setCharacterEncoding("utf-8");//设置服务器
//        response.setHeader("Content-Type", "text/html;charset=utf-8");//设置浏览器
//        PrintWriter out = response.getWriter();
//        out.write("太原理工大学");
//
//        //2.方案二:同时设置
//        response.setContentType("text/html;charset=utf-8");
//        PrintWriter out = response.getWriter();
//        out.write("太原理工大学");
    }

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

HttpServletRequest对象

  • HttpServletRequest有关请求行的方法

1.获取请求行信息的方法

方法声明 功能描述
String getMethod() 该方法用于获取HTTP请求消息中的请求方式(如GET、POST等)
String getRequestURI() 该方法用于获取请求行中资源名称部分,即位于URL的主机和端口之后、参数部分之前的数据
String getQueryString() 该方法用于获取请求行中的参数部分,也就是资源路径后面问号(?)以后的所有内容
String getProtocol() 该方法用于获取请求行中的协议名和版本,例如HTTP/1.0或HTTP/1.1
String getScheme() 该方法用于获取请求的协议名,例如http、https或ftp
StringBuffer getRequestURL() 该方法用于获取客户端发出请求时的完整URL,包括协议、服务器名、端口号、资源路径等信息,但不包括后面的查询参数部分。注意,getRequestURL()方法返回的结果是StringBuffer类型,而不是String类型,这样更便于对结果进行修改

2.获取路径信息的方法

方法声明 功能描述
String getContextPath() 该方法用于获取请求URL中属于Web应用程序的路径,这个路径以"/"开头,表示相对于整个Web站点的根目录,路径结尾不含"/"。如果请求URL属于Web站点的根目录,那么返回结果为空字符串("")
String getServletPath() 该方法用于获取Servlet的名称或Servlet所映射的路径

3.获取客户端信息的方法

方法声明 功能描述
String getRemoteAddr() 该方法用于获取请求客户端的IP地址,其格式类似于"192.168.0.3"
String getRemoteHost() 该方法用于获取请求客户端的完整主机名。
int getRemotePort() 该方法用于获取请求客户端网络连接的端口号

4.获取服务器信息的方法

方法声明 功能描述
String getLocalAddr() 该方法用于获取Web服务器上接收当前请求网络连接的IP地址
String getLocalName() 该方法用于获取Web服务器上接收当前网络连接IP所对应的主机名
int getLocalPort() 该方法用于获取Web服务器上接收当前网络连接的端口号
String getServerName() 该方法用于获取当前请求所指向的主机名,即HTTP请求消息中Host头字段所对应的主机名部分
int getServerPort() 该方法用于获取当前请求所连接的服务器端口号,即如果HTTP请求消息中Host头字段所对应的端口号部分
  • HttpServletRequest有关请求头的方法
方法声明 功能描述
String getHeader(String name) 该方法用于获取一个指定头字段的值。若无返回null,若为多个返回第一个值
Enumeration getHeaders(String name) 该方法返回一个Enumeration集合对象,该集合对象由请求消息中出现的某个指定名称的所有头字段值组成。
Enumeration getHeaderNames() 该方法用于获取一个包含所有请求头字段的Enumeration对象
int getIntHeader(String name) 该方法用于获取指定名称的头字段,并且将其值转为int类型。需要注意的是,如果指定名称的头字段不存在,返回值为-1;如果获取到的头字段的值不能转为int类型,将发生异常
long getDateHeader(String name) 该方法用于获取指定头字段的值,并将其按GMT时间格式,以毫秒为单位的时间值
String getContentType() 该方法用于获取Content-Type头字段的值,结果为String类型
int getContentLength() 该方法用于获取Content-Length头字段的值,结果为int类型
String getCharacterEncoding() 该方法用于返回请求消息的实体部分的字符集编码,通常是从Content-Type头字段中进行提取,结果为String类型
  • HttpServletRequest有关请求参数的方法
方法声明 功能描述
String getParameter(String name) 该方法用于获取某个指定名称的参数值;如果请求消息中包含有多个该指定名称的参数,getParameter()方法返回第一个出现的参数值
String[] getParameterValues(String name) 该方法用于返回一个String类型的数组,HTTP请求消息中可以有多个相同名称的参数
Enumeration getParameterNames() 该方法用于返回一个包含请求消息中所有参数名的Enumeration对象
Map getParameterMap() 该方法用于将请求消息中的所有参数名和值装入进一个Map对象中返回
java 复制代码
/**
 * 通过request获取请求参数
 */
@WebServlet("/TextServlet11")
public class TextServlet11 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

        String username = request.getParameter("username");
        String[] hobbies = request.getParameterValues("hobby");

        out.write("我是" + username + "<br/>" + "我的爱好是:");
        for (String hobby : hobbies) {
            out.write(hobby + " ");
        }
    }
}
html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
    <form action="/servlet-demo/TextServlet11" method="post">
        用户名:<input type="text" name="username"><br/>
        密&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"><br/>
        <input type="checkbox" name="hobby" value="sing">唱歌
        <input type="checkbox" name="hobby" value="dance">跳舞
        <input type="checkbox" name="hobby" value="rap">rap
        <input type="checkbox" name="hobby" value="basketball">篮球
        <br/>
        <input type="submit" value="提交">
        <input type="reset" value="重置">
    </form>
</body>
</html>
  • HttpServletRequest实现请求转发

1.要想实现Servlet之间的相互跳转需要通过RequestDispatcher接口的实例化对象

java 复制代码
RequestDispatcher getRequestDispatcher(String path)
//此方法用于返回封装了某条路径的RequestDispatcher对象,此处的path必须是"/"开头,表示相对于当前web根目录

2.通过forward()方法,将请求传递给其他资源去执行

java 复制代码
forward(ServletRequest req, ServletResponse resp)

3.实现原理

4.请求转发与重定向的区别

java 复制代码
1.重定向可以跳转到任何url,请求转发只可以转发到当前web应用程序下的资源
2.重定向后请求路径会变化,而请求转发不会改变请求路径
3.重定向不可以访问request域对象,因为它不是一次请求,而请求转发可以
java 复制代码
/**
 * 请求转发
 */
@WebServlet("/TextServlet10")
public class TextServlet10 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求,添加域对象
        request.setAttribute("college", "tyut");
        //请求转发
        //1.获取RequestDispatcher对象
        RequestDispatcher rd = request.getRequestDispatcher("/TextServlet01");
        //2.调用forward()方法
        rd.forward(request, response);
    }
}

@WebServlet(name = "TextServlet01", urlPatterns = {"/TextServlet01", "/textServlet01"})
public class TextServlet01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        String collage = (String) request.getAttribute("college");
        out.write("collage = " + collage);
    }
}
  • HttpServletRequest实现传递数据

域范围:一个用户的一次请求

方法声明 功能描述
Enumeration getAttributeNames() 获取域对象名字的Enumeration对象
Object getAttribute(String name) 根据域对象的名字获取域对象的值
void removeAttribute(String name) 根据域对象的名字删除域对象
void setAttribute(String name, Object value) 添加域对象
  • HttpServletRequest解决请求参数中文乱码

原因:由于在html或jsp中的编码方式

java 复制代码
<meta charset="UTF-8">

与服务器端Tomcat的解码方式不同

java 复制代码
Tomcat  ISO-8859-1

解决方法:

java 复制代码
//只需要将服务器解码方式换成html/jsp编码方式一样的字符集即可
request.setCharacterEncoding("utf-8");
相关推荐
m0_748245172 分钟前
Web第一次作业
java
小码的头发丝、2 分钟前
Java进阶学习笔记|面向对象
java·笔记·学习
m0_548514775 分钟前
前端Pako.js 压缩解压库 与 Java 的 zlib 压缩与解压 的互通实现
java·前端·javascript
坊钰33 分钟前
【Java 数据结构】移除链表元素
java·开发语言·数据结构·学习·链表
chenziang139 分钟前
leetcode hot100 LRU缓存
java·开发语言
会说法语的猪44 分钟前
springboot实现图片上传、下载功能
java·spring boot·后端
码农老起1 小时前
IntelliJ IDEA 基本使用教程及Spring Boot项目搭建实战
java·ide·intellij-idea
m0_748239831 小时前
基于web的音乐网站(Java+SpringBoot+Mysql)
java·前端·spring boot
时雨h1 小时前
RuoYi-ue前端分离版部署流程
java·开发语言·前端