Java Web——Servlet中的request、response

简介: Java Web——Servlet中的request、response

文章目录:


写在前面:再谈Servlet的生命周期

1.response对象

1.1 第一个例子 

1.2 第二个例子 

1.3 第三个例子 

2.request对象

2.1 第一个例子

2.2 第二个例子

2.3 第三个例子

2.4 第四个例子

2.5 第五个例子


写在前面:再谈Servlet的生命周期


1.    一个网站中所有的Servlet接口实现类的实例对象应该由Http服务器负责创建。

2.    在正常情况下,只有在Tomcat接收到第一个针对当前Servlet接口实现类的请求时,才会创建其实例对象。通过命令干预,可以要求Tomcat在启动时自动创建Servlet接口实现类。具体命令如下:(web.xml

<servlet>
    <servlet-name>...</servlet-name>
    <servlet-class>...</servlet-class>
    <load-on-startup>1</load-on-startup> <!--大于0的整数即可-->
</servlet>
<!-- 通过调用Servlet接口实现类的无参构造方法创建其实例对象 -->

     3.一个Servlet接口实现类最多只能被创建一个实例对象。

     4.Tomcat关闭时负责销毁网站中所有的Servlet接口实现类的实例对象。

1.response对象


这里我通过 HttpServletResponse 接口来讲述一下我对 Servlet 中的 response 对象的理解。

介绍如下:


1.    HttpServletResponse 接口来自于Servlet规范。

2.    HttpServletResponse 接口实现类由Http服务器厂商提供。

3.    HttpServletResponse 接口可以将Servlet中的运行结果写入到响应包。

4.    一般习惯将HttpServletResponse 接口修饰的对象称为响应对象。


主要功能:

1.    HttpServletResponse 接口负责将Servlet运行结果以二进制形式写入到响应包中的响应体。

2.    HttpServletResponse 接口负责设置响应包中响应头的content-type属性,控制浏览器采用对应的解析器和编译器对响应体中的二进制数据进行处理。

3.    HttpServletResponse 接口负责将一个请求地址写入到响应头中的location属性中,来控制浏览器下一次请求的方式。

下面给出我在IDEA中配置的Tomcat的相关信息。



1.1 第一个例子 

实现功能:HttpServletResponse 接口负责将Servlet运行结果以二进制形式写入到响应包中的响应体。

resp.getWriter().write("this is response");    将数据打印到浏览器中

resp.getWriter().write("<b>this is response</b>");    将数据打印到浏览器中,设置文本为html可执行html代码


package com.songzihao.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
 *
 */
public class OneServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String str="Hello Servlet!!!";//作为处理结果
        //通过响应对象将结果以二进制形式写入到响应体
        //通过响应对象向tomcat借一个输出流使用
        PrintWriter out=resp.getWriter();
        //通过输出流将结果以二进制形式写入到响应体
        out.print(str);
    }
    //tomcat负责将响应包推送给发起请求的浏览器,浏览器接收到响应包之后解析响应体的内容并显示
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>OneServlet</servlet-name>
        <servlet-class>com.songzihao.controller.OneServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>OneServlet</servlet-name>
        <url-pattern>/one</url-pattern>
    </servlet-mapping>
</web-app>


1.2 第二个例子 

实现功能:HttpServletResponse 接口负责设置响应包中响应头的content-type属性,控制浏览器采用对应的解析器和编译器对响应体中的二进制数据进行处理。


package com.songzihao.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
 *
 */
public class TwoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String str="Java<br/>MySQL<br/>HTML<br/>";
        String str2="张三<br/>李四<br/>王五<br/>";
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out=resp.getWriter();
        out.print(str);
        out.print(str2);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>TwoServlet</servlet-name>
        <servlet-class>com.songzihao.controller.TwoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TwoServlet</servlet-name>
        <url-pattern>/two</url-pattern>
    </servlet-mapping>
</web-app>


1.3 第三个例子 

实现功能:HttpServletResponse 接口负责将一个请求地址写入到响应头中的location属性中,来控制浏览器下一次请求的方式。


package com.songzihao.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
 *
 */
