ServletContext

编写新的项目

由于每次都需要重新复制web.xml,先选择一下的方法

  1. 在项目中新建file。命名为note。md(采用markdown语法),之后每次使用只需要复制一下,找的时间被节约。
  2. 新建一个模板:需要的时候选择new,选择我们自己创建的模板。
    屏幕截图 2025-08-25 190252
package com.xin.servlet;

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 HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Hello");
    }
}
<?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"
         metadata-complete="true">
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.xin.servlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>

在重新创建了项目之后,tomcat需要把之前的删掉,否则打包的时候会把所有的架构都打包一遍。也就是一个module配一个tomcat,每一个单独启动。

原因:因为是由于tomcat的端口配置,如果在idea中配置tomcat每次都是不同的端口,那么就不需要删掉之前的项目。
屏幕截图 2025-08-25 171822

启动tomcat

屏幕截图 2025-08-25 185815
这时网页上并不会有显示,因为我们在编写Java程序时并没有启动post
方法,所以只在后台的终端输出hello

servletcontext

web容器在启动时,他会为每一个web程序都创建一个对应的servlet对象,他代表了当前的web应用

  1. 共享数据:因为servlet相当于凌驾在servlet项目之上,所以我在这个servlet保存的数据可以通过servletcontext在另一个servlet中拿到。
    1. 创建放置数据的类
    2. 创建读取数据的类
      注意中文需要编写相应的响应,且数据在上,响应在下
      resp.setContentType("text/html;charset=utf-8");
    3. 配置web.xml
    4. 测试访问结果:先访问放置数据的路径/hello。再访问/gets
package com.xin.servlet;

import javax.servlet.ServletContext;
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 HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Hello");
        ServletContext contex = getServletContext();
        String username = "xixi";
        //将一个数据保存在了Servlet当中,名字为username,值为xixi
        contex.setAttribute("username",username);
    }
}
package com.xin.servlet;

import javax.servlet.ServletContext;
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 GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String  username = (String)context.getAttribute("username");
         resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();

        writer.print("名字"+username);
    }

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

  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.xin.servlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>gets</servlet-name>
    <servlet-class>com.xin.servlet.GetServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>gets</servlet-name>
    <url-pattern>/gets</url-pattern>
  </servlet-mapping>

servletcontext应用

配置context初始化参数
1.配置context参数名,参数路径

<context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
  </context-param>

2.编写Java程序得到context的路径

 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String url = context.getInitParameter("url");
    }
	  PrintWriter writer = resp.getWriter();
        writer.print(url);
  1. 配置web.xml 的servlet
 <servlet>
    <servlet-name>gp</servlet-name>
    <servlet-class>com.xin.servlet.ServletDemo03</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>gp</servlet-name>
    <url-pattern>/gp</url-pattern>
  </servlet-mapping>
  1. 测试启动
    屏幕截图 2025-08-29 095132

请求转发(转发:dispatcher)

  1. 转发的请求路径
  2. 调用forward实现请求转发
RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");
        requestDispatcher.forward(req,resp);
  1. 配置wb.xml
 <servlet>
    <servlet-name>sd4</servlet-name>
    <servlet-class>com.xin.servlet.ServletDemo04</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>sd4</servlet-name>
    <url-pattern>/sd4</url-pattern>
  </servlet-mapping>
  1. 启动测试
    屏幕截图 2025-08-29 100531

读取资源文件(Properties类)

Properties:

  1. 在resource下新建properties
  2. 在Java下新建项目properties
    发现:都被打包到了同一个路径下:classes,我们俗称这个路径为class path(类路径)
    思路:需要一个文件流
username=xin
password=123456

java代码

如果出现500错误,可以检查输入的路径,包括web.xml配置servlet时的路径

点击查看代码
package com.xin.servlet;

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.InputStream;
import java.util.Properties;

public class ServlerDemo05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	//新建一个资源io流返回一个对象,路径就是target里面文件存放的路径,可以通过不同的路径映射不同的文件
        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/dp.properties");
		//实例化properties类,返回一个对象
        Properties prop = new Properties();
		//通过返回的对象,调用load方法,并用我们创建的流
        prop.load(is);
		//用prop采用getproperty方法返回我们得到文件里面的信息
        String username = prop.getProperty("username");
        String password = prop.getProperty("password");
		//返回给前端
        resp.getWriter().print(username+":"+password);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);

    }
}

配置web.xml:修改名字和路径即可,此处名字为sd5

访问测试:
屏幕截图 2025-08-29 105458

posted @ 2025-08-27 14:04  xixixixin  阅读(10)  评论(0)    收藏  举报