servlet的详解
1、什么是Servlet
Servlet是用来开发动态资源的。它就是一个普通的java类,必须依赖于服务器才能运行。
这个类"必须"实现一个接口Servlet
2、如何定义一个Servlet?
自定义一个类 实现 Servlet接口。
public class 类名 implements Servlet{
public void service(ServletRequest request,ServletResponse response){
//业务逻辑
}
}
配置servlet,有两种配置的方法
第一种:在web.xml里面配置servlet
4、Servlet里面的方法在执行的时候,是如何执行的?
反射的机制进行调用。
init(ServletConfig servletConfig)
//获取当前类的字节码对象
Class clazz = Class.forName("com.qf.demo.ServletDemo1");
//获取当前ServletDemo1的实例对象
ServletDemo1 demo = (ServletDemo1)clazz.newInstance();
//获取init方法的方法对象
Method method = clazz.getDeclaredMethod("init",ServletConfig.class);
//执行调用
method.invoke(demo,config);
5、init(ServletConfig config)方法
在Servlet接口的实现类GenericServlet里面,有两个init方法
init(ServletConfig config);
init();
通过我们分析源码得知:
在带参数的init方法内部初始化ServletConfig对象,调用了不带参数的init方法。
不带参数的init方法,是一个空的方法体,里面什么也没有实现。这样设计的目的是:
如果我们自己有一些需要初始化的代码,我们直接定义在不带参数的init方法内部即可。
6、Servlet的体系结构:
接口 Servlet
抽象类 GenericServlet
具体的类 HttpServlet
HttpServlet如何去实现service方法的?
根据外部的请求方式的不同,去调用对应的处理方法
post-->doPost();
get-->doGet();
7、ServletConfig对象
如何获取这个对象? ServletConfig config = this.getServletConfig();
//获取Servlet内部的初始化参数
String value = config.getInitParameter(String name);
//获取servlet的名称
String name = config.getServletName();
//批量获取servlet内部的初始化参数名称
config.getInitParameterNames();
//获取ServletContext对象
ServletContext context = config.getServletContext();
8、ServletContext对象
描述整个web应用上下文的对象。整个web项目容器
config.getServletContext();
//向ServletContext域对象里面存储值
context.setAttribute(String name,Object o);
//向ServletContext域对象里面取值
Object o = context.getAttribute(String name);
//Context域对象的范围
整个域对象的范围是最大,作用于当前整个web应用。这要是当前web项目里面的资源(servlet jsp html)都可以去获取到这个域对象里面的值。
特点:不管是转发还是重定向,这个域对象都可以成功的存取数据。
//
9、Request对象
域对象(存储数据的)。它的作用范围就是当前Request请求。
request.setAttribute(String name,Object o);
Object o = request.getAttribute(String name);
特点:
只有在转发的情况下,使用Request域对象才会起作用、重定向不可以。
10、重定向和转发的区别:
重定向进行资源的跳转,浏览器的地址栏会发生变化。转发不会。
重定向进行资源的跳转,浏览器总共发送了2次请求。转发只发送了1次请求。
进行数据的共享的时机,转发可以存取request作用域里面的数据。重定向不能存取request作用域里面的数据。