目录
前言
本节我们介绍Servlet。围绕着Servlet这门技术,剖析它的组成ServletContext对象,HttpServletResponse,HttpServletRequest。
什么是Servlet
Servlet是sun公司开发动态web的一门技术。使用Servlet开发动态web也很简单,只需要让编写的类继承Servlet接口,然后把开发好的Java类部署到web服务器上即可。我们来看一下Servlet接口的继承关系图。

Mapping映射问题
为什么要编写Servlet的映射。因为Java程序要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的Servlet,提供一个浏览器的访问路径。
一个Servlet可以映射一个或多个路径,也可以使用通配符指定任意路径(通配符前面不能加/)。关于映射路径的优先级,指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求。
<!--404-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>error</servlet-name>
<servlet-class>com.kuang.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>error</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
ServletContext
什么是ServletContext
web容器在启动的时候,不同的Servlet之间通过ServletContext通信。发送方向ServletContext里面提交数据,接受方从ServletContext里面拿取数据。

ServletContext的常用功能
1.共享数据
在这个Servlet中保存的数据,可以在另一个servlet中拿到。需要注意设置context类型和编码集类型
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");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print("名字"+username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2.获取web配置的初始化参数
<!--在web.xml文件中配置一些web应用初始化参数-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
//在servlet中获取getInitParameter
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().print(url);
}
3.请求转发
输入a的路径,转发到了b的页面,获取的是b页面的内容,这叫做请求转发。
输入a的路径,由于做了重定向的配置,跳转的是b的页面,并显示的是b的页面路径。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
System.out.println("进入了ServletDemo04");
//RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp"); //转发的请求路径
//requestDispatcher.forward(req,resp); //调用forward实现请求转发;
context.getRequestDispatcher("/gp").forward(req,resp);
}

4.读取资源文件
无论是在java目录还是在resources目录下的配置文件都会打包到taget中的classes路径下俗称classpath,我们通过文件流来获取路径,通过Properties类对象来获取配置文件信息。
public class ServletDemo05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/kuang/servlet/aa.properties");
Properties prop = new Properties();
prop.load(is);
String user = prop.getProperty("username");
String pwd = prop.getProperty("password");
resp.getWriter().print(user+":"+pwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
面试题——聊聊请求转发和重定向
相同点:页面都会实现跳转
不同点:请求转发时url不会变化,响应码是307;重定向时url会发生变化,响应码是302
本文深入解析Servlet技术,涵盖Servlet的基本概念、映射机制、ServletContext的使用及请求转发与重定向的区别。通过实例演示如何利用Servlet处理HTTP请求,共享数据及读取资源文件。

被折叠的 条评论
为什么被折叠?



