Servlet编程基础

一、Servlet的调用过程
二、Servlet在tomcat服务器中的映射路径和缺省
三、Servlet的生命周期及自动加载
四、ServletConfig对象
五、ServletContext对象

Servlet(Java Servlet)是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
这里我们用tomcat搭建了支持servlet服务器,用eclipse来开发Servlet。


一、Servlet的调用过程

Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
②装载并创建该Servlet的一个实例对象。
③调用Servlet实例对象的init()方法。
④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。

这里写图片描述



二、Servlet在tomcat服务器中的映射路径和缺省

(一)映射路径

Servlet如何想被外界访问就必须在web.xml文件中进行注册。
<servlet>元素用于注册Servlet,它包含有两个主要元素:<servlet-name> <servlet-class>
<servlet-mapping>元素用于映射已经注册的Servlet的一个对外访问路径,它包含:<servlet-name><url-pattern>
例如,配置一个ServletDemo服务端。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>webDemo1</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

  <servlet>
    <servlet-name>ServletDemo</servlet-name>
    <!--完整的类名,包名+类名-->
    <servlet-class>com/ServletDemo</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>ServletDemo</servlet-name>
    <!--我们就可以通过访问 http://localhost:8080/webDemo/firstPage 来访问我们创建的ServletDemo服务端了-->
    <url-pattern>/firstPage</url-pattern>
  </servlet-mapping>


<url-pattern> 元素中,有两种匹配方式。
1、精确匹配

/firstPage          url: ../webDemo/firstPage

2、模糊匹配

