Servlet简单介绍

Servlet

  • 生命周期函数,汤姆猫调用的函数
  • Servlet只有一个实例对象 , 会出现一个Servlet同时处理多个请求 , 不为线程安全, 但会高效率 ,
    • 所以不该在Servlet中创建成员变量 , 可以局部变量(创建成员变量进行读写时可能会出现死锁的情况)
    • 可以创建无状态方法(即一个类只有操作集)
    • 可以创建有状态成员(只读),(即一个成员只有get方法,没有set)
  • 动态资源 , javaweb的三大组件之一
    • 获得请求
    • 处理请求
    • 完成响应

  • Servlet的大多方法不由我们来创建
    下图显示了一个典型的 Servlet 生命周期方案。

第一个到达服务器的 HTTP 请求被委派到 Servlet 容器。
Servlet 容器在调用 service() 方法之前加载 Servlet。
然后 Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的 Servlet 实例的 service() 方法。

* destroy() ,getServletInfo()方法 , 是生命周期方法
* init() ; 初始化, 在对象被创建后调用
* destroy() ; servlet 在对象被销毁前调用一次
* service() ; 每次处理请求都会被调用
* Servletconfig Servletconfig() ;
* getServletInfo()方法 ; 获取Servlet()信息

  • 特性
    • 单例: 一个类只有一个对象 , 可能存在多个Servlet类;
    • Servlet类有自己写 , 对象有服务器创建,并有服务器来调用相应的方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TxT2f406-1571581411162)(https://i.imgur.com/T1OUTHv.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nNNUbCNa-1571581411163)(httpsi.imgur.comT1OUTHv.jpg)]

  • 一个ServletConfig对象对应
    ServletConfig
    *API
    * String getServletName(); 获取 中的内容
    * ServletContext getServletContext() :获取Servlet上下文对象
    * String getInitParameter(String name) ;通过指定值获得初始化的参数值
    * Enumeration getInitParenterNames():获得所有的参数的名称

相关类 Servlet相关类

void service(ServletRequest req , ServletRequest res );

Class GenericServlet类(没听懂)

HttpServlet(抽象类,http协议)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o3bJqvca-1571581411165)(httpsi.imgur.comT1OUTH.jpg)]

  • doget()和dopost()有自己覆盖调用,如果不是由自己覆盖错误405

  • web.xml

    <servlet>
        <servlet-name>HELL</servlet-name>
        <servlet-class>cn.sxs.hello</servlet-class>
        <init-param>
            <param-name>p1</param-name>
            <param-value>v1</param-value>
        </init-param>
        <init-param>
            <param-name>p2</param-name>
            <param-value>v2</param-value>
        </init-param>
    </servlet>
    

//--------------------------------------------------

