**
1.Servlet概述
**
(1)Servlet作用
Servlet是JavaWeb三大组件之一,属于动态资源。多个浏览器(客户端)发送请求,服务器将受到的请求交给服务器中的Servlet来处理客户端请求。服务器中有多个Servlet,每个Servlet都有各自的功能来处理客户端的不同请求。Servlet的整个工作工程是“接收请求数据-处理请求-响应”。
(2)实现Servlet方式
实现Servlet有三种方式:
实现 javax.servlet.Servlet 接口;
继承 javax.servlet.GenericServlet 类;
继承 javax.servlet.http.HttpServlet 类;
//Servlet生命周期的三个方法
//创建Servlet对象后立即执行的初始化方法,仅执行一次
public void init(ServletConfig servletConfig){}
//处理请求时调用的方法,可被执行多次
public void service(ServletRequest servletRequest,ServletResponse servletResponse){}
//销毁Servlet对象前执行,仅执行一次
public void destory(){}
//得到Servlet对象的初始化配置信息
public ServletConfig getServletConfig(){return null;}
//得到Servlet对象的名字
public String getServletInfo(){return null;}
我们创建的Servlet后,对创建Servlet对象和其方法调用都是由服务器完成。
Servlet中的方法大多数不由我们来调用,而是由Tomcat来调用。并且Servlet的对象也不由我们来创建,由Tomcat来创建!
Servlet特性:单例,只有一个对象;线程不安全。
*当浏览器发送请求访问Servlet时,不可能直接访问到Servlet对象,因此需要将Servlet对象指定一个路径(将Servlet对象和一个路径绑定),然后浏览器直接访问Servlet路径。
Servlet配置路径:在web.xml中配置。*
<servlet>
<servlet-name>"设置servlet对象名字"</servlet-name>
<servlet-class>"对应某个包下的Servlet类"</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>"Servlet名字"<servlet-name>
<url-pattern>"指定Servlet对象的路径"<url-pattern>
</servlet-mapping>
当浏览器通过Servlet对象的路径发送请求,web.xml就会根据接受到的路径找到对应的Servlet名字,然后根据Servlet名字找到对应的Servlet对象。
**
2.Servlet接口
**
(1)Servlet接口相关类型
ServletRequest:
ServletResponse:
ServletConfig:init()方法的参数,表示Servlet配置对象,它对应Servlet的配置信息,即web.xml的元素中的内容。
②ServletConfig对象是由服务器创建,然后传递给Servlet的init()方法,因此可以在此方法中操作配置信息对象:
String getServletName():获取Servlet在web.xml配置文件中的配置名称()
ServletContext getServletContext():获取ServletContext对象
String getInitParameter(String name):获取web.xml中配置的初始化参数,通过参数名称获取参数值
Enumeration getInitPaeameterNames():用来获取web.xml中配置的所有初始化参数名称
在元素中还可以配置初始化参数:
<servlet>
<servlet-name>One</servlet-name>
<servlet-class>cm.servlet.OneServlet</servlet-class>
<init-param>
<param-name>paramName1</param-name>
<param-value>paramValue1</param-value>
</init-param>
<init-param>
<param-name>paramName2</param-name>
<param-value>paramValue2</param-value>
</init-param>
</servlet>
因此OneServlet对象中,可以通过Init()方法操作ServletConfig对象中的getInitParameter()方法获取初始化参数:String value1 = serverConfig.getInitParameter(“paramName1”)得到paramValue2
**
3.GenericServlet
**
首先自己尝试创建BServlet类继承Servlet接口,为了能够让除init()方法以外,能够方便操作ServletConfig对象,因此在BServlet中定义变量ServletConfig config;并在init()方法中将ServletConfig对象赋值给变量config,从而能使其他方法使用。不需要担心类中方法顺序的问题,因为服务器创建Servlet对象后会立即执行初始化方法。
之前ServletConfig对象的方法:getServletName()、getServletContext()、getInitParameter(String name)、getInitPaeameterNames()都能够直接在BServlet中实现。
因此可以将BServlet类作为父类继承,但是出现了问题,即当子类CServlet继承父类后,想要重写方法init()是会覆盖原方法,使得config失效。解决方法:在BServlet中,自己再创建init方法,然后在原重写的init(ServletConfig arg0){config = arg0;init();}。其子类中会继续执行init()方法中的内容,但这个init()并不是生命周期方法
private ServletConfig config;
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
config = arg0;
init();
}
public void init(){}
GenericServlet类源代码
public abstract class GenericServlet implements Servlet, ServletConfig,
java.io.Serializable {
private static final long serialVersionUID = 1L;
private transient ServletConfig config;
public GenericServlet() {}
@Override
public void destroy() {}
@Override
public String getInitParameter(String name) {
return getServletConfig().getInitParameter(name);
}
@Override
public Enumeration<String> getInitParameterNames() {
return getServletConfig().getInitParameterNames();
}
@Override
public ServletConfig getServletConfig() {
return config;
}
@Override
public ServletContext getServletContext() {
return getServletConfig().getServletContext();
}
@Override
public String getServletInfo() {
return "";
}
@Override
public void init (ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public void init () throws ServletException {}
public void log(String msg) {
getServletContext().log(getServletName() + ": " + msg);
}
public void log(String message, Throwable t) {
getServletContext().log(getServletName() + ": " + message, t);
}
@Override
public abstract void service(ServletRequest req, ServletResponseres) throws ServletException, IOException;
@Override
public String getServletName() {
return config.getServletName();
}
}