servlet
serv let:server服务器 applet应用(小程序)
servlet表示服务器中的小程序。
普通的Java类和servlet的区别在哪儿:
- 一个普通的Java类是不可以被访问的 只有servlet程序才可被访问。
- servlet程序必须实现一个接口(Servlet)
- Java类任何时候都可执行,servlet必须放在tomcat容器才可执行。
servlet2.5版本
- 创建JavaEE的应用(JavaSE没有前台页面)JavaEE(WEB程序 含有前端页面)
- 创建servlet并访问servlet
- 创建类
- 实现接口(servlet接口)
- 编写其中的方法 service方法表示入口方法(访问时机:所有入口的执行时机都在页面上 什么时候访问即什么时候执行)
- 在web.xml中编写访问service的路径。
Java代码
/**
* 如何让一个普通的java类变成一个servlet
* 接口是规范
* JAVAEE其中两套规范 : jsp servlet
* 规范必须有实现类: tomcat对jsp和servlet的实现
*
* 编写servlet的步骤
* 1.创建java类
* 2.必须实现一个接口 Servlet
* 3.实现接口中的方法
* 4.必须为每一个servlet至少提供一个访问入口 设置url-pattern
* 在web.xml进行配置
* <url-pattern>/hello</url-pattern> 提供访问入口
*
*/
public class DemoServlet implements Servlet {
/**
* service 服务方法:等效以前的main函数 service是当前servlet被默认执行的方法
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("2.5 servlet hello 被访问到了");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
web.xml配置
<!--
只要项目启动(tomcat启动 tomcat将程序发布出去了) tomcat默认读取我们项目中web.xml
servlet必须对外提供访问路径
<servlet> tomcat 明确 有一个特殊的程序(servlet)需要对外发布
<servlet-class>类的全限定类名 包名.类名 <rvlet-class>
<servlet-name></servlet-name> 维护两段配置的关系 随便写 只要唯一即可 input id="唯一"
<servlet-mapping> servlet的映射路径配置 mapping 映射
<url-pattern>rvlet的访问路径</url-pattern>
-->
<servlet>
<servlet-name>XXX</servlet-name>
<servlet-class>com.llz.servlet.DemoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>XXX</servlet-name>
<url-pattern>/a</url-pattern>
<url-pattern>/b</url-pattern>
<url-pattern>/c</url-pattern>
</servlet-mapping>
执行原理:
当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
查找web.xml文件,是否有对应的标签体内容。
如果有,则在找到对应的全类名
tomcat会将字节码文件加载进内存,并且创建其对象调用其方法
servlet3.0以后的版本
3.0版本支持2.5的开发
支持注解开发(注解:@单词)
注解是为了替换xml的
xml:配置清晰,配置麻烦
注解:配置简单,操作简便
(note:注解不能完全取代xml)
AnnoServlet开发
@WebServlet 用于将一个类声明为 Servlet,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为 Servlet。该注解具有下表给出的一些常用属性(以下所有属性均为可选属性,但是 vlaue 或者 urlPatterns 通常是必需的,且二者不能共存,如果同时指定,通常是忽略 value 的取值)
@WebServlet 主要属性列表
/**
* Anno注解的缩写
* 找到某个类 并且为这个类提供访问的入口
* 注解可以写的位置 : 类上 方法上 构造上 属性上
* @WebServlet(urlPatterns ="表示访问路径 可以设置多个" )
*/
//java.lang.String[] urlPatterns() default {};
@WebServlet(urlPatterns = {"/aaa" , "b"} )
public class AnnoDemoServlet implements Servlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("AnnoDemoServlet 被执行了");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
Servlet生命周期
从出生到死亡的过程
类初始化 类销毁了
servlet规范中定义类servlet的生命周期的方法
第一次执行servlet的时候 执行了两个方法 init service
第一次以后都只有service在执行
停止运行tomcat的时候 destroy 执行
init: 初始化方法 , 默认情况下 类第一次被调用的时候 执行初始化方法
service: 执行方法 , 以后每次执行当前servlet 都会执行service方法
destroy: 销毁方法 , 当服务器停止时 执行销毁方法
在整个执行的过程中servlet有且只有一个 , servlet只会被初始化一次 (这样的类 我们称之为单例对象: 这个类只被初始化一次 )
Servlet执行过程
1.浏览器请求服务器
浏览器向服务器请求时,服务器不会直接执行我们的类,而是到web.xml里寻找路径名
第一步,浏览器输入访问路径后,携带了请求行,头,体
第二步,根据访问路径找到已注册的servlet名称,既图中的demo
第三步,根据映射找到对应的servlet名
第四步,根据根据servlet名找到我们全限定类名,既我们自己写的类
2.服务器创建对象
3.调用init方法
4.调用server方法
5.响应浏览器
如果创建类 实现接口的时候没有servlet接口解决方案
Servlet体系结构
idea快捷键 选中类名ctrl+h 查看结果
实现servlet方案
1.实现servlet接口
2.继承GenericServlet
3.继承HttpServlet
注意:我们编写类继承HttpServlet以后,只需要重写doget或者dopost方法。
405异常 表示服务器的方法没有找到 -> 没有复写doget或者dopost
因为本身生命周期是service 但是由于父类处理之后 最终其实可以认为 doget和dopost变成了生命周期
public abstract class GenericServlet implements Servlet
public abstract class HttpServlet extends GenericServlet
public interface Servlet
关心的生命周期三个方法
ctrl+f12可以查看类下的方法 构造 字段
idea设置分割线
servlet细节配置
允许一个servlet配置多个路径
<servlet-mapping>
<servlet-name>Demo4Servlet</servlet-name>
<url-pattern>/demo4</url-pattern>
<url-pattern>/demo5</url-pattern>
<url-pattern>/demo6</url-pattern>
<url-pattern>/demo7</url-pattern>
</servlet-mapping>
url-pattern的书写方式 四种书写方式
1.绝对匹配(完全匹配): /xxx /a/b/c/xxx 必须一模一样 常用第一种
2.不完全匹配(目录匹配): 表示通配符 书写如下:
/a/b/c/ 只需要满足前缀就可以访问
3.后缀名匹配: *表示通配符 书写如下
*.abc *.aaa 只需要满足后缀即可访问 注意 前面没有/
4.缺省匹配: 以上三种都没有执行的情况下 执行缺省匹配 /
DefaultServlet 中间抛出了404 表示页面没有找到
tomcat自己在用
load-on-starup
默认的情况:servlet初始化的时机: 第一次访问servlet的时候执行
什么时候访问servlet什么时候初始化servlet对象
需要tomcat启动就初始化servlet对象
servlet对象是由tomcat创建的 , 只需要通知tomcat , 启动的时候 直接将servlet初始化
我们能够跟tomcat交互的地方就只有一个 web.xml
<servlet>
<servlet-name>Demo4Servlet</servlet-name>
<servlet-class>com.itllz.structural.Demo4Servlet</servlet-class>
<!--
load 加载 startup 启动 on 在xxx时候
取值: 数字 , 数字的取值 跟加载servlet顺序有关
<load-on-startup>5</load-on-startup>
<load-on-startup>3</load-on-startup>
<load-on-startup>1</load-on-startup>
多个servlet同时配置<load-on-startup>1</load-on-startup>
数字越小 加载的优先级越高
-->
<load-on-startup>5</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Demo4Servlet</servlet-name>
<url-pattern>/demo4</url-pattern>
</servlet-mapping>
servlet的访问路径
<a href="http://localhost:8080/day02/demo4">访问demo4 绝对路径访问 带协议的路径</a><br/>
<!--绝对路径访问 相对路径的另一种写些 :相对于tomcat下 -->
<a href="/day02/demo4">访问demo4 绝对路径访问 不带协议的路径</a><br/>
<!-- <url-pattern>/a/b/c/d -->
<!-- <a href="a/b/c/d"> -->
<!--相对路径的时候 不需要写/-->
<!--相对路径 找到都是web.xml中的url-pattern的配置 -->
<a href="demo4">访问demo4 相对路径(相对于项目而言)</a><br/>
总结http协议的响应:
200 :响应成功
404 :资源没有找到
500 : 服务器代码书写错误
405 :get或者post方法没有找到