JAVA EE 学习笔记[V2 Servlet编程]

 Going on

 Servlet是JSP 的底层。即Java Servlet,它是在服务器上运行的小程序,既然要在服务器端运行,其一般有以下运行过程:

  1. 客户端发送请求至服务器端;
  2. 服务器将请求信息发送至 Servlet;
  3. Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;
  4. 服务器将响应返回给客户端。

  Java Servlet 是运行在带有支持 Java Servlet 规范的解释器的 web 服务器上的 Java 类,是javaEE标准的组成部分之一。与JSP类似,servlet可以生成动态的 Web 页面,它是属于客户与服务器响应的中间层。不过,编写 JSP 和编写 Servlet 相比,前者成本低得多。由于Servlet更偏向于纯编码,所以无法和能嵌入HTML语言当中JSP相比。(当然你要纯编程的话请无视我这句话)

   Servlet的生命周期:

  图中分别出现了 init()方法、service()方法 、destroy()方法:

     1.init() 方法

          Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是您也可以指定 Servlet 在服务器第一次启动时被加载。 init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。 init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。

     2.service()方法

        service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。 每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。 所以您不用对 service() 方法做任何动作,您只需要根据来自客户端的请求类型来重载 doGet() 或 doPost() 即可。doGet() 和 doPost() 方法是每次服务请求中最常用的方法。 GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。

     3.destroy() 方法

只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。 在调用 destroy() 方法之后,servlet 对象被标记为垃圾并被JVM的垃圾回收器回收。

  Servlet在web架构当中的位置:

由图可知,Servlet是Http server和数据库之间的链接。

  既然对Servlet的基本有一定的了解之后继续:

按照惯例:(继续以Myeclipse 2016 CI 4为例)

按照常态我们创建一个web service project

这里记得勾选web.xml(这个是配置文件)

然后创建servlet在SRC目录下:

 

这个时候会看到创建的HelloWorld.java在SRC目录下,且包含在com.nodo包当中,查看HelloWorld的代码为默认代码:

上面有说到Servlet的基本方法,所以:

package com.nodo;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloWorld extends HttpServlet {
    public HelloWorld() {
        super();
    }

    public void destroy() {
        super.destroy(); // Just puts "destroy" string in log
        // Put your code here
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("Hello Wrold!");
        out.flush();
        out.close();
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("Hello Wrold!");
        out.flush();
        out.close();
    }
    public void init() throws ServletException {
        // Put your code here
    }

}

也可以这样:

mport java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// 扩展 HttpServlet 类
public class HelloWorld extends HttpServlet {
 
  private String message;

  public void init() throws ServletException{
      // 执行必需的初始化
      message = "Hello World";
  }

  public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException{
      // 设置响应内容类型
      response.setContentType("text/html");

      // 实际的逻辑是在这里
      PrintWriter out = response.getWriter();
      out.println("<h1>" + message + "</h1>");
  }
  
  public void destroy(){
  }
}

 

搞定这个之后我们对前面添加的xml下手:

 

 

 可以看到这个人自动写了很多,其中包含在<servlet></servlet>中的他自己也说明了:This is the description of my j2ee component.(javaee)的组件描述。

他在里面说明了我创建的HelloWrold.java的一些细节内容。和前面在面板当中所勾选的内容重合,也就是说生成的xml文件是对前面创建时的记录和说明。而在下面的

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

则是说明了访问路径=-=二话不说 按照惯例:

果然:

那得寸进尺了:

 

所以说这个路径可以随便改了,也就是说我的这个HelloWorld.java被映射到了多个URL上,甚至我这样写:

<servlet-mapping>
    <servlet-name>HelloWorld</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

 

就会让所有任意的URL 变得可访问。既然这么多可以访问 ,我可以创建多个servlet文件并改写Servlet-mapping路径。

通过类似方式我们就可实现编码过滤器(我觉得这部分可以单独拿出来再搞事,惯例百度吧。。自己的笔记不怕不怕=-=)

获得JSP内置对象的方法

由于servlet是底层服务程序,因此使用时语法相较JSP更为严格。想要获取其中内置对象,必须在相应的方法中: 例如,获取request和response对象,必须在doGet或doPost等方法中通过参数获取: 

public void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
    //将 request 参数当成 request 对象使用 
    //将 response 参数当成 response 对象使用 
    }

 获取out对象,必须通过response参数获取:

public void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
     response.out.println();
      }  
默认情况下,out 对象是无法打印中文
解决方法:response.setContentType("text/html;charset=gb2312");

  获取session对象,必须通过request参数获取: HttpSession session = request.getSession();

  获得 application 对象 ServletContext application = this.get ServletContext(); //将 application 当成 application 对象来使用

  到这里呢,servlet的基本情况也差不多了,但是深入肯定还是有很多内容的(不想我只个做demo的咸鱼)所以记得W3C。荆轲刺秦王

posted @ 2017-04-05 21:22  KelovpString  阅读(177)  评论(0编辑  收藏  举报