javaweb笔记二:Servlet

概念

Servlet 是运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码,通过java的API,动态的向客户端输出内容。

servlet规范:包含三个技术点,它们是 servlet技术;filter(过滤器)技术;listener(监听器)技术。

Servlet实现

实现步骤:

  • 创建类实现Servlet接口
  • 覆盖尚未实现的方法—service方法
  • 在web.xml进行servlet的配置
    但在实际开发中,我们不会直接去实现Servlet接口,因为那样需要覆盖的方法太多, 我们一般创建类继承HttpServlet。
    在这里插入图片描述
public MyServlet extends HttpServlet{
    
    
	@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        this.doGet(req,resp);
    }
}

Servlet的生命周期

Servlet何时创建?默认第一次访问servlet时创建该对象

Servlet何时销毁?服务器关闭servlet就销毁了

每次访问必然执行的方法?service(ServletRequest req, ServletResponse res)方法

问题:对XXXServlet进行了10次访问,init(),destory(),service(),doGet(),doPost() 一共执行力多少次?request对象创建几个?response创建几个?

答案:init(),1次;destory(),服务器没有关闭, 不执行;service(),10次;request对象创建10个;response创建10个

Servlet的配置

<servlet>
  <servlet-name>ServletName</servlet-name>   
  <servlet-class>xxxpackage.xxxServlet</servlet-class>   <!--Servlet的类-->
  <init-param>                                     <!--初始化一个变量,可看成全局变量,可省略-->
    <param-name>参数名称</param-name>              <!--变量名称-->

    <param-value>参数值</param-value>              <!--变量值-->
  </init-param>

</servlet>
<servlet-mapping>
  <servlet-name>ServletName</servlet-name>               
  <url-pattern>/aaa/xxx</url-pattern>                   <!--映射的url路径 -->

</servlet-mapping>

其中url-pattern的配置方式:

  • 完全匹配 访问的资源与配置的资源完全相同才能访问到
    在这里插入图片描述

  • 目录匹配 格式:/虚拟的目录…/* ,*代表任意
    在这里插入图片描述

  • 扩展名匹配 格式:*.扩展名

在这里插入图片描述

注意:1、关于路径,配置的路径匹配范围越大优先级越低;2、目录匹配与扩展名匹配不要混用,比如: /aaa/bbb/*.abcd(这是错误的)

ServletConfig对象

ServletConfig封装了servlet在web.xml中的配置.

比如web.xml参数配置如下:

<init-param>
    <param-name>name</param-name>
    <param-value>tom</param-value>
</init-param>

方法:

//获得servlet的name(获得配置文件中<servlet-name>元素的内容)
String servletName =getServletConfig().getServletName();

//获取init-param中的所有参数(返回所有<param-name> )
Enumeration<String> en = getServletConfig().getInitParameterNames();
while(en.hasMoreElements()){
    
    
  String key = en.nextElement();
  //根据键获取值(根据<init-param>中的<param-name>获得</param-value>
  String value = getServletConfig().getInitParameter(key);)
  res.getWriter().print(key+"==>"+value+"<br/>");
}

服务器启动实例化Servlet配置

Servlet何时创建:默认第一次访问时创建。为什么是默认?当在servlet的配置时,加上一个配置 ,servlet对象在服务器启动时就创建。

 <servlet>
    <servlet-name>abc</servlet-name>
    <servlet-class>com.itheima.servlet.QuickStratServlet</servlet-class>
    <init-param>
      <param-name>url</param-name>
      <param-value>jdbc:mysql:///mydb</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>abc</servlet-name>
    <url-pattern>/quickStratServlet</url-pattern>
  </servlet-mapping>

1、load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。

2、它的值必须是一个整数,表示servlet应该被载入的顺序

3、当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;

4、当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。

5、正数的值越小,该servlet的优先级越高,应用启动时就越先加载。

6、当值相同时,容器就会自己选择顺序来加载。

所以,<load-on-startup>x</load-on-startup>,中x的取值1,2,3,4,5代表的是优先级.

ServletContext对象

ServletContext代表的是一个web应用的环境(上下文)对象,ServletContext对象内部封装是该web应用的信息,ServletContext对象一个web应用只有一个。那么一个web应用有几个servlet对象?很多个。

ServletContext对象的生命周期

创建:该web应用被加载(服务器启动或发布web应用(前提,服务器为启动状态))

销毁:web应用被卸载(服务器关闭,移除该web应用)

获得ServletContext对象

1ServletContext servletContext = config.getServletContext();

2ServletContext servletContext = this.getServletContext();

ServletContext的作用

1、获得web应用全局的初始化参数,方法:

getInitParameterNames();  ==> 获得所有键

getInitParameter(key);  ==> 根据键获得对应的值

比如:web.xml中配置初始化参数

 <!--配置全局的初始化参数-->
    <context-param>
        <param-name>driver</param-name>
        <param-value>com.mysql.jdbc.Driver</param-value>
    </context-param>

则可以通过context对象获得参数

ServletContext context= getServletContext();
String initValue= context.getInitParameter("driver");
resp.getWriter().print(initValue);//com.mysql.jdbc.Driver

2、获得web应用中任何资源的绝对路径

此功能很重要。方法:

getRealPath ==> 通过相对路径获得绝对路径
getResourceAsStream ==> 根据相对路径获得指定资源流

3、ServletContext是一个域对象

什么是域对象?什么是域?存储数据的区域就是域对象。

ServletContext域对象的作用范围是整个web应用(所有的web资源都可以随意向 servletcontext域中存取数据,数据可以共享)

域对象的通用的方法
放入键值对 setAttribute(key,value)
通过键取值 getAttribute(key)
通过键删除 removeAttribute(key)
遍历所有键 getAttributeNames()
//通过servletContext设置值
sc.setAttribute("bag", "Calvin Klein");
sc.setAttribute("car", "BMW");
sc.setAttribute("passport", "HAWAII");
//通过servletContext取值
String bag = (String) sc.getAttribute("bag");
//不喜欢,扔掉(删除)
sc.removeAttribute("bag");
//遍历
Enumeration<String> en = sc.getAttributeNames();
while(en.hasMoreElements()){
    
    
    String key = en.nextElement();
     Object value =  sc.getAttribute(key);
     System.out.println(key +"==>"+value);
}        

参考资料:
1.https://www.cnblogs.com/ginb/p/7219259.html

猜你喜欢

转载自blog.csdn.net/weixin_42838061/article/details/121142406
今日推荐