public class ThreeServlet extends HttpServlet {
    /**
     *  1.tomcat发现响应头中的location属性被赋值,此时将产生一个302状态码并写入到响应包中的状态行
     *  2.tomcat负责推送响应包返回给发起请求的浏览器
     *  3.浏览器接收到响应包之后,读取到状态行中的302状态码,此时浏览器直接读取响应头中的location属性中的地址,并更新到浏览器的地址栏
     *  4.由于在浏览器启动时,自动生成一个线程对象用于扫描浏览器地址栏,当这个线程发现浏览器地址栏发生了变化,就会要求浏览器立刻根据新地址发起请求
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String url="http://www.baidu.com";
        //通过响应对象将地址写入到响应头中的location
        resp.sendRedirect(url);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
}


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>ThreeServlet</servlet-name>
        <servlet-class>com.songzihao.controller.ThreeServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ThreeServlet</servlet-name>
        <url-pattern>/three</url-pattern>
    </servlet-mapping>
</web-app>


2.request对象


这里我通过 HttpServletRequest 接口来讲述一下我对 Servlet 中的 request 对象的理解。


介绍如下:

1.    HttpServletRequest 接口来自于Servlet规范。

2.    HttpServletRequest 接口实现类由Http服务器厂商提供。

3.    HttpServletRequest 接口读取请求协议包中的内容。

4.    一般习惯将HttpServletRequest 接口修饰的对象称为请求对象。


主要功能:

1.    HttpServletRequest 接口读取请求包中的请求行中的信息(urlmethodurischeme)。

2.    HttpServletRequest 接口读取请求包中请求头或者请求体中参数的信息。

3.    HttpServletRequest 接口代替浏览器向Tomcat索要资源文件。


2.1 第一个例子


实现功能:HttpServletRequest 接口读取请求包中的请求行中的信息(urlmethodurischeme)。


package com.songzihao.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
 *
 */
public class OneServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //读取请求行中的url属性信息
        String url=req.getRequestURL().toString();
        //读取请求行中method的属性信息
        String method=req.getMethod();
        //读取请求行中的uri属性信息
        //uri是从url中截取的一段字符串,格式:"/网站名/资源文件名",可以帮助tomcat进行资源定位
        String uri=req.getRequestURI().toString();
        //获取请求行中的协议信息
        String scheme=req.getScheme();
        System.out.println("url===" + url);
        System.out.println("uri===" + uri);
        System.out.println("method===" + method);
        System.out.println("scheme===" + scheme);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>OneServlet</servlet-name>
        <servlet-class>com.songzihao.controller.OneServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>OneServlet</servlet-name>
        <url-pattern>/one</url-pattern>
    </servlet-mapping>
</web-app>


2.2 第二个例子


实现功能:HttpServletRequest 接口读取请求包中请求头或者请求体中参数的信息。 

String name=req.getParameter("userName");  这里的键值需要你的请求数据中的键值相对应,如果不存在,返回null


package com.songzihao.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
/**
 *
 */
public class TwoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        req.setCharacterEncoding("utf-8");
        //1.读取指定的请求参数内容
        String name=req.getParameter("userName");
        String password=req.getParameter("password");
        System.out.println("name===" + name);
        System.out.println("password===" + password);
        //读取本次请求中所有的请求参数名称,并将这些请求参数名封装到一个枚举对象返回
        Enumeration paramNames=req.getParameterNames();
        while (paramNames.hasMoreElements()) {
            String paramName= (String) paramNames.nextElement();
            String value=req.getParameter(paramName);
            System.out.println("请求参数名===" + paramName + ",请求参数值===" + value);
        }
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        doGet(req,resp);
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>TwoServlet</servlet-name>
        <servlet-class>com.songzihao.controller.TwoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TwoServlet</servlet-name>
        <url-pattern>/two</url-pattern>
    </servlet-mapping>
</web-app>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/myWeb/two" method="get">
        用户名:<input type="text" name="userName"><br/>
        密码:<input type="password" name="password"><br/>
        <input type="submit" value="提交">
    </form>
</body>
</html>


2.3 第三个例子


实现功能:HttpServletRequest 接口读取请求包中请求头或者请求体中参数的信息。 

String[] strings=request.getParameterValues("web");    这里是对同键不同值的信息获取。如果不存在,返回null


package com.songzihao.controller;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class ThreeServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        String[] strings=request.getParameterValues("web");
        for (String str : strings) {
            System.out.println("技术===" + str);
        }
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
}


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>ThreeServlet</servlet-name>
        <servlet-class>com.songzihao.controller.ThreeServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ThreeServlet</servlet-name>
        <url-pattern>/three</url-pattern>
    </servlet-mapping>
