Servlet学习

servlet

概念

1.servlet是一个普通的java类,继承HttpServlet类。
2.其实实现了Servlet接口的java类,才是一个Servlet类。
3.servlet需要交给tomcat去运行

servlet执行的过程

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

1.在浏览器输入:http//:localhost:8080/day09/hello
2.读取web.xml找到赌对应的servlet类
3.创建servlet对象,然后调用servlet类中的方法
4.servlet就把内容返回给浏览器用户

缺省路径

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

  http://localhost/day09/hello.html
  一个访问在tomcat中的执行过程:

1.读取web.xml,是否匹配到了servlet
2.如果匹配到,执行对应的servlet程序
3.没有匹配到,把请求交给tomcat服务器的DefaultServlet处理
4.DefaultServlet会到根目录下搜索是否存在hello.html的文件
5.找到,返回文件,没有找到,返回404状态码
结论:先找动态网页,在找静态网页

servlet生命周期

1.构造方法:创建servlet对象时调用,只调用1次,证明了servlet是单例的
2.init方法:创建完对象之后调用,只调用1次,该方法用于初始化对象
3.service方法:在每次请求时调用,调用n次
4.destory方法:在servlet对象销毁之后调用,只调用一次。重新部署网站,或者停止服务器就会销毁了

tomcat服务器调用这四个方法

  tomcat首先需要创建对应的servlet类,使用反射来创建对象。创建对象的前提就是加载字节码文件
  反射中的方法
类相关的信息:Class
构造方法信息:Constructor
属性:Field
普通方法:Method

通过以上四个类获取类上的信息,甚至构造类的对象,调用类的对象的方法,这就是反射。

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

得到HelloServlet的Class对象
Class clazz = Class.forName(“gz.itcast.a_servlet.HelloServlet”)

通过class对象调用构造方法
Object obj = clazz.newInstance();  //调用无参的构造方法

2.通过反射调用init方法

得到init方法对象
Method m = clazz.getDeclaraeMethod(“init”,ServletConfig.class);

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

3.通过反射,调用service方法
4.通过反射,调用destroy方法

servlet并发问题

1.servlet在tomcat服务器中是单实例多线程的
2.多线程就会引发线程安全问题,所以建议
  1.尽量不要使用成员变量,或者静态成员变量
  2.如果使用了以上变量,需要给成员变量的代码加锁,加锁的代码尽量缩小范围,因为有可能影响程序的并发效率

servlet自动加载机制

1.默认情况servlet对象是在第一次访问的时候创建,那么第一次访问servlet的用户体验就不好了
2.可以让servlet在服务器启动的时候自动加载,1表示自动加载的优先级,数字越小越先加载

ServletConfig对象

ServletConfig创建(一个网站中可能有多个ServletConfig对象):
  ServletConfig对象是在创建完servlet对象之后被创建出来的。然后通过有参init方法传递到servlet中。ServletConfig对象主要用于加载servlet配置的参数。其实就是读取web.xml文件中的init-param标签,把用户设置的初始化参数封装为ServletConfig对象。

ServletContext对象

介绍

ServletContext对象叫做servlet上下文对象。一个网站只会创建一个ServletContext对象,代表的是整个网站的环境信息

获取ServletContext对象

ServletContext对象:启动的时候创建
ServletConfig对象:调用init方法之前创建,在ServletContext对象创建之前
获取:
  通过ServletConfig来得到ServletContext对象
  this.getServletConfig().getServletContext()

ServletContext的五大作用

1.获取web的上下文路径
  web上下文路径就是项目在tomcat服务器中运行的路径。注意不是开发目录的项目名称。
  String path = context.getContextPath(); //path = /day09
2.获取全局参数
  注意,全局参数和servlet所处的位置是同级的。tomcat会把全局参数封装到ServletContext对象中,用户通过ServletContext对象获取全局参数。
3.和域对象相关
  什么是域对象?域对象就是在不同资源之间共享数据,保存数据,获取数据
4.请求转发
this.getServletContext().getRequestDispatch(“地址”).forward(request,response);
简写形式:request.getRequsetDispatch(“地址”).forward(request.response);
请求重定向:
    1.地址栏会发生改变,变成重定向的地址
    2.可以跳转到项目内的资源,也可以跳转到项目外的资源
    3.浏览器向服务器发出两次请求,不能使用request作为域对象来共享数据
请求转发:
    1.地址栏不会发生改变
    2.只能跳转到项目内的资源,也可以跳转到项目外的资源
    3.浏览器向服务器发出一次请求,request可以作为域对象共享数据
路径问题:
服务器行为 / 代表从项目根目录开始

5.读取web项目的资源文件
相对路径:
  当前路径相对于java运行的目录
结论:
  在web项目中,java命令运行的目录就是在tomcat的bin目录。在web项目,不能使用相对路径

在开发情况下,src下面所有的文件都会拷贝到classes下面
使用ServletContext获取资源文件:
  1.getRealPath(“/WEB-INF/classes/news.properties”);//获取资源文件的真实地址
  2.getResourceAsStream(“/WEB-INF/classes/news.properties”);//获取资源文件的输入流
  3.getResource(“/WEB-INF/classes/news.properties”)//获取资源文件的URL

总结

1.servlet编写
2.servlet的映射路径(精确匹配,模糊匹配,缺省路径)
3.servlet的生命周期(构造方法,init方法,service方法,destory方法)
4.多线程并发问题(单实例多线程,servlet使用成员变量,同步锁解决)
5.自动加载(load-on-startup)+两个init方法的区别
6.ServletConfig对象
7.ServletContext对象,五大作用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值