ServletContext
编写新的项目
由于每次都需要重新复制web.xml,先选择一下的方法
- 在项目中新建file。命名为note。md(采用markdown语法),之后每次使用只需要复制一下,找的时间被节约。
- 新建一个模板:需要的时候选择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每次都是不同的端口,那么就不需要删掉之前的项目。

启动tomcat

这时网页上并不会有显示,因为我们在编写Java程序时并没有启动post
方法,所以只在后台的终端输出hello
servletcontext
web容器在启动时,他会为每一个web程序都创建一个对应的servlet对象,他代表了当前的web应用
- 共享数据:因为servlet相当于凌驾在servlet项目之上,所以我在这个servlet保存的数据可以通过servletcontext在另一个servlet中拿到。
- 创建放置数据的类
- 创建读取数据的类
注意中文需要编写相应的响应,且数据在上,响应在下
resp.setContentType("text/html;charset=utf-8"); - 配置web.xml
- 测试访问结果:先访问放置数据的路径/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);
- 配置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>
- 测试启动
![屏幕截图 2025-08-29 095132]()
请求转发(转发:dispatcher)
- 转发的请求路径
- 调用forward实现请求转发
RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");
requestDispatcher.forward(req,resp);
- 配置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>
- 启动测试
![屏幕截图 2025-08-29 100531]()
读取资源文件(Properties类)
Properties:
- 在resource下新建properties
- 在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
访问测试:





浙公网安备 33010602011771号