呵呵呵5596

导航

servlet的详解

1、什么是Servlet
Servlet是用来开发动态资源的。它就是一个普通的java类,必须依赖于服务器才能运行。
这个类"必须"实现一个接口Servlet
2、如何定义一个Servlet?
自定义一个类 实现 Servlet接口。
public class 类名 implements Servlet{

 public void service(ServletRequest request,ServletResponse response){

                     //业务逻辑
 }

}
配置servlet,有两种配置的方法
第一种:在web.xml里面配置servlet



/ 注意:理解servlet资源被访问到的原理 反射机制 第二种:使用注解的方式配置 @WebServlet("/demo") 3、讨论Servlet的生命周期 定义构造函数 init方法 service方法 destroy方法 (1)定义了Servlet的构造函数,我们请求url 第一次: 执行了构造函数 执行了service方法 第二次: 执行了service方法 .... 第n次: 执行了service方法 结论:servlet的构造函数只会初始化一次。 (2) init方法 init方法只是在第一次请求资源的时候,才会执行一次。后面都不再调用这个init方法。 (3) service 提供服务的方法 我们一般会将业务逻辑定义在service里面。每次请求资源的时候,都会被调用。 (4)destroy 销毁的方法 当web服务器重新部署或者停止web服务器的时候,会调用destroy方法,销毁当前的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作用域里面的数据。

posted on 2021-11-19 19:43  呵呵呵5596  阅读(94)  评论(0编辑  收藏  举报