什么是Servlet?
Servlet 运行在服务端的java小程序(把你写的java程序打包成字节码,发送给tomcat,让tomcat去执行),是sun公司提供的一套规范(接口)。Servlet规范里面有3个技术:
1、servlet接收响应请求
2、filter过滤器
3、listener监听器
我们知道资源分为静态资源、动态资源。动态资源——不同的用户访问得到的东西是不一样的,那如何保证其逻辑性???那就是通过java代码(这个java代码要继承servlet,才能被tomcat所识别),依赖于服务器(tomcat)才能运行。
*servlet接口中的方法:
*java动态项目的目录结构:
– 项目的根目录
– WEB-INF目录:
– web.xml:web项目的核心配置文件
– classes目录:放置字节码文件的目录
– lib目录:放置依赖的jar包
第一个Servlet程序
Text.java:
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Text implements Servlet
{
@Override
public void destroy()
{
// TODO 自动生成的方法存根
}
@Override
public ServletConfig getServletConfig()
{
// TODO 自动生成的方法存根
return null;
}
@Override
public String getServletInfo()
{
// TODO 自动生成的方法存根
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException
{
// TODO 自动生成的方法存根
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException
{
System.out.println("hello, yww");
}
}
把Text的限定名复制到Servlet-class标签里。
在web.xml中配置
运行截图
Servlet执行原理:
1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。
3. 如果有,则在找到对应的<servlet-class>全类名(看到全类名,就要想到反射机制)
4. tomcat会将字节码文件加载进内存,并且创建其对象
5. 调用其方法
Servlet中的生命周期方法:
1. 被创建:执行init方法,只执行一次
* Servlet什么时候被创建?
* 默认情况下,第一次被访问时,Servlet被创建
* 可以配置执行Servlet的创建时机(在<servlet>标签下配置)
1. 第一次被访问时,创建
* <load-on-startup>的值为负数
2. 在服务器启动时,创建
* <load-on-startup>的值为0或正整数
* Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是 单例的
* 多个用户同时访问时,可能存在线程安全问题。
* 解决:尽量不要在Servlet中定义成员变量(避免定义全局变量,在方法内部定义变量就ok)。即使定义了成员变量,也不要修改其值
2. 提供服务:执行service方法,执行多次
* 每次访问Servlet时,Service方法都会被调用一次。
3. 被销毁:执行destroy方法,只执行一次
* Servlet被销毁时执行。服务器关闭时,Servlet被销毁
* 只有服务器正常关闭时,才会执行destroy方法。
* destroy方法在Servlet被销毁之前执行,一般用于释放资源
编辑 虚拟目录
双击Tomcat服务器,然后点 模块,然后选中某个项目,点击右边的编辑,就能编辑虚拟目录了
servlet3.0
支持注解配置。可以不需要web.xml了。
步骤:
1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
2. 定义一个类,实现Servlet接口
3. 复写方法
4. 在类上使用@WebServlet注解,进行配置
@WebServlet("资源路径") 或 @WebServlet(urlPatterns = "资源路径")
urlPatterns可省略
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
@WebServlet("/First_servlet")
public class First_servlet implements Servlet{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.print("yww3.0 is coming~");
}
}
Servlet的体系结构
- GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象。将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
- HttpServlet:对http协议的一种封装,简化操作,只需要复写doGet/doPost方法
@WebServlet访问路径
1. 一个Servlet可以定义多个访问路径 : @WebServlet({"/aa","/aaa","/aaaa"})
2. 路径定义规则:
(1) /xxx:路径匹配
(2) /xxx/xxx: 多层路径,目录结构
(3) *.do:扩展名匹配