首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Servlet 核心原理與 HttpURLConnection 實現 GET/POST 請求全解析

     編輯:Java 綜合教學

Servlet 基礎:doGet 與 doPost

Servlet 是運行在服務端的 Java 類,負責接收客戶端請求(如瀏覽器)並做出響應。核心入口為 doGet 和 doPost 方法,分別處理 HTTP GET 和 POST 請求。

登錄 Servlet 示例

@WebServlet("/ServletLogin")
public class ServletLogin extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 解決 GET 亂碼:ISO-8859-1 -> UTF-8
        String user = parse(request.getParameter("user"));
        String pwd = parse(request.getParameter("pwd"));
        
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().println(user + " 登陸成功!");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // POST 請求設置編碼即可解決亂碼
        request.setCharacterEncoding("utf-8");
        doGet(request, response); // 復用邏輯
    }

    private String parse(String msg) throws UnsupportedEncodingException {
        return new String(msg.getBytes("iso8859-1"), "utf-8");
    }
}

客戶端模擬:HttpURLConnection 實戰

Java 原生 HttpURLConnection 可模擬瀏覽器發送 HTTP 請求,無需第三方庫。

GET 請求工具類

public class HttpURLConnectionUtil {
    public static InputStream getInputStreamByGet(String urlStr) {
        try {
            HttpURLConnection conn = (HttpURLConnection) new URL(urlStr).openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(10000);
            conn.setReadTimeout(10000);
            if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                return conn.getInputStream();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

POST 請求工具類(含參數編碼)

public class HttpURLConnectionUtil {
    private static String charset;

    public static InputStream getInputStreamByPost(String urlStr, String params) {
        try {
            HttpURLConnection conn = (HttpURLConnection) new URL(urlStr).openConnection();
            conn.setRequestMethod("POST");
            conn.setDoOutput(true); // 開啟輸出流寫入參數
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(5000);
            
            try (OutputStream os = conn.getOutputStream()) {
                os.write(params.getBytes("utf-8"));
            }
            
            if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                String contentType = conn.getContentType();
                charset = contentType.split("=")[1]; // 提取 charset
                return conn.getInputStream();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    public static String getCharset() { return charset; }
}

流轉字符串工具

public class InputStreamUtil {
    public static String inputStreamToString(InputStream is, String charset) {
        StringBuilder sb = new StringBuilder();
        try (BufferedReader br = new BufferedReader(new InputStreamReader(is, charset))) {
            char[] buffer = new char[1024];
            int len;
            while ((len = br.read(buffer)) != -1) {
                sb.append(buffer, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }
}

測試類:發送 POST 請求

public class Test {
    public static void main(String[] args) throws Exception {
        String user = URLEncoder.encode("張三", "utf-8");
        String pwd = URLEncoder.encode("你好", "utf-8");
        String url = "https://192.168.2.11:8080/08-23/ServletLogin";
        String params = "user=" + user + "&pwd=" + pwd;
        
        InputStream is = HttpURLConnectionUtil.getInputStreamByPost(url, params);
        String result = InputStreamUtil.inputStreamToString(is, HttpURLConnectionUtil.getCharset());
        System.out.println(result);
    }
}

關鍵注意事項

  1. 中文參數必須 URLEncoder.encode,否則服務端解析亂碼。
  2. setDoOutput(true) 是 POST 請求寫入請求體的前提。
  3. 響應編碼需從 Content-Type 頭解析,避免硬編碼導致解碼錯誤。
  4. 生產環境建議使用成熟庫(如 OkHttp、HttpClient),原生 API 代碼冗長且易出錯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved