GenericServlet(java自己编写好了)
- 我们编写一个Servlet类直接实现Servlet接口有什么缺点?
- 我们只需要service方法,其他方法大部分情况下是不需要使用的。代码很丑陋。
- 适配器设计模式Adapter
- 手机直接插到220V的电压上,手机直接就报废了。怎么办?可以找一个充电器。这个充电器就是一个适配器。手机连接适配器。适配器连接220V的电压。这样问题就解决了。
- 编写一个GenericServlet类,这个类是一个抽象类,其中有一个抽象方法service。
- GenericServlet实现Servlet接口。
- GenericServlet是一个适配器。
- 以后编写的所有Servlet类继承GenericServlet,重写service方法即可。
- 思考:GenericServlet类是否需要改造一下?怎么改造?更利于子类程序的编写?
- 思考第一个问题:我提供了一个GenericServlet之后,init方法还会执行吗?
- 还会执行。会执行GenericServlet类中的init方法。
- 思考第二个问题:init方法是谁调用的?
- Tomcat服务器调用的。
- 思考第三个问题:init方法中的ServletConfig对象是谁创建的?是谁传过来的?
- 都是Tomcat干的。
- Tomcat服务器先创建了ServletConfig对象,然后调用init方法,将ServletConfig对象传给了init方法。
- 思考一下Tomcat服务器伪代码:
- 思考第一个问题:我提供了一个GenericServlet之后,init方法还会执行吗?
public class Tomcat {
public static void main(String[] args){
// .....
// Tomcat服务器伪代码
// 创建LoginServlet对象(通过反射机制,调用无参数构造方法来实例化LoginServlet对象)
Class clazz = Class.forName("com.bjpowernode.javaweb.servlet.LoginServlet");
Object obj = clazz.newInstance();
/*newInstance方法主要作用?
通过 Class 类的 newInstance() 方法创建对象,该方法要求该 Class 对应类有无参构造 方法
*/
// 向下转型
Servlet servlet = (Servlet)obj;
// 创建ServletConfig对象
// Tomcat服务器负责将ServletConfig对象实例化出来。
// 多态(Tomcat服务器完全实现了Servlet规范)
ServletConfig servletConfig = new org.apache.catalina.core.StandardWrapperFacade();
// 调用Servlet的init方法
servlet.init(servletConfig);
// 调用Servlet的service方法
// ....
}
}
ServletConfig接口
ServletConfig
-
ServletConfig是什么?
jakarta.servlet.ServletConfig(ServletConfig是Servlet规范中的一员。) ServletConfig对象中封装了标签中的配置信息。(web.xml文件中servlet的配置信息) ServletConfig是一个接口。(jakarta.servlet。Servlet是一个接口)
-
谁去实现了这个接口呢?
public class org.apache.catalina.core.StandardWrapperFacade implements Servlet{}
结论:Tomcat服务器实现了ServletConfig接口。
思考:如果把Tomcat服务器换成jetty服务器,输出ServletConfig对象,还是这个结果吗?
不一定一样,包名类名可能和Tomcat不一样。但是他们都实现了ServletConfig这个规范。
- 一个Servlet对象中有一个ServletConfig对象。(Servlet和ServletConfig对象是一对一。
100个Servlet,就应该有100个ServeltConfig对象。
- ServletConfig对象是谁创建的? 什么时候创建的?
- Tomcat服务器(WEB服务器) 创建了ServletConfig对象。
- 在创建Servllet对象的时候,同时创建了ServletConfig对象
ServletConfig接口到底是干啥的?有什么用?
Config是Configuration单词的缩写?
servletConfig对象被翻译为:Servlet对象的配置信息对象。
一个Servlet对象就有一个配置信息对象。
两个Servlet对象就有两个配置信息对象。
ServletConfig对象中到底包装了什么信息呢?
Tomcat小猫咪解析web.xml文件,将web.xml文件中标签中的配置信息自动包装到ServletConfig对象中。
<servlet>
<servlet-name>ServletConfig</servlet-name>
<servlet-class>com.bjpowernode.javaweb.servlet.ConfigTestServlet</servlet-class>
</servlet>
ServletConfig对象中包装的信息是:
web.xml文件中M<servlet></servlet>标签的配置信息。
-
7、ServletConfig接口中有哪些方法
<servlet> <servlet-name>ServletTest02</servlet-name> <servlet-class>com.bjpowernode.javaweb.servlet.ConfigTestServlet2</servlet-class> <!--这里是可以配置一个Servlet对象的初始化信息的--> <init-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/bjpowernode</param-value> </init-param> <init-param> <param-name>driver</param-name> <param-value>com.mysql.jdbc.Driver</param-value> </init-param> <init-param> <param-name>user</param-name> <param-value>root</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>root</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>ServletTest02</servlet-name> <url-pattern>/test02</url-pattern> </servlet-mapping> 以上<servlet></servlet>标签中<init-param></init-param>是初始化参数,这个初始化参数信息会自动被小猫咪自动封装到ServletConfig当中 通过ServletConfig对象的两个方法,可以获取到web.xml文件中的配置信息。 //获取所有初始化参数的name 返回一个集合 java.util.Enumeration<java.lang.String> getInitParameterNames() //通过名字获取web.xml配置文件中的value属性 java.lang.String getInitParmaneter(java.lang.String name)
-
以上标签中是初始化参数,这个初始化参数信息会自动被小猫咪自动封装到ServletConfig当中,通过ServletConfig对象的两个方法,可以获取到web.xml文件中的配置信息。
-
ServletConfig两个方法:
- getInitParameterNames() :
获取所有初始化参数的name 返回一个集合:
全称: java.util.Enumeration<java.lang.String> getInitParameterNames() - getInitParmaneter() :
通过名字获取web.xml配置文件中的value属性
全称:java.lang.String getInitParmaneter(java.lang.String name)</java.lang.String>
- getInitParameterNames() :
8、ServletConfig接口中有4个方法:
第1个方法:
public String getInitParameter(String name);//通过初始化参数的name获取value
第2个方法:
public Enumeration<String> getInitParameterNames();//获取所有的初始化参数的name
第3个方法:
public ServletContext getServletContext();//获取ServletContext对象
第4个方法:
public String getServletName();//获取Servlet的name
以上的4个方法,在自己编写的Servlet类当中也可以使用this去调用。(因为GenericServlet实现了ServletConfig接口)
标签:Tomcat,对象,Servlet,GenericServlet,接口,方法,ServletConfig
From: https://www.cnblogs.com/atao-BigData/p/16804986.html