ServletContext、Request、Response应用

本文介绍如何使用ServletContext对象在Servlet之间实现数据共享,并通过示例展示了Request对象的基本使用及如何处理前端用户提交的参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ServletContext

简介:
上一篇文章说到了Servlet的运行过程,里面提到了在执行servlet中会创建一个Web容器来进行访问和请求。

  1. Web容器在启动时,它会为每个Web应用程序都创建一个对象的ServletContext对象,它代表当前Web应用
  2. 多个Servlet通过ServletContext对象来实现数据共享
  3. 获取Web应用的初始化参数
  4. 用ServletContext实现请求转发
  5. 利用ServletContext对象读取资源文件

通过ServletContext来实现数据共享
在这里插入图片描述

ServletContext示例:

需求:两个servlet之间通过ServletContext实现数据共享
实现代码:

servlet01如下:(如何导包,上上篇博客图解的很清楚)
public class ServletDemo01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	//这里对请求和响应都进行编码格式的设定(如果不设定,使用中文有可能会发生乱码)
    	//请求设定为utf-8
    	request.setCharacterEncoding("utf-8");
    	//响应也设定为utf-8
    	response.setCharacterEncoding("utf-8");
        //通过servlet对象可以获取一个ServletContext;
        ServletContext context = this.getServletContext();
        String username = "暮凌寒雪";//可以通过JDBC去读取;
        //setAttribute :设置一个属性;(属性名,属性值)
        context.setAttribute("name",username);
       //将其输出在servlet的web页面
        response.getWriter().print("设置name成功:"+username);
    }
}
servlet02如下:
public class ServletDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	//请求编码格式设定为utf-8
    	req.setCharacterEncoding("utf-8");
    	//响应编码格式设定为UTF-8
    	resp.setCharacterEncoding("utf-8");
		//获取ServletContext对象
        ServletContext context = this.getServletContext();
        //原本这里是Object对象,因为我们为开发者,知道servlet01传过来的是string对象,因此这里对其进行设定为String对象,并进行了强转
        String name = (String) context.getAttribute("name");
        //将收到的信息打印在Servlet的web页面中
        resp.getWriter().print("我们获取到的ServletDemo01信息为:"+name);
    }
}
web.xml配置如下:(每行的意思在之前博客上也有很详细的解释)
<servlet>
        <servlet-name>servlet01</servlet-name>
        <servlet-class>com.pzy.servlet.ServletDemo01</servlet-class>
    </servlet>

    <servlet>
        <servlet-name>servlet02</servlet-name>
        <servlet-class>com.pzy.servlet.ServletDemo02</servlet-class>
    </servlet>
    <!--=====================================================-->
    <servlet-mapping>
        <servlet-name>servlet01</servlet-name>
        <url-pattern>/q1</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>servlet02</servlet-name>
        <url-pattern>/q2</url-pattern>
    </servlet-mapping>

结果:
在这里插入图片描述
在这里插入图片描述

Request
public class RequestDemo01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //查看request对象的方式
        System.out.println(request.getContextPath()); //获得web项目路径
        System.out.println(request.getRequestURI()); //请求的URL路径
        //Remote 远程
        System.out.println(request.getRemoteUser()); //获得远程的用户名
        System.out.println(request.getRequestedSessionId()); //获得SessionId;
        System.out.println(request.getServletPath()); //请求servlet的url
        System.out.println(request.getLocalAddr()); //获得本地地址  防火墙
        System.out.println(request.getLocalName()); //获得本地名字
        System.out.println(request.getLocalPort()); //获得访问的端口号
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

在这里插入图片描述

Request和Response示例

需求:Request对象接收前端用户提交的参数

1.编写前端注册页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册</title>
</head>
<body>
<h1>注册</h1>
<form action="${pageContext.request.contextPath}/register" method="post">
    <p>
        <%-- 控件必须有name属性,因为Servlet要通过name才能接收到用户输入的信息 --%>
        用户名:<input type="text" name="username">
    </p>
    <p>
        密码:<input type="password" name="password">
    </p>
    <p>
        爱好 :
        <input type="checkbox" name="hobby" value="girl">女孩
        <input type="checkbox" name="hobby" value="code">代码
        <input type="checkbox" name="hobby" value="movie">电影
        <input type="checkbox" name="hobby" value="music">音乐
    </p>
    <p>
        <input type="submit" value="提交">
        <input type="reset" value="重置">
    </p>
</form>
</body>
</html>
2.写处理前端提交信息的Servlet如下:
public class FormServlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //处理乱码
        req.setCharacterEncoding("UTF-8");
        //处理前端的请求
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("接收到的用户名:"+username+"\n密码:"+password+"\n爱好:");
        String[] hobbies = req.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }

        //请求转发
        req.getRequestDispatcher("/success.jsp").forward(req,resp);
        /*
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/success.jsp");
        requestDispatcher.forward(req,resp);
        */
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //睡眠两秒,观察其转发的过程
    }
}
3.web.xml文件配置如下:
<servlet>
        <servlet-name>Demo01</servlet-name>
        <servlet-class>com.kuang.servlet.FormServlet1</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>Demo01</servlet-name>
        <url-pattern>/register</url-pattern>
    </servlet-mapping>
  1. 提交测试
  • 检查英文提交情况,服务器是否接收成功!
  • 提交中文,看看乱码情况
  • 设置编码统一,解决乱码问题;

运行服务器结果:
在这里插入图片描述
中间会有一个两秒的刷新时间(截不到图…)
在这里插入图片描述
重定向和转发的异同:

  • 重定向: 服务器告诉客户端你应该请求另外一个地址; (地址栏会变)
    resp.sendRedirect(“url”);
    参数就是他要重定向的页面

  • 转发: 服务器把这个请求转向另外一个Servlet去处理; (地址栏不会变)
    RequestDispatcher ,需要使用RequestDispatcher来进行处理,我们需要获得这个类
    req.getRequestDispatcher("/success.jsp").forward(req,resp);
    参数就是他要转发到的页面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值