写一个入门需求:
在IDEA编写Servlet,发布到Tomcat. 在浏览器输入路径请求, 控制台打印Hello…
步骤:
1.导入jar包:
2.新建一个类实现Servlet接口,并重写方法
3.web.xml里面配置Servlet的映射地址/在类上面添加@WebServlet(“访问路径”)
代码
web.xml方式:
访问地址:http://localhost:8080/day08_01_web_war_exploded/demo1
public class ServletDemo1 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//使用响应将数据响应给浏览器
System.out.println("Hello...");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--配置ServletDemo1的映射地址-->
<servlet>
<!--任意名字,建议是类名首字母改小写-->
<servlet-name>servletDemo1</servlet-name>
<!--Servlet这个类的全限定名-->
<servlet-class>com.gavin.servlet.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<!--必须和Servlet标签下的servlet-name标签符名字一样-->
<servlet-name>servletDemo1</servlet-name>
<!--配置访问路径-->
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
</web-app>
注解方式:
访问地址:http://localhost:8080/day08_01_web_war_exploded/demo2
@WebServlet("/demo2")
public class ServletDemo2 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
//服务方法:处理请求的
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello...");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
servlet路径原理
Servlet路径的配置url-pattern
url-pattern配置方式共有三种:
• 完全路径匹配: 以 / 开始.
注意:访问的路径不能多一个字母也不能少一个字母
o 例如:配置了/demo1 请求的时候必须是:/demo1
• 目录匹配"以 / 开始需要以 * 结束.
注意:Servlet里面用的不多,但是过滤器里面通常就使用目录匹配
o 配置:/* 访问:/a /b /asdc;配置/aa/* 访问:/aa/a /aa/b /aa/abc
• 扩展名匹配不能以 / 开始, 以 * 开始的 .
正确的写法:.action 访问:a.action b.action 错误写法:/.do *.jsp *.html
注意:
- 一个路径只能对应一个Servlet,但是一个Servlet可以有多个路径
- tomcat获得匹配路径时,优先级顺序:完全路径匹配>目录匹配>扩展名匹配
servlet路径解析原理
servlet原理和体系
servlet的体系:
根接口api:servlet(里面有init(),destory(),service()等定义好的方法,service()方法有request,response参数)
实现类api:HttpServlet
(实现了servlet并实现了方法,其中在service()方法里使用request对象处理好了不同请求方式的逻辑,!!!@并写了doGet(),doPost()等请求方式的方法,但是是空的,需要子类去覆盖重写,什么请求方式在什么方法里写处理!!!@这就是我们需要写的内容)
Request,Response的体系
根接口api:ServletRequest
接口api:HttpServletRequest(里面写好了http传进来的参数!!!流的各种处理方法,这里封装了http协议)
实现类:RequestFacade(由Tomcat定义的实现类)
根接口:ServletResponse
接口:HttpServletResponse
实现类:ResponseFacade
整个访问流程(servlet生命周期)
首先:http格式的请求数据流进入tomcat
然后:tomcat使用req把http请求流给拆了封装好成方法,留着后面用哪个数据直接方法获取。(tomcat创建实现类RequestFacade,和他的对象,把请求流数据处理好)
然后:tomcat创建实现类HttpServlet的对象,调用init()方法初始化对象,完成一些加载配置文件,创建连接等初始化工作,init()方法只调用一次。
然后外部每一次url请求,就会调用service()方法,并把上面处理好的req对象传进来。(获取http传过来的数据做我们想做的处理)
最后,需要释放内存或tomcat关闭时,Tomcat调用destory()方法完成资源释放,destory()方法调用了之后,容器会释放service实例(所有req,resp,servlet的对象一起没了,然后对象会被java的垃圾收集器收回)
总结注意点:
1Servlet对象是有服务器创建(反射)
2) request与response对象也是由tomcat服务器创建,对象的类也是服务器创建。
3) service()方法也是服务器调用的
4)来了第一次请求, 会调用init()方法进行初始化(只调用这一次);任何一次请求 都会调用service()方法处理这个请求;服务器正常关闭或者项目从服务器移除, 调用destory()方法进行销毁(只调用这一次)
5)Servlet对象默认第一次请求进来时候创建;如果想让Servlet提前创建(服务器启动的时候), 这个时候就可以使用启动项
1