01_Servlet的概述&入门案例
Servlet
是Java所提供的一门用于开发动态WEB资源的技术,也是JavaEE的规范之一 Servlet 和 jsp规范
(server applet) 是运行在web服务器上的一个小型的java程序
主要是用来接收和响应从浏览器发送过来的请求
他也是一个规范,写一个Servlet,其实就是写一个Servlet接口的实现类
开发步骤
1,创建一个WEB项目
2,在WEB项目中创建一个类,让该类去实现Servlet接口(继承Servlet接口的实现类)
3,在web.xml文件中进行相关的配置
DemoServlet
com.heima.servlet.DemoServlet
DemoServlet
/DemoServlet
4,发布WEB项目至WEB服务器
Service方法
访问Servlet的时候就会调用这个方法,执行这个方法,我们就可以处理一些请求和响应
02_Servlet的执行过程
http://localhost:8080/web06_01/hello url 统一资源定位符
http://主机名或者ip地址:端口号/项目名/资源名
通过主机名或者ip地址能够找到互联网上一台电脑
通过端口号:找到其中运行的web服务器
通过项目名:可以找到webapps下面的一个确定项目
通过资源名:可以找打一个具体的文件,或者是映射的虚拟的资源名
http://localhost:8080/Test/login.html 这个找的是具体的文件
http://localhost:8080/web06_01/hello 这个找的是虚拟的资源名
如果是虚拟的资源名,可以去web.xml下面找相应的映射,根据资源名找到处理这个资源的Servlet名字,
根据这个Servlet名字查找对应类的全路径,使用反射加载Servlet的实现类,调用其中的Service方法进行响应
03_Servlet的体系结构
Servlet
----接口
|
|
GenericServlet
---通用的Servlet,跟协议无关的Servlet
|
|
HTTPServlet
---跟http协议有关的Servlet,处理http请求的(实际开发)
04_使用Eclipse创建Servlet
本质:继承Servlet接口,重写了Service方法,在Service方法中根据请求方式的不同,调用doXXX的方法
步骤:
1,右键新建一个Servlet
2,创建好之后也不需要在web.xml中进行配置(已经帮你配置好了)
3,重写doget和dopost方法,然后让两个方法相互调用一下
05_Servlet的生命周期
指的是Servlet对象从创建到销毁这个过程
出生
第一次访问Servlet时由WEB服务器创建对象
第一次访问Servlet时进行初始化,并调用方法init()
活着
每次访问Servlet都会调用他的service方法
死亡
当WEB服务器关闭的时候会销毁Servlet的对象
当WEB服务器关闭的时候会调用destory()方法
面试标准答法:
当第一次访问Servlet的时候,服务器会创建Servlet实例,init方法就会调用
任何一次请求服务器,服务器就会创建一个新的线程执行Servlet里面的Service方法
在Service方法里面,根据请求方式的不同执行不同的doXXX方法,
当服务器关闭的时候,会销毁Servlet对象,这个时候destroy()方法就会被调用
06_Servlet的线程安全问题
如果有多个客户端并发的访问同一个Servlet,WEB服务器会为每一个客户端的请求创建一个线程,在线程中调用Servlet的service方法,
如果多个线程并发的访问同样的数据,那这个时候就有可能会出现线程的安全问题
解决方案
把有可能会出现问题的代码扔到同步代码块里面
让Servlet去实现一个接口,SingleThreadModel
尽量减少使用成员变量
07_Servlet的一些配置细节
servlet-mapping
除了可以配置资源名称,也可以进行路径的配置,而且路径可以有多层
同一个Servlet我们可以配置多个映射路径
配置Servlet映射路径时可以使用通配符(*),使用通配符只有两种格式
格式1
*.扩展名,比如*.do
不能以正斜杠开头
格式2
可以使用正斜杠开头,也需要使用"/*"来结尾
不能在*后面加上扩展名
load-on-startup
tomcat启动的时候直接创建Servlet的对象
如果初始化的时候你做了一些耗时的操作,那么第一访问的时候就很慢,可以解决这个问题
传一个正整数,越小优先级越高
总结:
完全路径匹配
比如: /hello /aaa/bb.html
特点:以/开始
目录匹配(路径匹配)
比如: /* /aaa/* /aaa/bb/*
特点:以/开头,以*结尾
扩展名匹配
比如:*.do *.action
特点:不能以/开头
优先级
完全路径匹配 > 目录匹配 > 扩展名匹配
08_ServletConfig的概述和测试
ServletConfig对象
获取方式:
一,通过init方法获取,他会作为参数传进来
二,通过getServletConfig()方法 (推荐)
对象方法
String getInitParameter(String name) 获取Servlet指定的初始化参数
Enumeration getInitParameterNames() 获取Servlet所有的初始化参数的名称
ServletContext getServletContext() 获取ServletContext对象
String getServletName()
获取Servlet的名称
注意:
ServletConfig只能获取当前Servlet初始化参数
09_ServletContext概述&获取WEB应用的初始化参
WEB服务器启动的时候,会为每一个WEB应用程序创建一个对应的ServletContext对象,
他代表了当前的WEB应用,也称之为是WEB应用的上下文
获取方式:
通过getServletConfig().getServletContext()方法
通过getServletContext()方法 (推荐)
作用一
获取WEB应用的初始化参数
10_ServletContext实现数据的共享
作用二
作为域对象存储数据,可以供多个Servlet共享
域对象:这个对象存的数据有一定的范围
ServletContext域对象作用于整个web应用
Object getAttribute(String name)
向ServletContext获取数据
void setAttribute(String name, Object object)
向ServletContext设置数据
void removeAttribute(String name)
向ServletContext移除数据
11_ServletContext的其他功能
作用三
获取当前WEB应用的绝对路径
举例:
//获取当前WEB应用的绝对路径
String path = context.getRealPath("/"); "/" 表示项目的跟路径
作用四
实现转发和包含
举例:
//获取请求分发器
RequestDispatcher rd = context.getRequestDispatcher("/ContextDemo2");
//转发
rd.forward(request, response);
//包含
rd.include(request, response);
转发
将请求转发给另外一个WEB资源,可以是Servlet,JSP,HTML
只能转发到内部资源
共享请求和响应对象
地址栏中的路径不会发生变化
在转发之后响应的内容会被取消 *****
包含
用于在响应中包含其他的WEB资源
只能转发到内部资源
共享请求和响应对象
地址栏中的路径不会发生变化
包含前后可以继续的响应其他内容 ******
注意点: 转发和包含只能在当前项目里面
12_JavaWeb开发中常用的路径
绝对路径
物理路径,在磁盘中的路径,以盘符开头
比如 D:\java\apache-tomcat-7.0.65\webapps\myServlet
相对路径
不以盘符开头,相对于某个路径
不以正斜杠开头
直接写路径和资源名称,相对于当前路径,和当前WEB资源在同一个路径下
以正斜杠开头
服务器端
Servlet映射路径,转发路径和包含路径
正斜杠代表的当前WEB应用的根路径
客户端
a,img,form
正斜杠代表的WEB服务器的根路径,如果我们要访问某个应用下的WEB自已,需要手动的加上应用的名称
总结:
建议使用"/"开头的路径
服务器端路径:(web.xml,转发,包含)
/资源路径
客户端路径:(超链接,from表单,location.href,img标签的src属性)
/项目名/资源路径