servlet init方法获取服务器的信息,01Servlet

1.Servlet概念

1.1 servlet的特点

1)sevlet是一个普通的java类,继承HttpServlet类。

2)其实实现了Servlet接口的java类,才是一个Servlet类。

3)servlet程序需要交给tomcat服务器运行!

2.Servlet执行过程

浏览器:http://localhost:8080/day09Servlet/HelloServlet

2.1 步骤

前提: tomcat服务器启动时会把每个网站的web.xml文件加载进内存。

1)在浏览器输入;http://localhost:8080/day09Servlet/HelloServlet

2)  截取URL的字符串,得到需要访问的资源名称:/HelloServlet

3)在day09网站下的web.xml信息中搜索是否存在 /HelloServlet匹配的url-pattern。

4)匹配到对应的url-pattern之后,取出当前映射信息中的servlet-name的名称,然后在web.xml信息中搜索是否存在一个相同名称的servlet-name的servlet配置信息。

5)找到对应的servlet配置信息之后,取出当前配置信息的servlet-class的内容

字符串: day09Servlet.cn.jxufe.chapter01.HelloServlet

6)创建HelloServlet对象,然后调用HelloServlet类中的方法。

7)Servlet就把内容返回给浏览器用户。

3.映射路径

HelloServlet

/hello

url-pattern                     浏览器访问

精确匹配           /hello                          http://localhost:8080/day09/hello

/itcast/hello                                                    http://localhost:8080/day09/itcast/hello

模糊匹配

/*                              http://localhost:8080/day09/任意路径

/itcast/*                             http://localhost:8080/day09/itcast/任意路径

*.后缀名                             http://localhost:8080/day09/任意路径.后缀名

(*.action

*.do

*.html

。。。

)

注意:

1)要么以斜杠开头,要么*号开头                       itcast>

非法的url-pattern: /itcast/*.html

2) 当多个url-pattern同时被匹配的情况下

2.1  精确匹配优先(长的最像的那个优先被匹配)

2.2  以后缀名结尾的url-pattern的优先级最低的

4.缺省路径

4.1 什么是缺省路径

在tomcat服务器内部配置了一个缺省路径 /, 这个缺省路径在tomcat服务器内部被一个缺省Servlet(DefaultServlet)匹配。缺省的这个Servlet的作用是专门用于处理所有网站中的静态网页。

浏览器: http://localhost:8080/day09/hello.html

一个路径在tomcat服务器的执行过程:

1)搜索day09下面的web.xml文件信息。搜索是否存在匹配的

2)匹配到对应的url-pattern,执行对应的Servlet程序。

3)如果没有匹配的url-pattern,就把这个请求交给tomcat服务器的DefaultServlet处理。

4)DefaultServlet会在day09的根目录下搜索是否存在一个名称叫hello.html的文件。

5)如果找到次文件, 那么DefaultServlet读取该文件内容返回给用户。

6)如果找不到次文件, 那么就给用户返回一个404状态码+404错误页面。

结论: 先找动态网页,再找静态网页。

5.Sevlet的生命周期(重点)

5.1 概念

研究servlet的生命周期,就是研究servlet这个在什么时候创建对象,在什么时候调用什么方法,在什么时候销毁对象。

以前: new Student();

现在:  servlet是由tomcat服务器执行的生命周期。

5.2 Sevlet的四个重要的生命周期方法

构造方法: 创建servlet对象时调用,只调用1次,证明了sevlet是单例的。

init方法: 创建完对象之后调用。只调用1次。该方法用于初始化对象。

service方法: 在每次请求时调用,调用n次。该方法入口方法,我们的逻辑代码在这里被调用。

destory方法:在servlet对象销毁之后调用。只调用1次。重新部署网站或者停止服务器,servlet对象就会销毁了。

5.3 用伪代码演示tomcat服务器如何调用四个方法

字符串: gz.itcast.a_servlet.HelloServlet

1)通过反射,创建HelloServlet的对象

1.1 得到HelloServlet的CLass对象

Class clazz = Class.forName("gz.itcast.a_servlet.HelloServlet ")

1.2 通过class对象调用构造方法

Object obj  =  clazz.newInstance();  调用无参的构造方法。 --1)构造方法被调用

2)通过反射,调用init方法

2.1 得到init方法对象

Method m = clazz.getDeclaraeMethod("init",ServletConfig.class);

2.2 调用方法

m.invoke(obj,config);  -2)init方法被调用

3)通过反射,调用service方法

3.1 得到service方法对象

Method m = clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);

3.2 调用方法

m.invoke(obj,request,response);        --3)service方法被调用

4)通过反射,调用destroy方法

4.1 得到destroy方法对象

Method m= clazz.getDeclareMethod('destroy",null);

4.2调用方法

m.invoke(obj,null);               --4)destroy方法被调用

packageday09Servlet.cn.jxufe.c_life;importjava.io.IOException;importjavax.enterprise.context.Destroyed;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;public class LifeDemo1 extendsHttpServlet {/** 1)构造方法。servlet对象创建时调用的*/

