1. 程式人生 > >Servlet 學習(三)

Servlet 學習(三)

content load 分享 數據 cat exce nal charset 信息

HTTP 請求的構成

1、HTTP 請求行:
請求方式,比如 GET 、POST 等
本次請求的URI ,比如 /hello
協議和版本號
2、 HTTP 請求報頭: (頭部/首部/請求頭)

  • 請求頭和請求正文之間用空行分隔

3、 HTTP 請求正文:

  • 一種是 請求參數 ,比如 /hello?username=zhangsanfeng&password=wudang2017
  • 一種是 針對上傳文件 等操作

HttpServletRequest 類型的對象

1、Servlet 容器響應Web 客戶端請求的時序圖

技術分享圖片

2、與HTTP請求行對應的方法

  • 請求方式: String getMethod()
  • URI : String getRequestURI()
  • 協議: String getProtocol()

3、與HTTP請求報頭:

  • String getHeader( String name ) 獲取指定名稱的請求報頭的取值
  • Enumeration<String> getHeaders( String name ) 獲取指定名稱的請求報頭的取值(取值有多個,比如cookie)
  • long getDateHeader( String name ) 獲取指定名稱的請求報頭的取值 ( 返回以毫秒為單位的時間 )
  • int getIntHeader( String name ) 獲取指定名稱的請求報頭的取值 ( 以 int 形式返回 )
  • Enumeration<String> getHeaderNames() 獲取所有的請求報頭的名稱

4、與HTTP請求正文:
獲取請求參數:

  • String getParameter( String name ) 獲取指定的請求參數對應的值
  • String[] getParameterValues( String name ) 獲取指定的請求參數對應的值 ( 取值有多個,比如 checkbox )
  • Map< String , String[] > getParameterMap() 獲取所有的請求參數及取值( 取值是個數組 )
  • Enumeration<String> getParameterNames() 獲取所有的請求參數的名稱

獲取WEB客戶端上傳的數據:

  • ServletInputStream getInputStream() 在 Servlet 3.0 之前獲取上傳數據的方法 ( 以字節形流式返回 )
  • BufferedReader getReader() 在 Servlet 3.0 之前獲取上傳數據的方法 ( 以字符流形式返回 )
  • Part getPart( String name ) 根據 名稱 獲得 一個 multipart/form-data POST request 中指定名稱對應的 Part 對象

    <input type="file" name="upfile" > =========> request.getPart( "upfile" )

  • Collection<Part> getParts() 獲取 multipart/form-data POST request 中對應的所有的 Part 對象

測試案例:

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    id="WebApp_ID" version="3.1">

    <servlet>
        <servlet-name>ParseRequestServlet</servlet-name>
        <servlet-class>ecut.request.ParseRequestServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>ParseRequestServlet</servlet-name>
        <url-pattern>/parse</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>FirstUploadServlet</servlet-name>
        <servlet-class>ecut.request.FirstUploadServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>FirstUploadServlet</servlet-name>
        <url-pattern>/upload/first</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>SecondUploadServlet</servlet-name>
        <servlet-class>ecut.request.SecondUploadServlet</servlet-class>

        <!-- 啟用 Servlet 3.x 所支持的文件上傳方式 -->
        <multipart-config>
            <location>D:/files</location>
        </multipart-config>
        <!-- location 指定的是文件上傳後的存儲位置 -->
    </servlet>

    <servlet-mapping>
        <servlet-name>SecondUploadServlet</servlet-name>
        <url-pattern>/upload/second</url-pattern>
    </servlet-mapping>
    
    <servlet>
        <servlet-name>ThirdUploadServlet</servlet-name>
        <servlet-class>ecut.request.ThirdUploadServlet</servlet-class>

        <!-- 啟用 Servlet 3.x 所支持的文件上傳方式 -->
        <multipart-config>
            <location>D:/files</location>
        </multipart-config>
        <!-- location 指定的是文件上傳後的存儲位置 -->
    </servlet>

    <servlet-mapping>
        <servlet-name>ThirdUploadServlet</servlet-name>
        <url-pattern>/upload/third</url-pattern>
    </servlet-mapping>
    
