最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Servlet開發(fā)JavaWeb工程示例詳解

 更新時間:2020年07月21日 15:19:49   作者:泰斗賢若如  
這篇文章主要介紹了Servlet開發(fā)JavaWeb工程示例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、什么是Servlet?

Servlet是在服務器上運行的小程序,也就是一個Java類,但比較特殊,不需要new,自動就可以運行。也有創(chuàng)建、垃圾回收和銷毀過程。Servlet是JavaWeb的三大組件之一(Servlet、Filter、Listener),它屬于動態(tài)資源。Servlet的作用是處理請求,服務器會把接收到的請求交給Servlet來處理,在Servlet中通常需要:

  • 接收請求數(shù)據(jù);
  • 處理請求;
  • 完成響應。

例如客戶端發(fā)出登錄請求,或者輸出注冊請求,這些請求都應該由Servlet來完成處理。Servlet需要我們自己來編寫,每個Servlet必須實現(xiàn)javax.servlet.Servlet接口。Servlet對象駐留在服務器內(nèi)存中。

1、編寫一個Servlet程序

寫一個java類,實現(xiàn)Servlet接口,實現(xiàn)了該接口,該類就不是普通的類了。

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,初體驗成功!

二、Servlet的生命周期

實例化-->初始化-->服務->銷毀

      出生:(實例化-->初始化)第一次訪問Servlet就出生了(默認情況下)。(說明我可以改變它的出生時機,比如讓servlet在服務器啟動時就創(chuàng)建)

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

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

package servletdemo;
 
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/servlet")
public class servletDemo implements Servlet {
 
  //Servlet生命周期的方法:實例化方法(new 對象,無參構(gòu)造)
  //在servlet第一次被訪問時調(diào)用
  public servletDemo() {
    System.out.println("*******servletDemo執(zhí)行了");
  }
 
  //Servlet生命周期的方法:初始化方法
  //在servlet第一次被訪問時調(diào)用
  @Override
  public void init(ServletConfig servletConfig) throws ServletException {
    System.out.println("*********init執(zhí)行了");
 
  }
 
  @Override
  public ServletConfig getServletConfig() {
    return null;
  }
 
  //Servlet生命周期的方法:服務方法
  //每次訪問時都會被調(diào)用
  @Override
  public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    System.out.println("*******service執(zhí)行了");
  }
 
 
  @Override
  public String getServletInfo() {
    return null;
  }
 
  //Servlet生命周期的方法:銷毀方法
  //當應用被卸載時調(diào)用
  @Override
  public void destroy() {
    System.out.println("*******destroy執(zhí)行了");
  }
}
 

三、實現(xiàn)Servlet的方式

實現(xiàn)Servlet有三種方式:

  • 實現(xiàn)javax.servlet.Servlet接口;
  • 繼承javax.servlet.GenericServlet類;
  • 繼承javax.servlet.http.HttpServlet類;

自定義Servlet類的繼承結(jié)構(gòu),如下圖:

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

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

GenericServlet類(抽象類)已經(jīng)實現(xiàn)了Servlet接口,我們用哪個方法就調(diào)用哪方法,不用再去全部實現(xiàn)了,哪怕是全部的空實現(xiàn)。

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

模板是HttpServlet類中的私有service()方法(開發(fā)中常用方式)    

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 {
  //具體實現(xiàn)1
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("******MydoGet*******");
    System.out.println(req.getRemoteAddr());
  }
 
  //具體實現(xiàn)2
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("*******MydoPost******");
  }
 
}

 注意:不要重寫父類Httpservlet中的service()方法,因為該方法會調(diào)用Httpservlet中私有的service()方法,

   而該私有的service()方法會根據(jù)不同的提交表單的方式,會調(diào)用相應的doGet()、doPost()、doHead()等方法。

    我們?nèi)ブ貙戇@些不同的表單提交的方法即可。

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

4、公牛表白的故事

此故事純屬本人腦洞虛構(gòu)

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

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>公牛表白準備</h2>
<a href="/servlet2" rel="external nofollow" >去表白</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("我是小牛");
    //設(shè)置輸出格式和字符編碼
    resp.setContentType("text/html;charset=utf-8");
    //向頁面輸出內(nèi)容
    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");
    //向頁面輸出內(nèi)容
    PrintWriter out = resp.getWriter();
    out.println("收到的表白:"+love);
    System.out.println("母牛收到");
  }
 
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 
  }
}

5、servlet的映射細節(jié)    

 1、servlet的映射細節(jié)一:

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

2、servlet的映射細節(jié)二:

 通配符*代表任意字符串

url-pattern:*.xxx 以.xxx結(jié)尾的請求都可以訪問 注:不要加/