<servlet>
	 <servlet-name>default</servlet-name>//默认处理
    <servlet-name>HELLO</servlet-name>
    <servlet-class>cn.sxs.hello</servlet-class>
    <init-param>
        <param-name>p1</param-name>
        <param-value>v1</param-value>
    </init-param>
    <init-param>
        <param-name>p2</param-name>
        <param-value>v2</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>HELLO</servlet-name>
	/*
	* 指定Servlet的访问路径必须以“/”开头
	*  两个url都行 
    <url-pattern>/demo</url-pattern>   
	<url-pattern>/deo</url-pattern>
	<url-pattern>/deo*</url-pattern> 
	<url-pattern>*dao</url-pattern>    
</servlet-mapping>
</servlet>	
	通配符可以放在前也可以在后不能在中

## web.xml文件继承(了解就好)
	* 

## Servlet与反射



##ServletContext概述
* ServletContext对象创建在服务器启动时创建
* 销毁同理
* 一个项目只有一个一个ServletContext对象
* 可以在 N 多个Servlet中获得唯一的对象,使用它可以给多个Servlet传递数据
*   对象的擢用在整个web应用动态资源的数据共享!!  例如在Aservlet中向ServletContext保存一个值 , 可以在Bservlet中访问
 ----
* ServletContext是javaWeb的四大域对象之一
	* Page Context;
	* ServletRequest;
	* httpSession;
	* ServletContext;
* 所有的域对象内部是一个	`Map` ,用于存储数据,一下是SevletContext对象用来操作数据的方法:
	* void setAttribute(String name , Object value);用来存储一个与的属性 , 例如servletContext.setAttribute("xx","XXX"); , 在Servlet中保存一个域属性 , 多次调用就会覆盖上一层的数据
	* Object getAttribute(string name); 获得Servlet中的数据, `String value = (String)servletContext.getAttribute("xxx")` , 获得域的value,
	* void removeAttribute(String name);用来移除ServletContext中的属性,
	* Enumeration getAttrbuteNames(); 获得所有与的属性  (Enumeration是枚举类型)
### 获取ServletContext
  在Servlet中获取ServleContext对象
	* void init(ServletConfig config)函数中
	  ` ServletContext  context = config.getServlet.Context();`

*  操作
	*  创建一个类Aservlet 继承httpServlet
	*  在doget()中操作
		*  会的ServleyContext对象
		*  调用setAttribute()方法完成保存数据
			```
			ServletContext application = this.getServletContext();
			application.setAttribute("name","张三");
	* 创建一个类Bservlet 继承httpServlet
		* 获取ServletContext对象
		* 调用getAttribute()犯法完成数据
			```
				ServletContext application = this.getServletContext();
				String name = (String)application.getAttribute("name");
				System.out.prinln(name+);
			```
		截图
		```
				[2019-10-16 04:27:18,871] Artifact Servlet1:war exploded: Deploy took 266 milliseconds
				null12
				16-Oct-2019 16:27:28.110 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory E:\pc\JDK\apache-tomcat-9.0.0.M4\webapps\manager
				16-Oct-2019 16:27:28.158 INFO [localhost-st
  • 在进入Aservet的界面的时候通过getServlt 获得内部创建ServletContetext的类,通过set方法写入一个Map域,,在进入Bservlet时get方法得到

  • 操作

    • Servlet也可以获得初始化参数(局部的),一个Servelet只能获得自己的初始化参数
    • ServletContext获的在web.xml中文件配置的应用初始化参数(获得公共的),让所有的Servlet都可用
    • Servlet也可以获得初始化参数(局部的),一个Servelet只能获得自己的初始化参数
    	// 创建一个Cservlet类继承httpServlet
    	/*获得全局的整个web.xml的配置初始化参数*/
    	ServletContext app = this.getServletContext();
        String value = app.getInitParameter("name");
        System.out.println(" 1 " +value+"  3");
    	//-------------------------------------
    	<context-param>
       	 	<param-name>name</param-name>
       	 	<param-value>value</param-value>
        </context-param>
    
    
    • web.xml文件之context-param

      name value

    该元素申明整个WEB的项目的山下文初始化
    在这里插入图片描述

  • 获得资源真实路径的方法

    • 获得动态的路径,得到的是有盘符的路径(F://),如下:
      getServletContext().getRealPath("index.jsp")
  • 获得资源流

    • 获得资源的真是路径传到资源流
    • InputStream input = this.getServletContext().getResourseAsStream(“index.jsp”)
    • 获得当前路劲下的所有资源路径
      this.getServlettext().getResourcePath("/WEB") // 返回值是Set<String>
      set<String> path = this.getServlettext().getResourcePath("/WEB")

*练习 , 访问量的统计
* 设置一个全局的静态变量 (一个所有都可以访问的域(ServletContext ));
* 最初时 ; ServletContext()中没有保存访问量的属性
* 第一次访问,创建一个变量, 设置为1 , 保存到ServletContext中 ,
* 当以后访问后冲ServetContext中获取这个变量,+1
*
* 获得Servlettext对象 , 若存在count属性, 说明不是第一次访问
* 第一次访问, 调用setAttribute()传递一个属性 ,名count 值 1
* 之后访问调用Servlettext的getAttribute()获得原来的访问量 , +1

  • 获得类路径下的资源
    • ClassLoader

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DiDwTswT-1571581411167)(httpsi.imgur.comT1OUTH3.jpg)]


  • 错别字还勿纠结

//-----------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值