## Servlet技术(重点) ##
**Servlet简介**
1.什么是Servlet:以后看javaee的文档。
* Servlet是一个接口,下面有5个方法。
* Servlet有两个实现类,GenericServlet和HttpServlet
2.Servlet作用:
* Servlet是一个小的java程序,运行在服务器端。
* Servlet接收和响应从客户端发送过来的请求,使用的HTTP的协议。
* Servlet开发中的角色:
**编写一个Servlet程序**
1.编写一个类,实现Servlet接口,重写5个方法。
2.在web.xml文件中编写Servlet配置文件(记住)
<!-- 配置Servlet的信息 -->
<servlet>
<!-- 在Servlet起名称(值是任意的) -->
<servlet-name>ServletDemo1</servlet-name>
<!-- 配置Servlet类的包名+类名(Class.forName("包名+类名")) -->
<servlet-class>cn.itcast.servlet.ServletDemo1</servlet-class>
</servlet>
<!-- 配置访问的路径 -->
<servlet-mapping>
<!-- 配置Servlet的名称(注意:servet-mapping的节点下的servlet-name必须和servlet节点下的servlet-name值是必须相同的) -->
<servlet-name>ServletDemo1</servlet-name>
<!-- 配置Servlet的访问路径(值有三种写法)想访问ServletDemo1的程序:http://localhost:80/day09/demo1 -->
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
3.把day09项目发布到服务器中,启动服务器,访问ServletDemo1的程序。
4.Servlet被访问的浏览器
Servlet的访问流程:
**Servlet生命周期(面试题)**
1.什么是生命周期:从人的角度人的出生、服务社会、死亡。
2.Servlet实例的生命周期:从Servlet实例被创建,提供服务,Servlet销毁。在生命周期提供一些方法。
3.生命周期相关的方法
* Servlet被创建之后(被服务器创建),立即调用init方法初始化Servlet init()
* 从客户端发送过来的任何请求,都会使用service方法进行处理。 service()
* Servlet从服务器中移除,调用destroy方法进行销毁的操作. destroy()
4.总结:Servlet实例被Tomcat服务器来创建,第一次访问的时候创建(在内存有一个实例(单例模式)),立即调用init方法进行初始化的操作,使用service方法对外提供服务(有一个请求,实例开启一个新线程,处理请求的内容),service有一次请求,service被调用一次。Tomcat服务器关闭或者移除项目的时候,Servlet被销毁,但是在销毁之前调用destroy方法进行一些销毁操作(释放一些资源),调用destory的方法一次。
**Servlet在Tomcat服务器怎么运行的**
**Servlet的类之间的关系**
1.Servlet接口
2.GenericServlet实现类
3.HttpServlet实现类
Servlet接口
|
GenericSerlvet (5个方法全部都重写了)
|
HttpServlet (service方法进行重写了)
|
MyServlet(相当于重写了5个方法,)
4.问题:
* 编写一个类继承GenericServlet,里面有两个init方法,重写init重写哪一个呢?
* 如果以后想要重写init方法,重写init()方法。
* 编写一个类,继承HttpServlet,重写了两个service方法,分别干嘛用?
ServletRequest(请求) ServletResponse(响应)
| |
HttpServletRquest HttpServletResponse
* HttpServlet类中有两个service方法,其中一个service的方法的内部,判断请求的方式(get和post),如果是get请求方式,默认调用doGet方法。如果post请求,默认调用doPost的方法。
* 现在在网络上就使用两种请求,一种get和post。如果编写一个类,继承HttpServelt,重写doGet和doPost方法。因为service方法默认去调用doGet或者doPost方法。开发中最简单的方式。
5.开发Servlet程序(最简单的步骤)
* 编写一个类,继承HttpServlet
* 重写两个方法doGet和doPost方法
* 在web.xml中编写配置文件
6.一般的情况下,doGet和doPost方法中的逻辑都是相同,互相调用,简化编程。
doGet和doPost方法:
servlet类之间的关系:
**修改Servlet开发的模板**
1.修改Servlet的模板,先找到MyEclipse的安装路径。
2.找到该jar包com.genuitec.eclipse.wizards.xxx.jar
3.不要解压 -- 右键 -- 用解压工具打开 -- 找templates目录 -- Servlet.java -- 修改该文件 -- 把doGet和doPost方法的注释和代码删除,在doPost方法的里面编写已经 doGet(request,response);
4.重启MyEclipse。创建Servlet程序。
**Servlet配置自动加载**
1.Servlet是第一次被访问的时候创建Servlet实例,立即调用init方法进行初始化。
2.假如:AServlet(非常销耗时间的操作),第一次访问的时候,需要等待的时间非常长。
* 可以配置Servelt自动加载来解决这一类问题。服务器一启动,自动加载Servlet加载。
* 在web.xml的配置文件中,在<servlet>标签的中间
<!-- 自动加载:服务器一启动,默认加载该类 值是正整数 ,值越小,优先级就越高。 -->
<load-on-startup>2</load-on-startup>
3.注意:值是正整数,值越小优先级越高。
**Servlet配置访问路径**
1.学会怎么配置?学会怎么来访问?优先级,谁的优先级高先访问谁。
2.在web.xml中,配置<url-pattern>,怎么来访问Servlet程序。
* <url-pattern>/servlet/demo1</url-pattern> -- 完全路径匹配 -- 访问:http://localhost/day09/servlet/demo1
* <url-pattern>/*</url-pattern> -- 目录匹配 -- 访问:http://localhost/day09/xxx
* <url-pattern>*.do或者 *.action</url-pattern> -- 扩展名 访问:http://localhost/day09/xxx.do
3.总结
* 完全路径匹配 /demo1 以/开头 访问:http://localhost/day09/demo1
* 目录匹配 /* 以/开头 访问:http://localhost/day09/xxx
* 扩展名匹配 *.do 不能以/开头 访问:http://localhost/day09/yyy.do
4.优先级(一个WEB程序中有多个Servlet程序,到底是访问哪个Servlet呢?)
* 完全路径匹配 > 目录匹配 > 扩展名匹配
servlet映射关系:
**Servlet开发中WEB阶段的路径问题**
1.学习编写路径
2.相对路径和绝对路径
* 不能以/开头
* 相对路径:当前的这个文件和比对的文件的位置关系。
* 在WEB服务器中开发相对路径的写法
* 先访问aa.html http://localhost/day09/aa.html
* 访问demo5写法 http://localhost/day09/demo5
* 在aa.html的文件中直接访问demo5
* <a href="demo5">aa</a><br/>
* <a href="./demo5">aa</a><br/>
* 先访问bb.html http://localhost/day09/bb/bb.html
* 访问demo5写法 http://localhost/day09/demo5
* 在bb.html的文件中访问demo5
* <a href="../demo5">bb</a><br/>
3.总结:相对路径的写法,需要先找这两个文件之间关系。但是如果一旦文件的位置改变了,写的相对的路径写法存在问题。解决这种问题,写绝对路径。
4.编写绝对路径
* 以/开头的
* http://localhost/day09/demo5
* 简便写法: /day09/demo5
5.在绝对路径中有分成两种
* 客户端绝对路径
* 包含项目名称 /day09/demo5
* 服务器端绝对路径
* 不包含项目名称 /demo5
客户端和服务器端绝对路径:
**ServletConfig对象**
1.和在web.xml的配置文件中相关的一个对象。
2.ServletConfig对象的方法
* String getServletName() 获取配置Servlet的名称(<servlet-name>ServletDemo5</servlet-name>)
* String getInitParameter(String name) 获取初始化参数
* Enumeration getInitParameterNames() 获取初始化参数
* ServletContext getServletContext() 获取ServletContext对象
3.总结:配置初始化参数只能针对当前的Servlet,不能在其他的Servlet程序中来获取。
ServletConfig对象:
**ServletContext对象(重要)**
**ServletContext对象的简介**
1.在javaweb的开发中,一共存在(JSP)4个域对象。在Servlet中一共存在3个域对象。
2.学习的第一个域对象。
3.ServletContext对象
* 一个WEB项目只有一个ServletContext对象
* 可以被WEB项目中的所有的Servlet所共享,可以通过ServletContext来传递数据。
* 与天地同寿。Tomcat服务器一启动,会为每一个WEB应用创建一个ServletContext对象。服务器关闭的时候ServletContext销毁。
**获取ServletContext对象**
1.可以通过ServletConfig获取ServletContext对象
2.可以直接使用该方法:ServletContext getServletContext()
**域对象**
1.域对象可以在多个Servlet中传递数据。以后需要学习JSP技术(JSP和Servlet程序之间通过域对象来传递数据)
2.可以向域对象中存入数据
* setAttribute("属性名称","值"); setAttribute("xx","123") setAttribute("xx","456")
3.可以从域对象中获取数据
* Object getAttribute("属性名称");
4.从域对象中删除属性
* removeAttribute("属性名称");
**获取ServletContext作用**
1.获取全局的初始化参数
* String getInitParameter(String name)
* Enumeration getInitParameterNames()
* 配置全局的初始化参数
2.实现数据的共享(*****)
* void setAttribute(String name, Object object) 设置属性的值
* Object getAttribute(String name) 获取属性的值
* void removeAttribute(String name) 删除属性的值
* Enumeration getAttributeNames() 获取属性的名称们
* 统计访问的次数
3.读取资源文件(*****) String path的写法
* InputStream getResourceAsStream(String path) 通过文件的路径获取文件的输入流
* String getRealPath(String path) 通过文件的路径获取文件的绝对磁盘路径
4.总结:读取资源文件path路径的写法
* 如果db放在src目录下: path = "/WEB-INF/classes/db.proterties";
* 如果db放在某个包下: path = "/WEB-INF/classes/cn/itcast/context/db.proterties";
* 如果db放在WebRoot目录下: path = "/db.proterties";
读取资源文件两种方法代码示例:
5.使用类的加载器来读取资源文件
**缺省的Servlet(了解)**
1. 在Tomcat服务器中,提供一个类。
2. 在tomcat/conf/web.xml中,配置DefaultServlet。访问的路径配置的是 <url-pattern>/</url-pattern>
3. 默认去处理静态的资源。
4. 如果自己编写的配置文件 <url-pattern>/</url-pattern> 千万不要配置成/