url-pattern:/* 以任意字符串結(jié)尾的請求都可以訪問

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

 

6、對servlet配置有兩種方法

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

2、利用注解進行配置

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

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

1、在Web.xml中配置路徑和參數(shù)

<!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>

2、在servlet中獲取參數(shù)和值

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調(diào)用了");
 
  }
 
  @Override
  public ServletConfig getServletConfig() {
    return servletConfig;
  }
 
  @Override
  public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    //設(shè)置輸出格式和字符編碼
    res.setContentType("text/html;charset=utf-8");
    //向頁面輸出內(nèi)容
    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() {
 
  }
}

8、實例二——利用注解配置

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 {
 
  }
}
 

四、Servlet的線程安全

    整個生命周期是單實例,但每次訪問時為多線程。

      一:單實例變成多實例,但過時了,因為耗費資源多,服務器壓力大。

      二:加線程鎖,但數(shù)據(jù)會重復出現(xiàn)(沒有同步機制),且運行效率低。

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

五、ServletContext對象(重要)

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

一個項目只有一個ServletContext對象,服務器會為每個應用創(chuàng)建一個ServletContext對象,我們可以在N多個Servlet中來獲取這個唯一的對象,使用它可以給多個Servlet傳遞數(shù)據(jù),與Tomcat同生同死。

  • ServletContext對象的創(chuàng)建是在服務器啟動時完成的
  • ServletContext對象的銷毀是在服務器關(guān)閉時完成的。

ServletContext對象的作用是在整個Web應用的動態(tài)資源直接共享數(shù)據(jù)。例如在AServlet中向ServletContext對象中保存一個值,然后在BServlet中就可以獲取這個值,這就是數(shù)據(jù)共享。

1、獲取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類有g(shù)etServletContext()方法,所以可以直接使用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()方法來獲得

2、域?qū)ο蟮墓δ?

ServletContext是JavaWeb四大域?qū)ο笾唬?/p>

  • PageContext
  • ServletRequest
  • HttpSession
  • ServletContext

所有域?qū)ο蠖际怯写嫒?shù)據(jù)的功能,因為域?qū)ο髢?nèi)部有一個Map,用來存儲數(shù)據(jù),下面是ServletContext對象用來操作數(shù)據(jù)的方法:

void setAttribute(String name,Object val):用來存儲一個對象,也可以成為存儲一個域,參數(shù)分別為域的屬性名和屬性值,如果多次調(diào)用該方法,并且使用相同的name,那么就會覆蓋上一次的值,這一特性與Map相似。Object getAttribute(String name):用來獲取ServletContext中的數(shù)據(jù),當前在獲取之前需要先存儲。void removeAttribute(String name):用來移除ServletContext中的域?qū)傩裕绻麉?shù)name不存在,那么該方法什么都不做。Enumeration getAttributeNames():獲取所有域?qū)傩缘拿Q。

2.獲取全局配置信息:

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

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

  方法:public StringgetRealPath(Stringpath)//根據(jù)資源名稱得到資源的絕對路徑,可以得到當前應用任何位置的任何資源。

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");
     
  }
}

4、Servlet的轉(zhuǎn)發(fā)與重定向

轉(zhuǎn)發(fā)和重定向都能讓瀏覽器獲得另外一個URL所指向的資源,但兩者的內(nèi)部運行機制有著很大的區(qū)別。

1、轉(zhuǎn)發(fā):有兩種方式獲得轉(zhuǎn)發(fā)對象(RequestDispatcher):一種是通過HttpServletRequest的getRequestDispatcher()方法獲得,一種是通過ServletContext的getRequestDispatcher()方法獲得;

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

request.getRequestDispatcher (“demo.jsp"). forward(request, response);//轉(zhuǎn)發(fā)到demo.jsp

詳解:假設(shè)瀏覽器訪問servlet1,而servlet1想讓servlet2為客戶端服務。此時servlet1調(diào)用forward()方法,將請求轉(zhuǎn)發(fā)給servlet2。但是調(diào)用forward()方法,對于瀏覽器來說是透明的,瀏覽器并不知道為其服務的Servlet已經(jīng)換成Servlet2,它只知道發(fā)出了一個請求,獲得了一個響應。瀏覽器URL的地址欄不變。

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

服務器根據(jù)此請求尋找資源并發(fā)送給客戶,它可以重定向到任意URL,不能共享request范圍內(nèi)的數(shù)據(jù)。例如:response.sendRedirect(“demo.jsp");//重定向到demo.jsp

詳解:假設(shè)瀏覽器訪問servlet1,而servlet1想讓servlet2為客戶端服務。此時servlet1調(diào)用sendRedirect()方法,將客戶端的請求重新定向到Servlet2。接著瀏覽器訪問servlet2,servlet2對客戶端請求作出反應。瀏覽器URL的地址欄改變。

3、主要區(qū)別:

(1)sendRedirect()方法不但可以在位于同一個主機上的不同Web應用程序之間進行重定向,而且可以將客戶端重定向到其他服務器上的Web應用程序資源。而forward()方法只能將請求轉(zhuǎn)發(fā)給同一Web應用的組件。

(2)sendRedirect()方法不能轉(zhuǎn)發(fā)到“/WEB-INF/”路徑下的jsp頁面資源,而getRequestDispatcher().forword()可以重定向到“/WEB-INF/”路徑下的jsp頁面資源。如request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);

(3)轉(zhuǎn)發(fā):瀏覽器URL的地址欄不變。

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

5、實現(xiàn)Servlet的請求轉(zhuǎn)發(fā):

    方法:public RequestDispatchergetRequestDispatcher(String path)//參數(shù)表示要跳轉(zhuǎn)到哪去

6、依賴和關(guān)聯(lián)

  如果是通過參數(shù)傳過來的對象,就叫依賴。

  通過方法得到的對象,就叫關(guān)聯(lián)。

六、HTTP請求與響應

1、HTTP請求常用方法

Cookie[] getCookies()
返回一個數(shù)組,包含客戶端發(fā)送該請求的所有的 Cookie 對象。

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

HttpSession getSession()
返回與該請求關(guān)聯(lián)的當前 session 會話,或者如果請求沒有 session 會話,則創(chuàng)建一個。

HttpSession getSession(boolean create)
返回與該請求關(guān)聯(lián)的當前 HttpSession,或者如果沒有當前會話,且創(chuàng)建是真的,則返回一個新的 session 會話。

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

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

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

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

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

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

String getRemoteUser()
如果用戶已通過身份驗證,則返回發(fā)出請求的登錄用戶,或者如果用戶未通過身份驗證,則返回 null。

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

2、設(shè)置HTTP響應頭的方法

void reset()
清除緩沖區(qū)中存在的任何數(shù)據(jù),包括狀態(tài)碼和頭。

void resetBuffer()
清除響應中基礎(chǔ)緩沖區(qū)的內(nèi)容,不清除狀態(tài)碼和頭。

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

void setStatus(int sc)
為該響應設(shè)置狀態(tài)碼。

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

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
   {
     // 設(shè)置刷新自動加載時間為 5 秒
     response.setIntHeader("Refresh", 5);
     // 設(shè)置響應內(nèi)容類型
     response.setContentType("text/html;charset=UTF-8");
     
     //使用默認時區(qū)和語言環(huán)境獲得一個日歷 
     Calendar cale = Calendar.getInstance(); 
     //將Calendar類型轉(zhuǎn)換成Date類型 
     Date tasktime=cale.getTime(); 
     //設(shè)置日期輸出的格式 
     SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     //格式化輸出 
     String nowTime = df.format(tasktime);
     PrintWriter out = response.getWriter();
     String title = "自動刷新 Header 設(shè)置 - 菜鳥教程實例";
     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> 同上面的類名
  <!-- 訪問的網(wǎng)址 --> 
  <url-pattern>/TomcatTest/Refresh</url-pattern> 
  </servlet-mapping> 
</web-app>

現(xiàn)在,調(diào)用上面的 Servlet,每隔 5 秒會顯示當前系統(tǒng)時間。

3、HTTP狀態(tài)碼

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

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

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

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

307:所請求的頁面已經(jīng)臨時轉(zhuǎn)移到一個新的 URL。

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

  下面的方法可用于在 Servlet 程序中設(shè)置 HTTP 狀態(tài)碼。這些方法通過HttpServletResponse對象可用。

public void setStatus ( int statusCode )
該方法設(shè)置一個任意的狀態(tài)碼。setStatus 方法接受一個 int(狀態(tài)碼)作為參數(shù)。如果您的反應包含了一個特殊的狀態(tài)碼和文檔,請確保在使用PrintWriter實際返回任何內(nèi)容之前調(diào)用 setStatus。

public void sendError(int code, String message)
該方法發(fā)送一個狀態(tài)碼(通常為 404),連同一個在 HTML 文檔內(nèi)部自動格式化并發(fā)送到客戶端的短消息。

// 設(shè)置錯誤代碼和原因
response.sendError(407, "Need authentication!!!" );

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

  Servlet是實現(xiàn)了javax.servlet.Servlet接口的類,這個接口規(guī)定了特定的方法來處理特定的請求,我們只需要實現(xiàn)Servlet相關(guān)的方法,Servlet規(guī)范是建立在HTTP協(xié)議上的,http1.1規(guī)范支持OPTIONS/GET/POST/HEAD/PUT/DELETE/TRACE等7種訪問方式。下面我們重點介紹Get/Post。

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

2、POST:表示提交信息,一般用于提交大數(shù)據(jù)信息或者文件,提交的內(nèi)容不收長度限制,也不會在地址欄中顯示。

3、HEAD:表示查詢文檔頭信息,服務器返回的文件類型,長度,最后修改時間等等,該方式較少使用。

4、OPTIONS /PUT /DELETE /TRACE:是被聲明了但還沒有被使用web訪問方式,幾乎不用。

到此這篇關(guān)于Servlet開發(fā)JavaWeb工程示例詳解的文章就介紹到這了,更多相關(guān)Servlet開發(fā)JavaWeb內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入理解Mybatis中的resultType和resultMap

    深入理解Mybatis中的resultType和resultMap

    這篇文章給大家介紹了mybatis中的resultType和resultMap的用法實例講解,MyBatis中在查詢進行select映射的時候,返回類型可以用resultType,也可以用resultMap,至于兩種用法區(qū)別,通過本文一起學習吧
    2016-09-09
  • 快速搭建Spring Boot+MyBatis的項目IDEA(附源碼下載)

    快速搭建Spring Boot+MyBatis的項目IDEA(附源碼下載)

    這篇文章主要介紹了快速搭建Spring Boot+MyBatis的項目IDEA(附源碼下載),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Java如何通過反射獲取Constructor、Field、Method對象

    Java如何通過反射獲取Constructor、Field、Method對象

    反射指的是對象的反向處理操作,根據(jù)對象取得對象的來源信息,在反射的世界里面,看重的不再是一個對象,而是對象身后的組成,下面這篇文章主要給大家介紹了關(guān)于Java如何通過反射獲取Constructor、Field、Method對象的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • 簡單聊一聊Java線程池ThreadPoolExecutor

    簡單聊一聊Java線程池ThreadPoolExecutor

    在使用線程池之后,開啟線程就變成了在線程池當中找到一個空閑的線程,銷毀線程變成了歸還線程到線程池的過程,下面這篇文章主要給大家介紹了關(guān)于Java線程池ThreadPoolExecutor的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • idea中使用SonarLint進行代碼規(guī)范檢測及使用方法

    idea中使用SonarLint進行代碼規(guī)范檢測及使用方法

    這篇文章主要介紹了idea中使用SonarLint進行代碼規(guī)范檢測,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • 解析spring加載bean流程的方法

    解析spring加載bean流程的方法

    這篇文章主要介紹了解析spring加載bean流程的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • 通過Spring Boot整合Mybatis分析自動配置詳解

    通過Spring Boot整合Mybatis分析自動配置詳解

    這篇文章主要給大家介紹了關(guān)于如何通過Spring Boot整合Mybatis分析自動配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring Boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-07-07
  • Struts2學習筆記(3)-DMI動態(tài)調(diào)用方式

    Struts2學習筆記(3)-DMI動態(tài)調(diào)用方式

    本文主要介紹Struts2的DMI動態(tài)調(diào)用的兩種方式,簡單實用,希望能給大家做一個參考。
    2016-06-06
  • Java 如何將前端傳來的數(shù)字轉(zhuǎn)化為日期

    Java 如何將前端傳來的數(shù)字轉(zhuǎn)化為日期

    這篇文章主要介紹了Java 如何將前端傳來的數(shù)字轉(zhuǎn)化為日期,本文通過示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • java讀取resources文件詳解及實現(xiàn)代碼

    java讀取resources文件詳解及實現(xiàn)代碼

    這篇文章主要介紹了java讀取resources文件詳解及實現(xiàn)代碼的相關(guān)資料,在開發(fā)項目的時候經(jīng)常會遇到讀取文件夾里面的內(nèi)容,需要的朋友可以參考下
    2017-07-07

最新評論

宽城| 盐亭县| 福鼎市| 塔河县| 凤庆县| 彩票| 饶阳县| 尼玛县| 青川县| 商水县| 松溪县| 乌海市| 清新县| 调兵山市| 锡林郭勒盟| 从江县| 洪泽县| 宾阳县| 依兰县| 冕宁县| 巧家县| 昌江| 微博| 沂源县| 中阳县| 额尔古纳市| 旺苍县| 柘城县| 开平市| 茂名市| 苍溪县| 贵港市| 文登市| 淮滨县| 霞浦县| 河曲县| 五家渠市| 玉田县| 宜宾县| 怀集县| 乌拉特前旗|