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对象,五大作用