Servlet

来源:互联网 发布:怎么在淘宝直播 编辑:程序博客网 时间:2024/06/17 11:17

  java servlet是和平台无关的服务器端组件,它运行在servlet容器(Tomcat服务器)中。

servlet容器负责servlet和客户的通信以及调用servlet的方法,servlet和客户的通信采用“请求/响应”的模式。

servlet可完成如下功能:

  1.创建并返回基于客户请求的动态html页面。

  2.创建可嵌入到现有html页面中的部分html页面

  3.与其他服务器资源(如数据库。基于java的应用程序)进行通信。


创建一个servlet:

package com.sa.servlet;import java.io.IOException;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class HelloServlet implements Servlet {     public HelloServlet(){System.out.println("constructor");}@Overridepublic void destroy() {// TODO Auto-generated method stub        System.out.println("destroy");}@Overridepublic ServletConfig getServletConfig() {// TODO Auto-generated method stubSystem.out.println("getServletConfig");return null;}@Overridepublic String getServletInfo() {// TODO Auto-generated method stubSystem.out.println("getServletInfo");return null;}@Overridepublic void init(ServletConfig arg0) throws ServletException {// TODO Auto-generated method stubSystem.out.println("init");}@Overridepublic void service(ServletRequest arg0, ServletResponse arg1)throws ServletException, IOException {// TODO Auto-generated method stubSystem.out.println("service");}}
配置XML:

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">  <!-- 配置和映射servlet -->  <servlet>  <!-- servlet注册的名字 -->    <servlet-name>helloServlet</servlet-name>    <!-- servlet的全类名-->    <servlet-class>com.sa.servlet.HelloServlet</servlet-class>      </servlet>    <servlet-mapping>  <!-- 需要和某一个servlet节点的servlet子节点的文本节点一致 -->    <servlet-name>helloServlet</servlet-name>    <!-- 映射具体 的访问路径: /  代表当前web应用的根目录 -->    <url-pattern>/hello</url-pattern>  </servlet-mapping>  </web-app>
浏览器运行:http://localhost:8090/MyLab2/hello

控制台输出:

如果servlet构造器不加public是话 会报错:

Class org.apache.catalina.core.DefaultInstanceManager can not access a member of class com.sa.servlet.HelloServlet with modifiers ""

多次刷新页面:


关闭servlet容器tomcat:

整个映射过程:


现在修改XML文件:

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">  <!-- 配置和映射servlet -->  <servlet>    <servlet-name>helloServlet</servlet-name>    <servlet-class>com.sa.servlet.HelloServlet</servlet-class>    <load-on-startup>1</load-on-startup>  </servlet>   <!--  <servlet-mapping>    <servlet-name>helloServlet</servlet-name>    <url-pattern>/hello</url-pattern>  </servlet-mapping> --> </web-app>
浏览器再次执行http://localhost:8090/MyLab2/hello:

可以看到,这个servlet随着容器的启动也被实例化。

 
通过第一个Servlet实例,我们可以得出以下几个结论:

1.servlet容器可以创建servlet,并调用servlet生命周期方法。

2.JSP,Filter,Listener,Tag..都是运行在Servlet容器内。

3.servelt生命周期相关方法(以下方法都由servlet容器调用):

   1)类的构造器:只被调用一次,第一次请求servlet时,创建servlet实例,调用构造器,说明servlet是单实例的

    2)init():只被调用一次,在创建好实例后,立即被调用,用于初始化当前servelt.

    3)service():被多次调用,用于响应请求,每次请求都会调用该方法。

    4)destroy():只被调用一次,在当前servlet所在的WEB应用被关闭时调用,用于释放当前servlet所占用的资源。

4.load-on-startup:指定servelt被创建的时间。若为负数则在第一次被请求时创建;若为整数或0,则在当前WEB应用被容器加载时创建。

   数值越小,越早被创建。

5.一个servlet可以有多个映射:

   

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">  <!-- 配置和映射servlet -->  <servlet>  <!-- servlet注册的名字 -->    <servlet-name>helloServlet</servlet-name>    <!-- servlet的全类名-->    <servlet-class>com.sa.servlet.HelloServlet</servlet-class>      </servlet>    <servlet-mapping>  <!-- 需要和某一个servlet节点的servlet子节点的文本节点一致 -->    <servlet-name>helloServlet</servlet-name>    <!-- 映射具体 的访问路径: /  代表当前web应用的根目录 -->    <url-pattern>/hello</url-pattern>  </servlet-mapping>     <servlet-mapping>  <!-- 需要和某一个servlet节点的servlet子节点的文本节点一致 -->    <servlet-name>helloServlet</servlet-name>    <!-- 映射具体 的访问路径: /  代表当前web应用的根目录 -->    <url-pattern>/hello2</url-pattern>  </servlet-mapping>  </web-app>