</web-app>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Request</title>
</head>
<body>

    <a href="/Servlet/parse?username=Amy&password=123456" >訪問 ParseRequestServlet</a>
    
    <h5>GET</h5>
    <form action="/Servlet/parse" method="get" >
        <input type="text" name="username" placeholder="用戶名">
        <br>
        性別: 
        <input type="radio" name="gender" value="女"> 我是靚女
        <input type="radio" name="gender" value="男"> 我是靚仔 <br>
        愛好:
        <input type="checkbox" name="hobby" value="eat">吃飯 
        <input type="checkbox" name="hobby" value="sleep">睡覺 
        <input type="checkbox" name="hobby" value="wc">上廁所
        <br>
        <input type="submit" value="提交">
    </form>
    
    <h5>POST</h5>
    <form action="/Servlet/parse" method="post" >
        <input type="text" name="username" placeholder="用戶名">
        <br>
        性別: 
        <input type="radio" name="gender" value="女"> 我是靚女
        <input type="radio" name="gender" value="男"> 我是靚仔 <br>
        愛好:
        <input type="checkbox" name="hobby" value="eat">吃飯 
        <input type="checkbox" name="hobby" value="sleep">睡覺 
        <input type="checkbox" name="hobby" value="wc">上廁所
        <br>
        <input type="submit" value="提交">
    </form>
    
    <h5>文件上傳(古代)</h5>
    <!-- method 必須是 POST ,enctype 必須是 multipart/form-data enctype默認是對數據進行 application/x-www-form-urlencoded編碼-->
    <form action="/Servlet/upload/first" method="post"  enctype="multipart/form-data">
        <input type="file" name="upfile" >
        <input type="submit" value="上傳" >
    </form>
    
    <h5>文件上傳( 從 Servlet 3.0 開始 )</h5>
    <!-- method 必須是 POST ,enctype 必須是 multipart/form-data -->
    <form action="/Servlet/upload/second" method="post"  enctype="multipart/form-data">
        <input type="file" name="upfile" >
        <input type="submit" value="上傳" >
    </form>
    
    <h5>文件上傳( 從 Servlet 3.0 開始 )</h5>
    <!-- method 必須是 POST ,enctype 必須是 multipart/form-data -->
    <form action="/Servlet/upload/third" method="post"  enctype="multipart/form-data">
        <input type="file" name="upfile1" > 
        <br>
        <input type="file" name="upfile2" > 
        <br>
        <input type="file" name="upfile3" > 
        <br>
        <input type="file" name="upfile4" > 
        <br>
        <input type="submit" value="上傳" >
    </form>

</body>
</html>
package ecut.request;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

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

public class ParseRequestServlet extends HttpServlet {

    private static final long serialVersionUID = 5473447295646845596L;

    @Override
    protected void service( HttpServletRequest request, HttpServletResponse response ) 
            throws ServletException, IOException {
        request.setCharacterEncoding( "UTF-8" );
        response.setCharacterEncoding( "UTF-8" );
        response.setContentType( "text/html;charset=UTF-8" );
        PrintWriter p =response.getWriter();        
        // 獲取 HTTP HTTP 請求行中的相關信息
        String method = request.getMethod();
        String uri = request.getRequestURI() ; 
        String protocol = request.getProtocol() ;
        System.out.println( "HTTP 請求行:");
        System.out.println("\t請求方式 = " + method);
        System.out.println("\tURI = " + uri);
        System.out.println("\t協議/版本號= " + protocol);
        p.println("<p>HTTP 請求行:</p>");
        p.println("<p style=‘text-indent:2em;‘>請求方式 = " + method+"</p>");
        p.println("<p style=‘text-indent:2em;‘>URI = " + uri+"</p>");
        p.println("<p style=‘text-indent:2em;‘>協議/版本號 = " + protocol+"</p>");
        // 獲取HTTP 請求報頭
        Enumeration<String> headerNames = request.getHeaderNames();
        System.out.println( "HTTP 請求報頭:" );
        p.println( "<p>HTTP 請求報頭:"+"</p>" );
        while( headerNames.hasMoreElements() ) {
            String name = headerNames.nextElement(); // 獲取單個的HTTP 請求報頭的名稱
            String value = request.getHeader( name ) ; // 獲得指定名稱對應的HTTP 請求報頭的值
            System.out.println( "\t" + name + " = " + value );
            p.println("<p style=‘text-indent:2em;‘>" + name + " = " + value +"</p>");
        }
        
        // 獲取HTTP 請求參數
        Map<String,String[]> paramMap = request.getParameterMap();
        
        Set< Entry<String, String[]> >  entrySet = paramMap.entrySet();
        System.out.println( "HTTP 請求參數:" );
        p.println( "<p>HTTP 請求參數:" );
        for( Entry<String, String[]> e : entrySet ){
            String name = e.getKey() ;
            String[] value = e.getValue() ;
            System.out.println( "\t" + name + " : " + Arrays.toString( value ) );
            p.println( "<p style=‘text-indent:2em;‘>" + name + " : " + Arrays.toString( value ) +"</p>");
        }
        
    }
    
    

}

