Java匹馬行天下之JavaWeb核心技術——Servlet

Servlet

1、什麼是Servlet?

Servlet是在服務器上運行的小程序,也就是一個Java類,但比較特殊,不須要new,自動就能夠運行。也有建立、垃圾回收和銷燬過程。Servlet是JavaWeb的三大組件之一(Servlet、Filter、Listener),它屬於動態資源。Servlet的做用是處理請求,服務器會把接收到的請求交給Servlet來處理,在Servlet中一般須要:html

  • 接收請求數據;
  • 處理請求;
  • 完成響應。

例如客戶端發出登陸請求,或者輸出註冊請求,這些請求都應該由Servlet來完成處理。Servlet須要咱們本身來編寫,每一個Servlet必須實現javax.servlet.Servlet接口。Servlet對象駐留在服務器內存中。java

 

一、編寫一個Servlet程序

       寫一個java類,實現Servlet接口,實現了該接口,該類就不是普通的類了。web

 

 

package servletdemo;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/servlet")
public class servletDemo implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("Hello Servlet");

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

  

部署應用到tomcat服務器。小程序

 

 

 測試:http://localhost:8080/MyMavenHome_war/servlet  在IDEA控制檯輸出 hello servlet,初體驗成功!

 

 

2、Servlet的生命週期

實例化-->初始化-->服務->銷燬設計模式

      出生:(實例化-->初始化)第一次訪問Servlet就出生了(默認狀況下)。(說明我能夠改變它的出生時機,好比讓servlet在服務器啓動時就建立)數組

      活着:(服務)應用活着,servlet就活着。(Servlet是單實例,其中的service()方法是多線程的。)瀏覽器

      死亡:(銷燬)應用被卸載了,servlet就銷燬了。tomcat

package servletdemo;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/servlet")
public class servletDemo implements Servlet {

    //Servlet生命週期的方法:實例化方法(new 對象,無參構造)
    //在servlet第一次被訪問時調用
    public servletDemo() {
        System.out.println("*******servletDemo執行了");
    }

    //Servlet生命週期的方法:初始化方法
    //在servlet第一次被訪問時調用
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("*********init執行了");

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    //Servlet生命週期的方法:服務方法
    //每次訪問時都會被調用
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("*******service執行了");
    }


    @Override
    public String getServletInfo() {
        return null;
    }

    //Servlet生命週期的方法:銷燬方法
    //當應用被卸載時調用
    @Override
    public void destroy() {
        System.out.println("*******destroy執行了");
    }
}

  

 

3、實現Servlet的方式

實現Servlet有三種方式:安全

  •  實現javax.servlet.Servlet接口;
  • 繼承javax.servlet.GenericServlet類;
  • 繼承javax.servlet.http.HttpServlet類;

自定義Servlet類的繼承結構,以下圖:服務器

 

 

 

 一、實現javax.servlet.Servlet接口(參見:編寫一個servlet程序)

 二、繼承javax.servlet.GenericServlet類(抽象類)(適配器模式)

    GenericServlet類(抽象類)已經實現了Servlet接口,咱們用哪一個方法就調用哪方法,不用再去所有實現了,哪怕是所有的空實現。

 

 

三、繼承javax.servlet.http.HttpServlet(抽象類)(模板方法設計模式)

    模板是HttpServlet類中的私有service()方法(開發中經常使用方式)
    HttpServlet類(抽象類)繼承了GenericServlet類(抽象類)
 
package servletdemo;

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

@WebServlet("/servlet1")
public class servlet extends HttpServlet {
    //具體實現1
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("******MydoGet*******");
        System.out.println(req.getRemoteAddr());
    }

    //具體實現2
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("*******MydoPost******");
    }

}

  

 

 

 

     注意: 不要重寫父類Httpservlet中的service()方法,由於該方法會調用Httpservlet中私有的service()方法,

          而該私有的service()方法會根據不一樣的提交表單的方式,會調用相應的doGet()、doPost()、doHead()等方法。

          咱們去重寫這些不一樣的表單提交的方法便可。

       Servlet(接口) --> GenericServlet(抽象類/適配器) --> HttpServlet(功能抽象類/模板) --> (繼承HttpServlet,具體實現類,重寫其功能)
 

四、公牛表白的故事

    

此故事純屬本人腦洞虛構