/*                  url: ../webDemo/任意路径
/                   url: ../webDemo/任意路径
/com/*              url: ../webDemo/com/任意路径
*.后缀名               url: ../webDemo/*.后缀名

1、/firstPage/*.(后缀名) 两种的模糊匹配不能同时使用
2、精确匹配比模糊匹配优先级高,以后缀名结尾的模糊匹配优先级最低 。
3、模糊匹配尽量不要写 /和/*,会与缺省造成冲突。


实际上,在Servlet3.0版本以后,对于原来在web.xml定义的servlet,filter,listener,InitParam都可以通过annotation来配置了,而不需要在web.xml中定义。我们也可以在创建动态web工程中勾上以下选项来生成web.xml文件。
这里写图片描述


(二)缺省

servlet的缺省路径是在tomcat服务器内置的一个路径。该路径对应着一个DefaultServlet(缺省Servlet)。这个缺省Servlet的作用是用于解析web应用的静态资源文件。
在tomcat安装目录中:conf下的web.xml中有这样一个代码:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

//...
<servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
</servlet-mapping>

当浏览器发送一个请求给tomcat时,tomcat会先在web.xml文件查找是否有对应的url-pattern。假如没有找到,则会交给tomcat的内置额DefaultServlet处理。DefaultServlet程序则会到储存静态文件的中查找对应名称的静态文件。如果找到该文件,则读取该文件内容,返回给浏览器。如果找不到该文件,则会返回404错误页面。
因此,当访问tomcat服务器中的某个静态html文件和图片的时候,实际上是在访问这个缺省的Servlet。
所以,我们在使用模糊匹配的时候,最好不用/和/*模糊匹配,这样会导致访问不到html等静态文件。



三、Servlet的生命周期及自动加载

(一)生命周期
Servlet生命周期:
1、初始化阶段,调用Servlet构造方法和init()方法
2、相应客户端请求阶段,调用service()方法
3、终止阶段,调用destroy()方法
//每个自定义的Servlet都必须实现Servlet的接口,Servlet接口定义了五个方法,其中有三个方法涉及到了Servlet的生命周期。
void init(ServletConfig config)
   throws ServletException
void service(ServletRequest req,
             ServletResponse res)
      throws ServletException,
             IOExceptionthrows ServletException, IOException
void destroy()

通过每个方法的调用时间,我们能看到,当客户端第一次访问Servlet的时候,web容器将会创建这个Servlet的实例(再次访问,则不会再创建,直接调用实例的service()方法)。
当整个web应用终止的时候,Servlet容器就会调用Servlet的destroy()方法,释放掉Servlet所有占用的资源。

(二)自动加载

因此,我们也可以看出,当有客户端第一次访问Servlet时,因为Servlet需要调用多个方法,则加载会比较慢。我们可以让Servlet实现自动加载,在运行web容器的时候,就让该Servlet加载好,等待客户端的访问。
在项目的web.xml中,我只要加上<load-on-startup>标签就能实现让该Servlet自动加载了。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>webDemo1</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

  <servlet>
    <servlet-name>ServletDemo</servlet-name>
    <!--完整的类名,包名+类名-->
    <servlet-class>com/ServletDemo</servlet-class>

    <!--servlet对象自动加载,文本内容为整数,整数值越大,优先级越低-->
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>ServletDemo</servlet-name>
    <!--我们就可以通过访问 http://localhost:8080/webDemo/firstPage 来访问我们创建的ServletDemo服务端了-->
    <url-pattern>/firstPage</url-pattern>
  </servlet-mapping>
(三)init()方法
//1、有参数的init方法:该方法是servlet的生命周期方法,一定会被tomcat服务器调用。
//Called by the servlet container to indicate to a servlet that the servlet is being placed into service.
public void init(ServletConfig config)
          throws ServletException

//2、无参数的init方法:该方法是专门给覆盖编写初始化代码的方法。
//A convenience method which can be overridden so that there's no need to call super.init(config).
public void init()
          throws ServletException

注:servlet对象在tomcat服务器当中,是单实例,多线程的。如果多个线程访问了servlet成员变量,会引发线程安全问题。解决办法是用线程锁锁住访问成员变量的代码块。



四、ServletConfig对象

ServletConfig对象用于,Servlet容器在初始化时传递参数信息给Servlet。ServletConfig封装了Srevlet配置中的参数信息,我们可以通过调用该对象来获取相应的参数信息。
ServletConfig的作用域,从一个Servlet被实例化后,对任何客户端在任何时候访问有效,但不能给另外一个Servelt访问。

在web.xml文件中,我们通过<init-param> 标签来配置相应的参数信息。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>webDemo1</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

  <servlet>
    <servlet-name>ServletDemo</servlet-name>
    <!--完整的类名,包名+类名-->
    <servlet-class>com/ServletDemo</servlet-class>

    <!--参数信息,要放在load-on-startup标签上边-->
    <init-param>
        <param-name>path1</param-name>  
        <param-value>e:/a.txt</param-value>
    </init-param>
    <init-param>
        <param-name>path2</>
        <param-value>e:/b.txt</>
    </init-param>


    <!--servlet对象自动加载,文本内容为整数,整数值越大,优先级越低-->
    <load-on-startup>1</load-on-startup>
</servlet>


  <servlet-mapping>
    <servlet-name>ServletDemo</servlet-name>
    <!--我们就可以通过访问 http://localhost:8080/webDemo/firstPage 来访问我们创建的ServletDemo服务端了-->
    <url-pattern>/firstPage</url-pattern>
  </servlet-mapping>

在Servlet中,主要用以下方法来获取这些参数信息。

//返回指定名字的初始化参数的值的字符串,该参数不存在,则返回null
java.lang.String    getInitParameter(java.lang.String name)


//返回所有该Servlet的初始化参数名字的枚举,假如该Servlet没有初始化参数,则返回空的枚举。
java.util.Enumeration   getInitParameterNames() 

//返回该Servlet实例的名字
java.lang.String    getServletName()  


//例如,获取所有的Servlet初始化参数的部分代码
//获取ServletCnfig对象
ServletConfig config = this.getServletConfig();

//获取所有参数的名字     
Enumeration<?> params = config.getInitParameterNames();

while(params.hasMoreElements()){    
    String paramName = (String)params.nextElement();
    //获取指定名字的参数的值
    String paramValue = config.getInitParameter(paramName);

    System.out.println(paramName+""+paramValue);
}

更多关于SevletConfig…



五、ServletContext对象

ServletContext对象,代表一个当前的web应用环境。ServletContext定义了一系列的方法,用于Servlet与Servlet容器之间的信息交流。一个web应用中,可以存在多个ServletConfig对象(一个servlet对应着一个ServletConfig对象)。但一个web应用只对应着一个ServletContext对象。其作用域从web应用开始到结束。

主要用到的方法(更多方法介绍…):

//得到当前web应用的路径
String getContextPath()

//返回到web应用的初始化参数,假如该参数不存在,则返回null
String getInitParameter(String name)

//返回所有初始化参数的名字的枚举,假如context没有初始化参数,则返回空的枚举
Enumeration  getParameterNames();

//一个指定的属性名字捆绑着一个对象。假如指定的名字已经存在,这个方法会取代之前的属性
void setAttribute(String name, Object object)
//返回指定名字的servlet容器的属性,假如不存在,则返回null
Object getAttribute(String name)
//移去指定名字的context属性
void removeAttribute(String name)

//转发类(似于重定向)
RequestDisptcher getRequestDisptcher(String path)

//得到web应用的资源
String getRealPath(Strng path)
InputStream getResourceAsStream(String path)

(一)获取初始化参数
根据ServletContext的作用域,这里定义的初始化参数,是给所有Servlet共享的。
在web.xml文件中我们可以用<context-param> 标签定义该初始化参数。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>webDemo1</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

  <servlet>
    <servlet-name>ServletDemo</servlet-name>
    <!--完整的类名,包名+类名-->
    <servlet-class>com/ServletDemo</servlet-class>

    <!--参数信息,要放在load-on-startup标签上边-->
    <init-param>
        <param-name>path1</param-name>  
        <param-value>e:/a.txt</param-value>
    </init-param>
    <init-param>
        <param-name>path2</>
        <param-value>e:/b.txt</>
    </init-param>


    <!--servlet对象自动加载,文本内容为整数,整数值越大,优先级越低-->
    <load-on-startup>1</load-on-startup>
</servlet>

<!--定义context初始化参数-->
<context-param>
    <param-name>param1</param-name>
    <param-value>360</param-value>
</context-param>
<context-param>
    <param-name>param2</param-name>
    <param-value>qq</param-value>
</context-param>

<servlet-mapping>
    <servlet-name>ServletDemo</servlet-name>
    <!--我们就可以通过访问 http://localhost:8080/webDemo/firstPage 来访问我们创建的ServletDemo服务端了-->
</servlet-mapping>

然后我们就可以根据以下方法来获取了(部分代码)

//获取ServletContext对象
ServletContext context = this.getServletContext();
//
Enumeration params = context.getInitParameterNames();
while(params.hasmoreElements){
    String param = param.nextElement();
    String value = context.getinitParameter(param);
}


(二)域对象有关的方法
作用是用于保存数据,获取数据,可以在不同的动态资源之间共享数据。我们可以使用域对象来在各个动态资源中,传递数据。可以共享任何类型。

//Servlet1保存数据
ServletContext context = this.getServletContext()
context.setAttribute("name","lee");

//Servlet2取出数据
ServletContext context = this.getServletContext()
context.getAttribute(name);


(三)转发
转发和重定向的区别
转发地址栏不会改变,转发不能转发当前web应用以外的资源,可以把数据保存爱request对象当中。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值