技術分享圖片

運行結果如下:

技術分享圖片

控制臺輸出文件的內容。

獲取指定的請求參數對應的值取值有多個的測試案例:

技術分享圖片

運行結果如下:

技術分享圖片

HTTP 請求行:
    請求方式 = GET
    URI = /Servlet/parse
    協議/版本號= HTTP/1.1
HTTP 請求報頭:
    host = localhost:8080
    user-agent = Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0
    accept = text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    accept-language = zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    accept-encoding = gzip, deflate
    referer = http://localhost:8080/Servlet/pages/request/index.html
    connection = keep-alive
    upgrade-insecure-requests = 1
HTTP 請求參數:
    username : [AmyZheng]
    gender : [男]
    hobby : [eat, sleep]


文件上傳測試案例一:

package ecut.request;

import java.io.BufferedReader;
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 FirstUploadServlet extends HttpServlet {

    private static final long serialVersionUID = -7777691027208490971L;

    @Override
    protected void doGet( HttpServletRequest request , HttpServletResponse response ) throws ServletException, IOException {
        throw new RuntimeException( "不支持GET方式上傳" );
    }

    @Override
    protected void doPost( HttpServletRequest request , HttpServletResponse response ) throws ServletException, IOException {
        
        request.setCharacterEncoding( "UTF-8" );
        
        // 上傳文件時,只考慮文本文件,不考慮其它文件
        BufferedReader reader = request.getReader();
        //InputStream in = request.getInputStream();

        String s ; 
        while( ( s = reader.readLine() ) != null ){
            System.out.println( s );
        }
        
    }
    
    

}

技術分享圖片

運行結果如下:

頁面跳轉到http://localhost:8080/Servlet/upload/first

控制臺輸出文件內容

-----------------------------296501829912081
Content-Disposition: form-data; name="upfile"; filename="Http.txt"
Content-Type: text/plain
文件內容省略

-----------------------------296501829912081--


文件上傳測試案例二:

package ecut.request;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

public class SecondUploadServlet extends HttpServlet {

    private static final long serialVersionUID = 4485463572490572537L;

    @Override
    protected void doGet( HttpServletRequest request , HttpServletResponse response ) throws ServletException, IOException {
        throw new RuntimeException( "不支持GET方式上傳" );
    }

    @Override
    protected void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
        
        // String username = request.getParameter( "username" ) ; // <input type="text" name="username" >
        
        Part part = request.getPart( "upfile" ) ; // <input type="file" name="upfile" >
        System.out.println( part );
        
        /* Servlet 3.0 中獲得文件名的做法
        String cd = part.getHeader( "Content-Disposition" );
        System.out.println( cd );
        String s = "filename=\""; 
        int index = cd.indexOf( s );//找到filename的位置
        String name = cd.substring( index + s.length() , cd.length() - 1 );//獲取文件名
        System.out.println( name );
        */
        
        // part.getName() ; // name="upfile"
        String filename = part.getSubmittedFileName(); // Servlet 3.1 開始出現的方法
        
        part.write( filename );
        
    }
    
    

}

技術分享圖片

運行結果如下:

頁面跳轉到http://localhost:8080/Servlet/upload/second

D:\files目錄下增加了一個文件

技術分享圖片


文件上傳測試案例三:

package ecut.request;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

public class ThirdUploadServlet extends HttpServlet {

    private static final long serialVersionUID = 4485463572490572537L;

    @Override
    protected void doGet( HttpServletRequest request , HttpServletResponse response ) throws ServletException, IOException {
        throw new RuntimeException( "不支持GET方式上傳" );
    }

    @Override
    protected void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
            upfile("upfile1",request);
            upfile("upfile2",request);
            upfile("upfile3",request);
            upfile("upfile4",request);
    }
    
    void upfile(String upfile,HttpServletRequest request) throws ServletException, IOException{
        Part part = request.getPart( upfile) ; 
        String filename = part.getSubmittedFileName(); 
        part.write( filename );
    }
    

}

技術分享圖片

運行結果如下:

頁面跳轉到http://localhost:8080/Servlet/upload/third

D:\files目錄下增加了四個文件

技術分享圖片

轉載請於明顯處標明出處

http://www.cnblogs.com/AmyZheng/p/8761234.html

Servlet 學習(三)