publicLifeDemo1() {//TODO Auto-generated constructor stub

System.out.println("servlet对象被创建了");

}/** 2)初始化方法*/@Overridepublic void init() throwsServletException {//TODO Auto-generated method stub

System.out.println("init方法被调用");

}/** 3)服务方法*/@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {//TODO Auto-generated method stub

System.out.println("service方法被调用");

}/** 4)销毁方法。sevlet对象销毁时调用的*/@Overridepublic voiddestroy() {//TODO Auto-generated method stub

System.out.println("servlet对象被销毁了");

}

}

6.Servlet的线程并发问题

6.1 引入

servlet在tomcat服务器中,是单实例多线程的

6.2 开发线程安全的servlet建议

1)尽量不要使用成员变量,或者静态成员变量。

2)必须要使用成员变量,要么给使用了成员变量的代码块加同步锁,加锁的代码块的范围尽量缩小,因为有可能影响程序并发效率。

packageday09Servlet.cn.jxufe.d_thread;/** servlet的多线程并发问题*/

importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;public class ThreadDemo extendsHttpServlet {publicThreadDemo() {

System.out.println("TheadDemo对象创建了");

}//成员变量,那么该数据就可能被不同用户线程共享到。有可能引发多线程并发问题。

static int count = 1;public void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {

response.setContentType("text/html;charset=utf-8");/*** 1)同步代码块

* 给使用到共享数据的代码块添加同步锁

* 注意:同步锁必须多个线程唯一的*/

synchronized (ThreadDemo.class) {

response.getWriter().write("你当前是第" + count + "个访客!"); //A线程刚刚执行完这句代码,被B线程抢去了执行时机。//睡眠

/*try {

Thread.sleep(10000);

} catch (InterruptedException e) {

e.printStackTrace();

}*/count++;

}

}/*** 2 )同步方法

*@paramresponse*/

/*public synchronized static void method(HttpServletResponse response){

try {

response.getWriter().write("你当前是第"+count+"个访客!");

} catch (IOException e1) {

e1.printStackTrace();

} // A线程刚刚执行完这句代码,被B线程抢去了执行时机。

//睡眠

try {

Thread.sleep(10000);

} catch (InterruptedException e) {

e.printStackTrace();

}

count++;

}*/}

7.Servlet的自动加载机制

7.1 引入

默认情况servlet对象是在第一次访问的时候创建。如果在这个servlet的构造方法或者init方法执行比较多的逻辑,那么第一次访问servlet的用户体验就不好!

那么能不能改变创建servlet的机制?  可以的,可以让servlet在服务器启动的时候自动加载。

LifeDemo

gz.itcast.c_life.LifeDemo

1

注意:load-on-startup中的整数值越大,创建的优先级越低!!!

8.Servlet的init方法

8.1 两个init方法作用

init(ServletConfig) 这个有参数的init方法的作用就是Servlet的其中一个重要的生命周期方法。这个方法一定会被tomcat服务器调用。

init(): 这个无参的init方法的作用就是为了提供给开发者方便去覆盖,覆盖这个方法,可以在此方法编写初始化的逻辑。这个方法才是真的给开发者做初始化逻辑的方法。

小结:

Servlet开发中涉及的对象:

HttpservletRequest对象: 请求对象

HttpServletResponse对象: 响应对象

ServletConfig对象: servlet配置对象

ServletContext对象: servlet的上下文对象

9.ServletConfig对象

9.1 引入

servletconfig是配置对象,主要把servlet的初始化参数封装到这个对象中。一个网站中可能会存在多个ServletConfig对象,一个ServletConfig对象就封装了一个servlet的配置信息。

9.2 配置初始化参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值