Servlet是一个服务器的小程序。
作用:处理相关的业务逻辑
特点:
Servlet的执行:只需要访问对应的URL路径即可
Servlet就是一个普通的java类,
Servlet的java类继承了HttpServlet->GenericServlet->Servlet(接口)
这个Servlet执行的是doGet方法---(处理get请求的)
Servlet没有main方法,没有junit测试方法,由服务器调用
Servlet是如何执行的呢?如何访问对应URL路径,就能执行对应的Servlet
一定是被服务器(tomcat)执行。
在web.xml中发现:
<servlet>
<servlet-name>HelloWorldExample</servlet-name>
<servlet-class>HelloWorldExample</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldExample</servlet-name> 、
<url-pattern>/servlets/servlet/HelloWorldExample</url-pattern>
</servlet-mapping>猜测,url-pattern就是 执行Servlet的路径
servlet-class 是字节码文件位置。 反射调用
2.eclipse中创建Servlet时的注意事项:
注意: ①方法的修饰符改为public
②web.xml中不要出现注释,否则要么注释消失,要么配置都出现在注释中
2.1、如何从请求中提取表单数据
Post方式如何对应Servlet?
doPost专门处理post请求
doGet专门处理get请求
get方式:参数列表 请求行上
post方式:参数列表 请求体上
http请求信息-http响应信息传递时是使用 二进制数据
服务器可以将http请求信息 二进制数据获取到(字节流),
封装成对象。
请求信息全部被封装成了request对象。
Request对象方法
request.getParameter(String 参数名); 返回一个String的参数值。
解析字节流,返回对应的字符串
注意:如果找不到对应参数值,返回null
2.2生命周期
创建:一般是第一次访问时创建实例对象(特殊:设置了预加载标签,会在服务器启动时创建实例);
init()调用一次
工作:每次调用Service方法一次。
销毁:服务器关闭时销毁
调用用一次destroy()方法
Servlet在内存中单例形式存在,其会对ServeltContext对象 调用instanceof servlet的全类名查看是否是其的对象,是就直接调用,否就创建一个新的。
2.3url-pattern:就是某个Servlet的访问路径
url-pattern三种写法:
完全匹配:必须以”/”,路径完全相等才能正常匹配
例如:url-pattern = /hehe
访问路径必须为:http://域名:端口号/项目名/hehe
/就可以理解为当前项目
注意:/如果忽略,会报异常,LifecycleException
目录匹配:必须以”/”开头, 最后必须以”*”结尾。
只要路径名等于目录名,就可以正常匹配
例如:url-pattern = /hehe/*
访问路径必须为:http://域名:端口号/项目名/hehe/任意字符
注意:/如果忽略,会报异常,LifecycleException
如果*号忽略,就变成了完全匹配
扩展名匹配: 必须以*开头,后面以对应的扩展名结束
只要路径名和 扩展名一致,就可以正常匹配
例如:url-pattern = *.hehe
访问路径必须为:http://域名:端口号/项目名/任意字符.hehe
注意:如果加入/,会报异常,LifecycleException
一个Servlet可以设置多个url-pattern么?
可以。无上限
以上三种匹配方式有一个优先级顺序的:
任意一个请求路径,最终会进行如下的匹配
If(完全匹配){
//进行完全匹配
}else if(目录匹配){
//进行目录匹配
}else if(扩展名匹配){
//进行扩展名匹配
}else{
//缺省/默认Servlet的匹配
}
以上任意一种匹配方式,都会先匹配本项目内部的,再匹配tomcat的web.xml
If(本项目web.xml){
//本项目
}else{
//tomcat的web.xml
}
tomcat缺省Servlet:
1、首先尝试根据请求路径 能在发布目录中 获取对应的资源文件。 (IO流)
2 、就会把对应资源文件以流的形式写入到响应体中。发送给浏览器
如果根据请求路径,获取不到对应的资源文件,直接抛出IOException给服务器,服务器就会写异常信息给浏览器看
缺省Servlet作用:就是用来读取对应的资源文件,发送给浏览器浏览
2.4路径相关问题
建议使用绝对路径。如果不需要跳转外网,两种绝对路径都可以,如果要跳转外网资源,只能使用带协议的绝对路径。
客户端的路径:
请求路径是从客户端(浏览器)发出的
相对路径:引入者和资源在同一目录下
问题:引入者位置改变,代码就需要变
绝对路径:
带协议的绝对路径:外网和内网
不带协议的绝对路径:内网
只要资源位置不动,代码就不用变
建议使用绝对路径。如果不需要跳转外网,两种绝对路径都可以,如果要跳转外网资源,只能使用带协议的绝对路径。
服务器端的路径:(请求转发会用到)
请求路径是从服务器端内部发出的
2.5servlet体系结构树状图
顶层:Servlet接口
规范。
作用:Servlet接口规定了,只有实现了该接口中的所有方法,才能是一个基本的Servlet
Servlet在内存中只有一个实例对象。单例
Servlet接口中,定义了Servlet生命周期的相关方法
Init(): 初始化方法。 一般是Servlet第一次访问的时候(特殊:服务器启动时),服务器反射实例化对应Servlet,实例化完成后,调用init方法
Service(): 每次访问时都会调用该方法一次。(不论是get还是post)
Destroy(): 服务器关闭时,销毁实例对象,销毁实例对象时才会调用该方法一次
如果每次书写Servlet都去实现servlet接口,实现会特别麻烦,因为我只关注service方法。
抽象类:
GenericServlet 通用的Servlet
这个通用的Servlet将其他方法都进行了简单实现,只为我预留了Service方法。
只需要继承这个抽象类,重写servcie方法即可。
浏览器和服务器之间进行信息传递,使用http协议。
Get请求、post请求
GenericServlet是无法为我区分http协议内容。
抽象类:
HttpServlet 专门用来处理 http协议的Servlet
重写了Service方法,对http协议进行了处理。
以后就会使用HttpServlet的子类作为Servlet使用。
2.6servlet预加载解决第一次访问速度缓慢问题
某个Servlet代码量非常大,实例化速度就会越慢。
一般情况下,Servlet会在第一次访问时才加载实例化。
需求:需要让Servlet实例化过程提前。
<Servlet>的标签下,有一个子标签<load-on-startup>标签。是预加载标签。
当服务器启动时,加载并实例化对应的Servlet
其中<load-on-startup>标签中,必须填写的是正整数。 大于0
整数越小,优先级越高。
注意:尽量填写的Servlet的加载优先级,在3或者3以后
只要对应的Servlet加入该标签,Servlet就会在服务器启动时加载实例化