JavaWeb-Servlet(1)

**

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();
    }
}
发布了3 篇原创文章 · 获赞 1 · 访问量 107

猜你喜欢

转载自blog.csdn.net/yangyiyun199863/article/details/104208658
今日推荐