- 本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、前言
最近在复习javaweb,再次学习javaweb,又有了一些新的理解和收获,着手写关于JavaWeb从入门到精通的专栏,扎实web根基,千锤百炼javaweb,为以后的框架打好基础! 那么通过这篇文章,各位小伙伴们可以收获哪些呢?
了解工程目录结构学会创建servlet程序知道servlet声明周期、继承体系ServletConfig、ServletContext类的讲解
废话不多说,满满的干货,赶快来看看吧~
二、工程目录结构
在正式使用javaweb中的servlet之前,先简单的介绍创建工程后,各个目录结构以及各自的作用,这个很有学习的必要!
三、servlet简介
什么是servlet?
- servlet是JavaEE规范之一,规范就是接口
- servlet是JavaWeb三大组件之一。三大组件分别是servlet程序、filter过滤器、listener监听器
- servlet是运行在服务器上的一个java小程序,它可以接收客户端发送过来的请求,并响应数据给客户端
四、实现servlet程序
其实操作很简单,编写一个类去实现servlet接口:
public class FirstServlet implements Servlet{
public FirstServlet() {
System.out.println("我是构造器");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("我是初始化方法");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service方式执行了");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("我被摧毁了~");
}
}
然后在web.xml配置文件中配置servlet程序的访问地址:
<?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>FirstServlet</servlet-name>
<servlet-class>com.cabbage.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
需要注意的是:
| 标签 | 作用 |
|---|---|
<servlet> | 给Tomcat配置servlet程序 |
<servlet-name> | 给servlet程序起一个别名 |
<servlet-class> | servlet程序的全类名 |
<servlet-mapping> | 给servlet程序配置访问地址 |
<servlet-name> | 是告诉服务器,当前配置的地址给哪个servlet程序使用 |
<url-pattern> | 配置访问地址 |
| / | 斜杠在服务器解析的时候,表示地址为http://ip:port/工程路径 |
| /hello | 表示地址为http://ip:port/工程路径/hello |
图实在是太难画了,就直接拿了过来。从图中可知,客户端通过ip地址定位服务器,然后通过端口号定位Tomcat,在通过工程路径确定访问哪一个工程,最后通过资源路径访问web.xml配置文件中的访问路径,根据name找到对应的servlet类,最后执行该内中的功能代码,大致就是这么一个过程。
五、servlet的生命周期
运行上面的代码,就可以得到以下结果:
- 先执行servlet构造器方法
- 接着执行init初始化方法
- 执行service方法,此方法每次访问都会调用
- 最后再工程停止的时候执行destroy方法
六、servlet类的继承体系
七、ServletConfig类:
ServletConfig 类从类名上来看,就知道是 Servlet 程序的配置信息类。 Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。 Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对 象。
ServletConfig类的三大作用:
- 可以获取 Servlet 程序的别名 servlet-name 的值
- 获取初始化参数 init-param
- 获取 ServletContext 对象
为了方便测试,我们在web.xml配置文件中添加一些内容:
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>com.cabbage.FirstServlet</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>root</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
写一个java代码用来测试:
public class FirstServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletConfig config = getServletConfig();
String name = config.getServletName();
String username = config.getInitParameter("username");
String password = config.getInitParameter("password");
ServletContext servletContext = config.getServletContext();
System.out.println(name);
System.out.println(username);
System.out.println(password);
System.out.println(servletContext);
}
}
运行结果无误:
八、ServletContext 类
什么是ServletContext类?
- ServletContext 是一个接口,它表示 Servlet 上下文对象
- 一个 web 工程,只有一个 ServletContext 对象实例。
- ServletContext 对象是一个域对象。
- ServletContext 是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁。
什么是域对象? 域对象,是可以像 Map 一样存取数据的对象,叫域对象。 这里的域指的是存取数据的操作范围,整个 web 工程。
ServletContext类的四个作用:
- 获取 web.xml 中配置的上下文参数 context-param
- 获取当前的工程路径,格式: /工程路径
- 获取工程部署后在服务器硬盘上的绝对路径
- 像 Map 一样存取数据
在web.xml配置文件中添加全局配置:
<context-param>
<param-name>username</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>root</param-value>
</context-param>
写一个java代码用来测试:
public class FirstServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = getServletContext();
String contextPath = context.getContextPath();
String username = context.getInitParameter("username");
String password = context.getInitParameter("password");
String realPath = context.getRealPath("/");
System.out.println(contextPath);
System.out.println(username);
System.out.println(password);
System.out.println(realPath);
}
}
运行结果完全正确:
接下来,我们新建一个servlet程序用来测试同一个对象:
public class Servlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
context.setAttribute("key1","value1");
System.out.println(context);
}
}
public class FirstServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = getServletContext();
Object key1 = context.getAttribute("key1");
System.out.println(key1);
System.out.println(context);
}
}
运行的结果:
九、总结
乐莫乐兮新相知,很高兴各位小伙伴可以坚持看完这篇文章。 如果对你有帮助,可以给博主三连支持一下哦~~ 非常感谢, 一起加油,一起进步!