servlet在web应用中的过程

1 如何开发一个Servlet

1.1 步骤:

1)编写java类,继承HttpServlet

2)重新doGetdoPost方法

3Servlet程序交给tomcat服务器运行!!

1.2 servlet程序的class码拷贝到WEB-INF/classes目录

1.3 web.xml文件中进行配置

2 Servlet的映射路径

当浏览器向服务器发送一个请求时,会根据请求的URL地址在web.xml文件中找到url-pattern,如果找到匹配的url-pattern,则使用当前servlet-name的名称到web.xml文件中查询是否相同名称的servlet配置。如果找到,则取出对应的servlet配置信息中的servlet-class内容。那么怎么获取Servlet对象呢?此时会通过反射技术,即Class c=class.forName(路径)得到相应的Class,然后通过c.newInstance()获得实例对象。那么怎么调用实例对象的service方法呢?可以通过Method method=c.getMethod("service",ServletRequest.class,ServletResponse.class),然后可以通过method.invoke()完成对该方法的调用。以上过程都是Tomcat帮助我们做的,不用我们来实现。

注意:

1url-pattern要么以 / 开头,要么以*开头。例如, itcast是非法路径。

2)不能同时使用两种模糊匹配,例如 /itcast/*.do是非法路径

3)当有输入的URL有多个servlet同时被匹配的情况下:

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

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

3 servlet缺省路径

servlet的缺省路径(<url-pattern>/</url-pattern>)是在tomcat服务器内置的一个路径。该路径对应的是一个DefaultServlet(缺省Servlet)。这个缺省的Servlet的作用是用于解析web应用的静态资源文件


问题: URL输入http://localhost:8080/day10/index.html 如何读取文件????

1)到当前day10应用下的web.xml文件查找是否有匹配的url-pattern

2)如果没有匹配的url-pattern,则交给tomcat的内置的DefaultServlet处理

3DefaultServlet程序到day10应用的根目录下查找是存在一个名称为index.html的静态文件。

4)如果找到该文件,则读取该文件内容,返回给浏览器。

5)如果找不到该文件,则返回404错误页面。

 

结论: 先找动态资源,再找静态资源。

4 Sevlet的生命周期(重点)

Servlet程序的生命周期由tomcat服务器控制的!!!!

4.1 Servlet重要的四个生命周期方法


构造方法: 创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建servlet对象。只调用1次。证明servlet对象在tomcat是单实例的。

init方法: 创建完servlet对象的时候调用。只调用1次。

service方法: 每次发出请求时调用。调用n次。

destroy方法: 销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象。

只调用1次。

4.2 伪代码演示servlet的生命周期
Tomtcat内部代码运行:
1)通过映射找到到servlet-class的内容,字符串: gz.itcast.a_servlet.FirstServlet
2)通过反射构造FirstServlet对象
2.1 得到字节码对象
Class clazz = class.forName("gz.itcast.a_servlet.FirstServlet");
2.2 调用无参数的构造方法来构造对象
Object obj = clazz.newInstance();     ---1.servlet的构造方法被调用
3)创建ServletConfig对象,通过反射调用init方法
3.1 得到方法对象
Method m = clazz.getDeclareMethod("init",ServletConfig.class);
3.2 调用方法
m.invoke(obj,config);             --2.servlet的init方法被调用
4)创建request,response对象,通过反射调用service方法
4.1 得到方法对象
Methodm m =clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);
4.2 调用方法
m.invoke(obj,request,response);  --3.servlet的service方法被调用
5)当tomcat服务器停止或web应用重新部署,通过反射调用destroy方法
5.1 得到方法对象
Method m = clazz.getDeclareMethod("destroy",null);
5.2 调用方法
m.invoke(obj,null);            --4.servlet的destroy方法被调用


5 servlet线程安全问题

注意: servlet对象在tomcat服务器是单实例多线程的。

 

因为servlet是多线程的,所以当多个servlet的线程同时访问了servlet的共享数据,如成员变量,可能会引发线程安全问题。

 

解决办法:

1)把使用到共享数据的代码块进行同步(使用synchronized关键字进行同步)

2)建议在servlet类中尽量不要使用成员变量。如果确实要使用成员,必须同步。而且尽量缩小同步代码块的范围。(哪里使用到了成员变量,就同步哪里!!),以避免因为同步而导致并发效率降低。







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值