zoukankan      html  css  js  c++  java
  • servlet / jsp(一)

    2016-03-25 11:34:14

    一、实现一个简单的servlet程序

    Servlet是在服务器端运行的小程序,这是一个很广泛的概念,并没有说是在web服务器端运行的小程序,除了在web服务器上运行,还可以在email、ftp服务器上运行,而我们现在介绍的servlet是专门在web服务器端运行的小程序。

     

    servlet-api.jar在tomcat下就有,可以直接复制过来,或者使用maven

    HTTP的请求方式包括DELETE,GET,OPTIONS,POST,PUT和TRACE,在HttpServlet类中分别提供了相应的服务方法,它们是doDelete(),doGet(),doOptions(),doPost(),doPut() 和doTrace(),这里我们使用doGet()。

    package com.nicole.servletDemo01;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class HelloWorldServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("doGet");
            //doGet打印到后台
            resp.getWriter().write("<a href='http://www.baidu.com'>go</a>");
            //在服务器端拿到了输出流向客户端里写一个百度超链接
        }    
    
    }

    然后我们把servlet放到tomcat里面去(当然也可以直接在eclipse中添加服务器run on server)。

    在目录下C:Program FilesApache Software FoundationTomcat 7.0webapps estServletWEB-INF下创建了两个文件夹和一个web.xml

    在classes文件夹,放置HelloWorldServlet.class,注意这里类文件的完整路径是

    C:Program FilesApache Software FoundationTomcat 7.0webapps estServletWEB-INFclassescom icoleservletDemo01,即classes文件夹下还有子文件夹;

    建立一个lib文件夹,将servlet-api.jar包放进去;

    web文件里规定访问途径:

    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
      version="3.0"
      metadata-complete="true">
    
      <servlet>
      <servlet-name>hello</servlet-name>
          <servlet-class>com.nicole.servletDemo01.HelloWorldServlet</servlet-class>
      </servlet>
    
      <servlet-mapping>
      <servlet-name>hello</servlet-name>
      <url-pattern>/helloworld</url-pattern>
      </servlet-mapping>
    </web-app>

    根据url到web.xml中可以找到<url-pattern>(/helloworld)和相应的servlet-name(hello),再根据servlet-name就可以找到servlet-class (com.nicole.testServletDemo01)。

    启动tomcat,输入URL:http://localhost:8080/testServlet/helloworld,可以看到一个百度页面的超链接go。

     

    至于doGet,可以打开日志看到

     

     
    一个HttpServlet容器(这里是tomcat)响应Web客户请求流程如下:
    1)Web客户向servlet容器发出http请求;
    2)Servlet容器解析Web客户的Http请求;
    3)Servlet容器创建一个HttpRequest对象,在这个对象中封装Http请求信息;
    4)Servlet容器创建一个HttpResponse对象;
    5)Servlet容器调用HttpServlet的service方法,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet对象;
    6)HttpServlet调用HttpRequest的有关方法,获取http请求信息;
    7)HttpServlet调用HttpResponse的有关方法,生成响应数据;
    8)servlet容器把HttpServlet的响应结果传给Web客户。

    二、servlet的生命周期

    Servlet生命周期分为三个阶段:

      1,初始化阶段                    调用init()方法

      2,响应客户请求阶段        调用service()方法

      3,终止阶段,释放占用资源 调用destroy()方法

    通过程序验证servlet的生命周期

    package com.nicole.servletDemo02;
    
    import java.io.IOException;
    
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class ServletLifeCycle extends HttpServlet{
    
        public ServletLifeCycle(){
            System.out.println("constructor");
        } 
         
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("doGet");
        }
    
        @Override
        public void destroy() {
            System.out.println("destroy");
        }
    
        @Override
        public void init(ServletConfig config) throws ServletException {
            System.out.println("init");
        }
        
    
    }

    注意到init方法里带有参数Servletconfig。当servlet配置了初始化参数后(就是在web.xml中配置的一些参数),web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。

    在web.xml中配置路径

     <servlet-name>cycle</servlet-name>
          <servlet-class>com.nicole.servletDemo01.ServletLifeCycle</servlet-class>
      </servlet>
    
      <servlet-mapping>
      <servlet-name>cycle</servlet-name>
      <url-pattern>/lifecycle</url-pattern>
      </servlet-mapping>

    输入URL:http://localhost:8080/testServlet/lifecycle,查看日志 “tomcat-stdout.2016-03-23”

     

    多次访问该servlet,可以看到

     

    关闭tomcat,可以看到:

     

    总结servlet执行顺序如下:

    加载:classloader将类加载进来;

    实例化:new一个对象;

    初始化:调用init方法;

    处理请求:对于httpservlet来说,一般就是运行doget、dopost方法;

    退出服务:调用destroy方法;

    并且实例化和初始化只执行了一次,一直只有一个对象提供服务。

  • 相关阅读:
    Java for LeetCode 052 N-Queens II
    Java for LeetCode 051 N-Queens
    Java for LeetCode 050 Pow(x, n)
    Java for LeetCode 049 Anagrams
    15-[JavaScript]-ECMAScript 1
    4-观看答辩有感
    51-小米官网
    14-HTML-CSS案例
    13-[CSS]-postion位置:相relative,绝absolute,固fixed,static(默认),z-index
    12-[CSS]-margin塌陷,margin 0 auto,善用父级的padding
  • 原文地址:https://www.cnblogs.com/kanhaiba/p/5358563.html
Copyright © 2011-2022 走看看