6.关于servlet-mapping:映射的URL中可以使用*通配符,但是只能有两种格式:

   1)  *.扩展名

   2) /*

7.  servletConfig封装了servlet的配置信息,并且可以获取serveltContext对象.

    1)获取配置参数信息:

    1.1)初始化参数:

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">  <!-- 配置和映射servlet -->  <servlet>  <!-- servlet注册的名字 -->    <servlet-name>helloServlet</servlet-name>    <!-- servlet的全类名-->    <servlet-class>com.sa.servlet.HelloServlet</servlet-class>    <!-- 配置servlet的初始化参数。并且节点必须在load-on-startup之前 -->    <init-param>    <!-- 参数名 -->      <param-name>name</param-name>      <!-- 参数值 -->      <param-value>sasa</param-value>    </init-param>         <init-param>    <!-- 参数名 -->      <param-name>pwd</param-name>      <!-- 参数值 -->      <param-value>123</param-value>    </init-param>  </servlet>    <servlet-mapping>  <!-- 需要和某一个servlet节点的servlet子节点的文本节点一致 -->    <servlet-name>helloServlet</servlet-name>    <!-- 映射具体 的访问路径: /  代表当前web应用的根目录 -->    <url-pattern>*.do</url-pattern>  </servlet-mapping>  </web-app>
  1.2)获取初始化参数的值:

     1.2.1)getInitParameter(String name)  获取指定name的值

     1.2.2)  getInitParameterNames()      获取参数名组成的Enumeration.

package com.sa.servlet;import java.io.IOException;import java.util.Enumeration;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class HelloServlet implements Servlet {     public HelloServlet(){System.out.println("constructor");}@Overridepublic void destroy() {// TODO Auto-generated method stub        System.out.println("destroy");}@Overridepublic ServletConfig getServletConfig() {// TODO Auto-generated method stubSystem.out.println("getServletConfig");return null;}@Overridepublic String getServletInfo() {// TODO Auto-generated method stubSystem.out.println("getServletInfo");return null;}@Overridepublic void init(ServletConfig arg0) throws ServletException {// TODO Auto-generated method stubSystem.out.println("init");String user=arg0.getInitParameter("name");System.out.println("name:"+user);Enumeration<String> enums=arg0.getInitParameterNames();while(enums.hasMoreElements()){System.out.println(enums.nextElement());}}@Overridepublic void service(ServletRequest arg0, ServletResponse arg1)throws ServletException, IOException {// TODO Auto-generated method stubSystem.out.println("service");}}

输出结果:


  2)获取servletName:

@Overridepublic void init(ServletConfig arg0) throws ServletException {// TODO Auto-generated method stub//System.out.println("init");//String user=arg0.getInitParameter("name");//System.out.println("name:"+user);//Enumeration<String> enums=arg0.getInitParameterNames();//while(enums.hasMoreElements()){//System.out.println(enums.nextElement());//}String servletName=arg0.getServletName();System.out.println("servletName:"+servletName);}
输出结果为:

 

  3)获取servletContext(获取servelt上下文):  

        servelt引擎为每个web应用创建了对应的servletContext对象(它实际代表的是当前的web应用),

   servletContext对象被包含在servletConfig对象中,调用servletConfig.getServletContext(),返回servletContext的引用。

        由于一个web应用程序中的所有servelt都共享同一个servletContext对象,所以,servletContext对象又被称为

   application对象(web应用程序对象)。

   3.1)获取当前WEB应用的初始化参数。 

       3.1.1)设置初始化参数:   

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">    <!-- 配置当前WEB应用的参数 -->   <context-param>      <param-name>driver</param-name>      <param-value>com.mysql.jdbc.Driver</param-value>   </context-param>      <context-param>      <param-name>jdbcUrl</param-name>      <param-value>jdbc:mysql://db2</param-value>   </context-param>    <!-- 配置和映射servlet -->  <servlet>  <!-- servlet注册的名字 -->    <servlet-name>helloServlet</servlet-name>    <!-- servlet的全类名-->    <servlet-class>com.sa.servlet.HelloServlet</servlet-class>    <!-- 配置servlet的初始化参数。并且节点必须在load-on-startup之前 -->    <init-param>    <!-- 参数名 -->      <param-name>name</param-name>      <!-- 参数值 -->      <param-value>sasa</param-value>    </init-param>         <init-param>    <!-- 参数名 -->      <param-name>pwd</param-name>      <!-- 参数值 -->      <param-value>123</param-value>    </init-param>  </servlet>    <servlet-mapping>  <!-- 需要和某一个servlet节点的servlet子节点的文本节点一致 -->    <servlet-name>helloServlet</servlet-name>    <!-- 映射具体 的访问路径: /  代表当前web应用的根目录 -->    <url-pattern>*.do</url-pattern>  </servlet-mapping>  </web-app>
     3.1.2)获取初始化参数:

 

package com.sa.servlet;import java.io.IOException;import java.util.Enumeration;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class HelloServlet implements Servlet {     public HelloServlet(){System.out.println("constructor");}@Overridepublic void destroy() {// TODO Auto-generated method stub        System.out.println("destroy");}@Overridepublic ServletConfig getServletConfig() {// TODO Auto-generated method stubSystem.out.println("getServletConfig");return null;}@Overridepublic String getServletInfo() {// TODO Auto-generated method stubSystem.out.println("getServletInfo");return null;}@Overridepublic void init(ServletConfig arg0) throws ServletException {// TODO Auto-generated method stubServletContext context=  arg0.getServletContext();String value1=context.getInitParameter("driver");System.out.println(value1);String value2=context.getInitParameter("jdbcUrl");System.out.println(value2);}@Overridepublic void service(ServletRequest arg0, ServletResponse arg1)throws ServletException, IOException {// TODO Auto-generated method stubSystem.out.println("service");}}
获取输出结果:


   3.2)xml文件里的WEB应用的参数 (context-param),servlet的初始化参数(init-param)区别:

       init-param 是局部的初始化参数,只能在某一个servlet内使用。

       context-param  是全局的初始化参数,能在整个web应用中使用。

   3.3)获取WebRoot下的文件绝对路径:

      3.3.1)在WebRoot下新建一个文件:


   3.3.2)查询绝对路径:

   

package com.sa.servlet;import java.io.IOException;import java.util.Enumeration;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class HelloServlet implements Servlet {     public HelloServlet(){System.out.println("constructor");}@Overridepublic void destroy() {// TODO Auto-generated method stub        System.out.println("destroy");}@Overridepublic ServletConfig getServletConfig() {// TODO Auto-generated method stubSystem.out.println("getServletConfig");return null;}@Overridepublic String getServletInfo() {// TODO Auto-generated method stubSystem.out.println("getServletInfo");return null;}@Overridepublic void init(ServletConfig arg0) throws ServletException {// TODO Auto-generated methodServletContext context=  arg0.getServletContext();        String realPaht=context.getRealPath("/note.txt");        System.out.println(realPaht);}@Overridepublic void service(ServletRequest arg0, ServletResponse arg1)throws ServletException, IOException {// TODO Auto-generated method stubSystem.out.println("service");}}
    3.3.3)查看结果:


   可以看到,获取的是是tomcat服务器里的绝对路径。

  3.4)获取当前WEB应用的名称:

       

package com.sa.servlet;import java.io.IOException;import java.util.Enumeration;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class HelloServlet implements Servlet {     public HelloServlet(){System.out.println("constructor");}@Overridepublic void destroy() {// TODO Auto-generated method stub        System.out.println("destroy");}@Overridepublic ServletConfig getServletConfig() {// TODO Auto-generated method stubSystem.out.println("getServletConfig");return null;}@Overridepublic String getServletInfo() {// TODO Auto-generated method stubSystem.out.println("getServletInfo");return null;}@Overridepublic void init(ServletConfig arg0) throws ServletException {// TODO Auto-generated method stub        ServletContext context=arg0.getServletContext();        String contextPath=context.getContextPath();        System.out.println(contextPath);}@Overridepublic void service(ServletRequest arg0, ServletResponse arg1)throws ServletException, IOException {// TODO Auto-generated method stubSystem.out.println("service");}}
输出结果:

   

  3.5)获取当前WEB应用中某一文件对应的输入流。
        3.5.1)新建文件:

    

      3.5.2) 获取流:

package com.sa.servlet;import java.io.IOException;import java.io.InputStream;import java.util.Enumeration;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class HelloServlet implements Servlet {     public HelloServlet(){System.out.println("constructor");}@Overridepublic void destroy() {// TODO Auto-generated method stub        System.out.println("destroy");}@Overridepublic ServletConfig getServletConfig() {// TODO Auto-generated method stubSystem.out.println("getServletConfig");return null;}@Overridepublic String getServletInfo() {// TODO Auto-generated method stubSystem.out.println("getServletInfo");return null;}@Overridepublic void init(ServletConfig arg0) throws ServletException {// TODO Auto-generated method stubClassLoader classLoader=getClass().getClassLoader();InputStream is=classLoader.getResourceAsStream("jdbc.properties");System.out.println("is:"+is);        ServletContext context=arg0.getServletContext();        InputStream is2=context.getResourceAsStream("/WEB-INF/classes/jdbc.properties");        System.out.println("is2:"+is2);        }@Overridepublic void service(ServletRequest arg0, ServletResponse arg1)throws ServletException, IOException {// TODO Auto-generated method stubSystem.out.println("service");}}
     3.5.3)查看结果:

   
 

原创粉丝点击