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")
- 获得动态的路径,得到的是有盘符的路径(F://),如下:
-
获得资源流
- 获得资源的真是路径传到资源流
- 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)]
- 错别字还勿纠结
//-----------------------------------------------