故事內容:草原上有一頭公牛喜歡一頭母牛,可是公牛不敢直接向母牛表白,有一天公牛找到一頭小牛,想讓小牛把他想對母牛說的話說給母牛聽,小牛答應了,劇情很雞血,就這樣,看我用servlet實現

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>公牛表白準備</h2>
<a href="/servlet2">去表白</a>
</body>
</html>

  

 

 

package com.demo.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/servlet2")
public class ServletDemo2 extends GenericServlet {
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("我是草原上的公牛");
        System.out.println("我讓小牛把我對母牛的愛傳給她");
        System.out.println("該說的話我給小牛說了,小牛聽到了給我回復收到,並把我說的話傳給母牛");
        ServletContext application = this.getServletContext();
        application.setAttribute("name","母牛");
        application.getRequestDispatcher("/servlet3").forward(req,res);
        
    }
}

  

 

 

package com.demo.servlet;

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

@WebServlet("/servlet3")
public class ServletDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        doPost(req,resp);
        System.out.println("我是小牛");
        //設置輸出格式和字符編碼
        resp.setContentType("text/html;charset=utf-8");
        //向頁面輸出內容
        PrintWriter out = resp.getWriter();
        out.println("<h1>我是小牛</h1>");
        ServletContext application = this.getServletContext();
        String name = (String) application.getAttribute("name");
        System.out.println("收到的名字:"+name);
        out.println("收到的名字:"+name);
        System.out.println("小牛收到");
        application.setAttribute("love","公牛說他愛你");
        application.getRequestDispatcher("/servlet4").forward(req,resp);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("我是dopost");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        out.println("<h1>我是servlet33</h1>");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.service(req, resp);
        System.out.println("我是service333");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        out.println("<h1>我是servlet333</h1>");
    }
}

  

 

package com.demo.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/servlet4")
public class Servlet4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
        System.out.println("我是母牛");
        String love = (String) this.getServletContext().getAttribute("love");
        System.out.println(love);
        resp.setContentType("text/html;charset=utf-8");
        //向頁面輸出內容
        PrintWriter out = resp.getWriter();
        out.println("收到的表白:"+love);
        System.out.println("母牛收到");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

  五、servlet的映射細節

      一、servlet的映射細節一:

一個servlet能夠配置多個映射路徑(或者說:多個映射路徑能夠指向同一個servlet),只要是name是同樣的就行

 

                     二、servlet的映射細節二:     

 通配符表明任意字符串

        url-pattern*.xxx     .xxx結尾的請求均可以訪問  注:不要加/

        url-pattern/*        任意字符串結尾的請求均可以訪問

        url-pattern/xxxx/*   /xxxx/開頭的請求均可以訪問

 

六、對servlet配置有兩種方法

一、在web.xml中對servlet進行配置

二、利用註解進行配置

     在servlet類的上面寫入註解@WebServlet("/hello")

七、實例一——在web.xml中配置

一、在Web.xml中配置路徑和參數

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>Servletdemo1</servlet-name>
    <servlet-class>com.demo.servlet.Servletdemo1</servlet-class>
    <init-param>
      <param-name>name</param-name>
      <param-value>tom</param-value>
    </init-param>
    <init-param>
      <param-name>password</param-name>
      <param-value>1234</param-value>
    </init-param>

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

  <context-param>
    <param-name>k</param-name>
    <param-value>xxxxxxxx</param-value>
  </context-param>
</web-app>

  

 

二、在servlet中獲取參數和值

package com.demo.servlet;

import javax.servlet.*;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;


public class Servletdemo1 implements Servlet {
    private  ServletConfig servletConfig;

    @Override
    public void init(ServletConfig config) throws ServletException {
        servletConfig=config;
        System.out.println("init調用了");

    }

    @Override
    public ServletConfig getServletConfig() {
        return servletConfig;
    }

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        //設置輸出格式和字符編碼
        res.setContentType("text/html;charset=utf-8");
        //向頁面輸出內容
        PrintWriter out = res.getWriter();
        out.println("我是service"+"<br>");
        System.out.println("我是service");

        //方法一
        String name = servletConfig.getInitParameter("name");
        String password = servletConfig.getInitParameter("password");

        System.out.println("在控制檯輸出信息:");
        System.out.println("name:"+name+"password:"+password);

        out.println("name:"+name+" "+"password:"+password+"<br>");

        //方法二
        Enumeration<String> en = servletConfig.getInitParameterNames();
        while (en.hasMoreElements()){
            String names = en.nextElement();
            String values = servletConfig.getInitParameter(names);

            System.out.println("在控制檯輸出信息:");
            System.out.println(names+" "+values);
            out.println(names+" "+values+"<br>");
        }

        String k = servletConfig.getServletContext().getInitParameter("k");
        System.out.println("在控制檯輸出信息:");
        System.out.println("k:"+k+"<br>");
        out.println("k"+k);
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

  

 

 

八、實例二——利用註解配置

package com.demo.servlet;

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

@WebServlet("/hello")
public class Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
        ServletContext servletContext = this.getServletContext();
        servletContext.setAttribute("user","Tom");
        String user = (String)servletContext.getAttribute("user");

        //從請求的地址欄或表單中獲取信息
        String user2 = req.getParameter("user");

        System.out.println("獲取Context容器中的信息:"+user);
        System.out.println("在控制檯輸出從訪問的地址欄獲取的信息:"+user2);
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");

        PrintWriter out = resp.getWriter();
        out.append("<!DOCTYPE html>")
                .append("<html><head></head><body>")
                .append("用戶是"+user)
                .append("</body></html>");

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

  

 

 

4、Servlet的線程安全

    整個生命週期是單實例,每次訪問時爲多線程。

      一:單實例變成多實例,但過期了,由於耗費資源多,服務器壓力大。

      二:加線程鎖,但數據會重複出現(沒有同步機制),且運行效率低。

      三:解決線程安全問題的最佳辦法:不要寫全局變量,而寫局部變量(即改變變量的做用域)。
 

5、ServletContext對象(重要)

    ServletContext: 表明的是整個應用。一個應用只有一個ServletContext對象。單實例。

 

一個項目只有一個ServletContext對象,服務器會爲每一個應用建立一個ServletContext對象,咱們能夠在N多個Servlet中來獲取這個惟一的對象,使用它能夠給多個Servlet傳遞數據,與Tomcat同生同死。

 

  • ServletContext對象的建立是在服務器啓動時完成的;
  • ServletContext對象的銷燬是在服務器關閉時完成的。

 

ServletContext對象的做用是在整個Web應用的動態資源直接共享數據。例如在AServlet中向ServletContext對象中保存一個值,而後在BServlet中就能夠獲取這個值,這就是數據共享。

一、獲取ServletContext

在Servlet中獲取ServletContext對象:

  •  在void init(ServletConfig config)中:

ServletContext context = config.getServletContext();

public class DemoServlet implements Servlet {

    public void init(ServletConfig config) throws ServletException {

       ServletContext context = config.getServletContext();

    }

}

  

  • GenericServlet類有getServletContext()方法,因此能夠直接使用this.getServletContext()類獲取。 在GenericServlet或HttpServlet中獲取ServletContext對象:
public class HttpServletDemo extends HttpServlet {

    @Override

    protected void doPost(HttpServletRequest req, HttpServletResponse resp)

           throws ServletException, IOException {

       ServletContext context = this.getServletContext();

    }

}

  

  •   HttpSession中也能夠經過getServletContext()方法來得到

 

二、域對象的功能

ServletContext是JavaWeb四大域對象之一:

  •  PageContext
  •  ServletRequest
  •  HttpSession
  •  ServletContext

全部域對象都是有存取數據的功能,由於域對象內部有一個Map,用來存儲數據,下面是ServletContext對象用來操做數據的方法:

  •  void setAttribute(String name,Object val):用來存儲一個對象,也能夠成爲存儲一個域,參數分別爲域的屬性名和屬性值,若是屢次調用該方法,而且使用相同的name,那麼就會覆蓋上一次的值,這一特性與Map類似。
  •  Object getAttribute(String name):用來獲取ServletContext中的數據,當前在獲取以前須要先存儲。
  •  void removeAttribute(String name):用來移除ServletContext中的域屬性,若是參數name不存在,那麼該方法什麼都不作。
  •  Enumeration getAttributeNames():獲取全部域屬性的名稱。
 

 

2獲取全局配置信息:

 方法:public String getInitParamenter(String name) // 根據配置文件中的key獲得value

 

三、讀取簡單的資源文件(即只包含key=value的形式):

    方法:public String getRealPath(String path)// 根據資源名稱獲得資源的絕對路徑,能夠獲得當前應用任何位置的任何資源。

 

public class AServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		//獲取帶有盤符的路徑
		String path = this.getServletContext().getRealPath("/a.txt");
		
		//獲取資源路徑後,再獲取輸入流對象
		InputStream is = this.getServletContext().getResourceAsStream("/a.txt");
		
		//獲取當前路徑下的全部資源路徑
		Set<String> paths = this.getServletContext().getResourcePaths("/WEB-INF");
		
	}
}

 

 

四、Servlet的轉發與重定向

 轉發和重定向都能讓瀏覽器得到另一個URL所指向的資源,但二者的內部運行機制有着很大的區別。

一、轉發:有兩種方式得到轉發對象(RequestDispatcher):一種是經過HttpServletRequest的getRequestDispatcher()方法得到,一種是經過ServletContext的getRequestDispatcher()方法得到;

     之前的request範圍中存放的變量不會失效,就像把兩個頁面拼到了一塊兒。 例如:

request.getRequestDispatcher (「demo.jsp"). forward(request, response);//轉發到demo.jsp

     詳解:假設瀏覽器訪問servlet1,而servlet1想讓servlet2爲客戶端服務。此時servlet1調用forward()方法,將請求轉發給servlet2。可是調用forward()方法,對於瀏覽器來講是透明的,瀏覽器並不知道爲其服務的Servlet已經換成Servlet2,它只知道發出了一個請求,得到了一個響應。瀏覽器URL的地址欄不變。

二、重定向:HttpServletResponse的sendRedirect()方法。

     服務器根據此請求尋找資源併發送給客戶,它能夠重定向到任意URL,不能共享request範圍內的數據。例如:response.sendRedirect(「demo.jsp");//重定向到demo.jsp

     詳解:假設瀏覽器訪問servlet1,而servlet1想讓servlet2爲客戶端服務。此時servlet1調用sendRedirect()方法,將客戶端的請求從新定向到Servlet2。接着瀏覽器訪問servlet2,servlet2對客戶端請求做出反應。瀏覽器URL的地址欄改變。

三、主要區別:

(1)sendRedirect()方法不但能夠在位於同一個主機上的不一樣Web應用程序之間進行重定向,並且能夠將客戶端重定向到其餘服務器上的Web應用程序資源。而forward()方法只能將請求轉發給同一Web應用的組件。

(2)sendRedirect()方法不能轉發到「/WEB-INF/」路徑下的jsp頁面資源,而getRequestDispatcher().forword()能夠重定向到「/WEB-INF/」路徑下的jsp頁面資源。如 request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);

(3)轉發:瀏覽器URL的地址欄不變。

        重定向:瀏覽器URL的地址欄改變。

 

 

五、實現Servlet的請求轉發:

    方法:public RequestDispatcher getRequestDispatcher(String path) //參數表示要跳轉到哪去

 

 

 

 

六、依賴和關聯

      若是是經過參數傳過來的對象,就叫依賴。

     經過方法獲得的對象,就叫關聯。

 

6、HTTP請求與響應

一、HTTP請求經常使用方法

Cookie[] getCookies()
返回一個數組,包含客戶端發送該請求的全部的 Cookie 對象。

Enumeration getAttributeNames()
返回一個枚舉,包含提供給該請求可用的屬性名稱。

HttpSession getSession()
返回與該請求關聯的當前 session 會話,或者若是請求沒有 session 會話,則建立一個。

HttpSession getSession(boolean create)
返回與該請求關聯的當前 HttpSession,或者若是沒有當前會話,且建立是真的,則返回一個新的 session 會話。

String getRequestedSessionId()
返回由客戶端指定的 session 會話 ID。

Object getAttribute(String name)
以對象形式返回已命名屬性的值,若是沒有給定名稱的屬性存在,則返回 null。

String getCharacterEncoding()
返回請求主體中使用的字符編碼的名稱。

String getContentType()
返回請求主體的 MIME 類型,若是不知道類型則返回 null。

String getContextPath()
返回指示請求上下文的請求 URI 部分。

String getQueryString()
返回包含在路徑後的請求 URL 中的查詢字符串。

String getRemoteUser()
若是用戶已經過身份驗證,則返回發出請求的登陸用戶,或者若是用戶未經過身份驗證,則返回 null。

int getParameterMap()
將參數封裝成 Map 類型。

 

二、設置HTTP響應頭的方法

void reset()
清除緩衝區中存在的任何數據,包括狀態碼和頭。

void resetBuffer()
清除響應中基礎緩衝區的內容,不清除狀態碼和頭。

void setCharacterEncoding(String charset)
設置被髮送到客戶端的響應的字符編碼(MIME 字符集)例如,UTF-8。

void setStatus(int sc)
爲該響應設置狀態碼。

void setIntHeader(String name, int value)
設置一個帶有給定的名稱和整數值的響應報頭。

HTTP Header 響應實例:

 

//導入必需的 java 庫
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Refresh")
//擴展 HttpServlet 類
public class Refresh extends HttpServlet {
    // 處理 GET 方法請求的方法
      public void doGet(HttpServletRequest request,
                        HttpServletResponse response)
                throws ServletException, IOException
      {
          // 設置刷新自動加載時間爲 5 秒
          response.setIntHeader("Refresh", 5);
          // 設置響應內容類型
          response.setContentType("text/html;charset=UTF-8");
         
          //使用默認時區和語言環境得到一個日曆  
          Calendar cale = Calendar.getInstance();  
          //將Calendar類型轉換成Date類型  
          Date tasktime=cale.getTime();  
          //設置日期輸出的格式  
          SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
          //格式化輸出  
          String nowTime = df.format(tasktime);
          PrintWriter out = response.getWriter();
          String title = "自動刷新 Header 設置 - 菜鳥教程實例";
          String docType =
          "<!DOCTYPE html>\n";
          out.println(docType +
            "<html>\n" +
            "<head><title>" + title + "</title></head>\n"+
            "<body bgcolor=\"#f0f0f0\">\n" +
            "<h1 align=\"center\">" + title + "</h1>\n" +
            "<p>當前時間是:" + nowTime + "</p>\n");
      }
      // 處理 POST 方法請求的方法
      public void doPost(HttpServletRequest request,
                         HttpServletResponse response)
          throws ServletException, IOException {
         doGet(request, response);
      }
}

 

  以上測試實例是位於 TomcatTest 項目下,對應的 web.xml 配置爲:

<?xml version="1.0" encoding="UTF-8"?>  
<web-app>  
  <servlet>  
     <!-- 類名 -->  
    <servlet-name>Refresh</servlet-name>  
    <!-- 所在的包 -->  
    <servlet-class>com.runoob.test.Refresh</servlet-class>  
  </servlet>  
  <servlet-mapping>  
    <servlet-name>Refresh</servlet-name>  同上面的類名
    <!-- 訪問的網址 -->  
    <url-pattern>/TomcatTest/Refresh</url-pattern>  
    </servlet-mapping>  
</web-app> 

  如今,調用上面的 Servlet,每隔 5 秒會顯示當前系統時間。

三、HTTP狀態碼

404:服務器沒法找到所請求的頁面。

403:禁止訪問所請求的頁面。

401:所請求的頁面須要用戶名和密碼。

405:在請求中指定的方法是不容許的。

307:所請求的頁面已經臨時轉移到一個新的 URL。

500:未完成的請求。服務器遇到了一個意外的狀況。

  下面的方法可用於在 Servlet 程序中設置 HTTP 狀態碼。這些方法經過 HttpServletResponse 對象可用。

public void setStatus ( int statusCode )
該方法設置一個任意的狀態碼。setStatus 方法接受一個 int(狀態碼)做爲參數。若是您的反應包含了一個特殊的狀態碼和文檔,請確保在使用 PrintWriter 實際返回任何內容以前調用 setStatus。

public void sendError(int code, String message)
該方法發送一個狀態碼(一般爲 404),連同一個在 HTML 文檔內部自動格式化併發送到客戶端的短消息。

 

 

// 設置錯誤代碼和緣由
response.sendError(407, "Need authentication!!!" );

  

 

四、Servlet接口&訪問方式介紹

 

  Servlet是實現了javax.servlet.Servlet接口的類,這個接口規定了特定的方法來處理特定的請求,咱們只須要實現Servlet相關的方法,Servlet規範是創建在HTTP協議上的,http1.1規範支持OPTIONS/GET/POST/HEAD/PUT/DELETE/TRACE等7種訪問方式。下面咱們重點介紹Get/Post。

 

一、GET:表示查詢信息,URL中附帶少許參數信息,URL總長度不超過255個字符,參數還會在瀏覽器的地址欄中顯示

 

二、POST:表示提交信息,通常用於提交大數據信息或者文件,提交的內容不收長度限制,也不會在地址欄中顯示。

 

 

四、OPTIONS /PUT /DELETE /TRACE:是被聲明瞭但尚未被使用web訪問方式,幾乎不用。

相關文章
相關標籤/搜索