</web-app>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/myWeb/three" method="get">
        擅长的技术:<input type="checkbox" name="web" value="Java"/>Java
        <input type="checkbox" name="web" value="MySQL"/>MySQL
        <input type="checkbox" name="web" value="HTML">HTML<br/>
        <input type="submit" value="提交">
    </form>
</body>
</html>


2.4 第四个例子

实现功能:HttpServletRequest 接口读取请求包中请求头或者请求体中参数的信息。


package com.songzihao.controller;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class FourServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String value=request.getParameter("info");
        System.out.println("来自于请求头中的参数信息===" + value);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        String value=request.getParameter("info");
        System.out.println("来自于请求体中的参数信息===" + value);
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>FourServlet</servlet-name>
        <servlet-class>com.songzihao.controller.FourServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>FourServlet</servlet-name>
        <url-pattern>/four</url-pattern>
    </servlet-mapping>
</web-app>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/myWeb/four" method="get">
        信息:<input type="text" name="info"/><br/>
        <input type="submit" value="以get方式发送请求"/>
    </form>
    <form action="/myWeb/four" method="post">
        信息:<input type="text" name="info"/><br/>
        <input type="submit" value="以post方式发送请求"/>
    </form>
</body>
</html>


2.5 第五个例子

实现功能:HttpServletRequest 接口代替浏览器向Tomcat索要资源文件。


package com.songzihao.controller;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class FiveServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("FiveServlet处理了用户的第一个请求");
        RequestDispatcher requestDispatcher=request.getRequestDispatcher("/five.html");
        requestDispatcher.forward(request,response);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>FiveServlet</servlet-name>
        <servlet-class>com.songzihao.controller.FiveServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>FiveServlet</servlet-name>
        <url-pattern>/five</url-pattern>
    </servlet-mapping>
</web-app>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    我是five.html
</body>
</html>

相关文章
|
2月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
361 1
|
2月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
323 0
|
3月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
483 64
|
3月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
304 1
|
4月前
|
缓存 NoSQL Java
Java Web 从入门到精通之苍穹外卖项目实战技巧
本项目为JavaWeb综合实战案例——苍穹外卖系统,涵盖Spring Boot 3、Spring Cloud Alibaba、Vue 3等主流技术栈,涉及用户认证、订单处理、Redis缓存、分布式事务、系统监控及Docker部署等核心功能,助你掌握企业级项目开发全流程。
562 0
|
4月前
|
安全 JavaScript Java
java Web 项目完整案例实操指南包含从搭建到部署的详细步骤及热门长尾关键词解析的实操指南
本项目为一个完整的JavaWeb应用案例,采用Spring Boot 3、Vue 3、MySQL、Redis等最新技术栈,涵盖前后端分离架构设计、RESTful API开发、JWT安全认证、Docker容器化部署等内容,适合掌握企业级Web项目全流程开发与部署。
323 0
|
9月前
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
619 7
|
10月前
|
Kubernetes Java 持续交付
小团队 CI/CD 实践:无需运维,Java Web应用的自动化部署
本文介绍如何使用GitHub Actions和阿里云Kubernetes(ACK)实现Java Web应用的自动化部署。通过CI/CD流程,开发人员无需手动处理复杂的运维任务,从而提高效率并减少错误。文中详细讲解了Docker与Kubernetes的概念,并演示了从创建Kubernetes集群、配置容器镜像服务到设置GitHub仓库Secrets及编写GitHub Actions工作流的具体步骤。最终实现了代码提交后自动构建、推送镜像并部署到Kubernetes集群的功能。整个过程不仅简化了部署流程,还确保了应用在不同环境中的稳定运行。
578 9
|
11月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
655 7
Spring Boot 入门:简化 Java Web 开发的强大工具
|
12月前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
157 24
下一篇
oss云网关配置