Servlet入门篇

Servlet: server applet

1.概念

运行在服务器端的小程序

  • Servlet就是一个接口,定义了一个Java类被浏览器访问到(Tomcat识别)的规则。
  • 将来我们就是自定义一个类,实现Servlet接口,复写方法。
    • 浏览器请求动态资源,找的就是这个继承Servlet的Java类,这个Java类依赖Web服务器软件才能运行,它没有main方法,相当于是Tomcat来执行它。Web服务器软件会创建这个类的对象,调用它复写的方法。
    • 不是任意的Java类,Tomcat都可以执行,那这个Java类肯定得遵守一定的规范,Tomcat才能执行它。
    • 在java中,接口就是用来定义规则的,这个接口就是Serlet。

2.快速入门

  1. 创建JavaEE项目
  2. 定义一个类,实现Servlet接口
    public class ServletDemo1 implements Servlet { 类体 }
  3. 实现接口中的抽象方法
  4. 配置Servlet
    在项目WEB-INF文件夹的web.xml中配置:
   <!--配置Servlet -->
   <servlet>
       <servlet-name>demo1</servlet-name>
       <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
   </servlet>
   <!--cn.itcast.web.servlet.ServletDemo1是全类名 -->
   <!--<servlet>中仅仅是对这个类的名称配置了个名字demo1 -->
   <servlet-mapping>
       <servlet-name>demo1</servlet-name>
       <url-pattern>/demo1</url-pattern>
   </servlet-mapping>
   <!--<servlet-mapping>做一个映射,demo1对应着cn.itcast.web.servlet.ServletDemo1这个类。 -->
   <!--这个类将来能被哪个路径访问到,<url-pattern>中就写着一个资源路径/demo1。 -->

补充小知识点

  • run->Edit Configuration->Deployment->Application context中的’/‘改成:’/+项目名’.
    • 那url是:localhost:8080/day13_tomcat/demo1,才能访问到,将来会以每个项目名称作为虚拟目录(day13_tomcat).
    • 如果虚拟目录是’/’,那浏览器访问时,url不加项目名称,可以直接访问.
    • 但如果后期项目多了,你每一个都设置为’/’,那肯定不合适.所以一般是’/’+项目名称.

分析:

  1. localhost:8080找到Tomcat.
  2. /day13_tomcat找到Tomcat下部署的项目,(虚拟目录可以找到项目).
  3. /demo1,其中的demo1是资源名称,把java类映射成资源路径,Tomcat内部检索,找web.xml,有没有<url-patturn>是/demo1,找到了之后.
  4. 接着找跟它一对的demo1,相当于找到下的demo1,进而找到全类名.
  5. 找到全类名后,进行反射机制操作,调用继承Servlet类的重写方法servlet.
  • 全类名的反射过程
    • 1.tomcat将全类名对应的字节码文件加载进内存.Class.forName();
    • 2.创建对象,cls.newInstance();
    • 3.调用方法–service();

3.执行原理

  1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
  2. 查找web.xml文件,是否有对应的标签体内容(与资源路径一致)。
  3. 如果有,则在找到对应的全类名
  4. tomcat会将字节码文件加载进内存,并且创建其对象
  5. 调用其方法
  • 服务器处理浏览器的请求过程(个人概括):
    服务器获取浏览器请求的url,解析url,获取资源路径;然后Tomcat在web.xml里找到与该资源路径对应的全类名;接着将全类名的字节码文件加载进内存,然后创建继承Servlet接口的对象;最后调用service()方法。

Servlet的5个方法

  • init、getServletConfig、service、getServletInfo、destroy;

4.Servlet中的生命周期方法

(要分清servlet与三个方法的关系,不能混淆了。servlet是接口,那三个是接口中的方法。)

  1. 被创建:执行init方法,只执行一次
  • Servlet什么时候被创建?
    • 默认情况下,第一次被访问时,Servlet被创建
    • 可以配置执行Servlet的创建时机。

<servlet>标签下配置

  1. 第一次被访问时,创建
    <load-on-startup>的值为负数
  2. 在服务器启动时,创建
    <load-on-startup>的值为0或正整数

Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的

  • 多个用户同时访问时,可能存在线程安全问题。
  • 解决:尽量不要在Servlet中定义成员变量。
    • 即使定义了成员变量,也不要对修改值。
    • 或者变量放在局部变量里。
  1. 提供服务:执行service方法,执行多次
  • 每次访问Servlet时,Service方法都会被调用一次。
  1. 被销毁:执行destroy方法,只执行一次
  • 只有服务器正常关闭时,才会执行destroy方法。
  • 提个问题,destroy方法执行的时机是在销毁servlet之前,还是之后?
    • destroy方法在Servlet被销毁之前执行,一般用于释放资源.

个人小结:

  • Servlet什么时候被创建?
    • 默认情况下,第一次被访问时,Servlet被创建;
    • 通过配置,第一次被访问时创建,或者在服务器启动时创建。
  • Servlet什么时候被调用?
    • 每次访问Servlet时,Service方法都会被调用一次。
  • Servlet什么时候被销毁?
    • 服务器关闭时,Servlet被销毁。

5.Servlet3.0

  • 好处:

    • 支持注解配置。可以不需要web.xml了。
  • 步骤:

  1. 创建JavaEE项目,
    File->new->Module-> Java Enterprise->JavaEE 7->在勾选web Application的时候,选择Servlet的版本3.0以上,可以不创建web.xml
  2. 定义一个类,实现Servlet接口
  3. 复写方法
  4. 在继承Servlet接口的类上使用@WebServlet注解,进行配置
  • @WebServlet("urlPatterns = “资源路径”)
    WebServlet源码:
	@Target({ElementType.TYPE})
	@Retention(RetentionPolicy.RUNTIME)
	@Documented
	public @interface WebServlet {
	    String name() default "";//相当于<Servlet-name>
	
	    String[] value() default {};//代表urlPatterns()属性配置
	
	    String[] urlPatterns() default {};//相当于<url-pattern>
	
	    int loadOnStartup() default -1;//相当于<load-on-startup>
	
	    WebInitParam[] initParams() default {};
	
	    boolean asyncSupported() default false;
	
	    String smallIcon() default "";
	
	    String largeIcon() default "";
	
	    String description() default "";
	
	    String displayName() default "";
	}

6.IDEA与tomcat的相关配置

  1. IDEA会为每一个tomcat部署的项目单独建立一份配置文件
  • 查看控制台的log:Using CATALINA_BASE:
    “C:\Users\fqy.IntelliJIdea2018.1\system\tomcat_itcast”
  1. 工作空间项目 和 tomcat部署的web项目
  • 工作空间项目–>D:\IdeaProjects\day13_tomcat\out\artifacts\day13_tomcat_war_exploded
  • tomcat部署的web项目–>D:\IdeaProjects\day13_tomcat\web
    • tomcat真正访问的是“tomcat部署的web项目”,
    • “tomcat部署的web项目"对应着"工作空间项目” 的web目录下的所有资源
  1. 断点调试:使用"小虫子"启动 dubug 启动(debug Tomcat)

小知识点:

  • WEB-INF目录下的资源不能被浏览器直接访问。
  • src下的java文件将来被编译成之后,它会放到WEB-INF目录下的class目录下.

全部评论

相关推荐

点赞 评论 收藏
分享
10-24 13:36
门头沟学院 Java
Zzzzoooo:更新:今天下午有hr联系我去不去客户端,拒了
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务