javaWeb的HttpServletRequest和HttpServletResponse


HttpServletRequest

HttpServletRequest對象是封裝了用戶的請求信息,包括請求參數去,請求頭等信息,service()f方法中的兩個HttpServletRequest和HttpServletResponse的形參是由Tomcat將創建好的實例對象傳進來,不需要我們關心。(如果感興趣的話,可以看看Tomcat的底層實現,如果有時間的話,我們可以再詳細討論一下這個原理)。

HttpservletRequest的常用方法

 

 

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 Servlet01 extends HttpServlet{
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String url=req.getRequestURL().toString();
            System.out.println("url--->"+url);
            
            String uri=req.getRequestURI();
            System.out.println("uri--->"+uri);
            
            String qs=req.getQueryString();
            System.out.println("請求參數:"+qs);
            
            String method=req.getMethod();
            System.out.println("請求參數"+method);
            
            String protocol=req.getProtocol();
            System.out.println("請求協議:"+protocol);
            
            String context=req.getContextPath();
            System.out.println("請求站點名:"+context);    
            
    }
}
獲取請求頭

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

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

public class Servlet02 extends HttpServlet{
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String header=req.getHeader("host");
            System.out.println(header);
            
            
            System.out.println("++++++++++++++++");
            Enumeration<String> enu=req.getHeaderNames();
            while(enu.hasMoreElements()){
                System.out.println(enu.nextElement());
            }
        }
}
獲取客戶端請求參數

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

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



public class Servlet03 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name=req.getParameter("uname");
        System.out.println(name);
        
        
        String [] hobby=req.getParameterValues("hobby");
        for(String temp:hobby){
            System.out.println(temp);
        }
        
        Enumeration<String> es=req.getParameterNames();
        while(es.hasMoreElements()){
            es.nextElement();
        }
        
        Map<String, String[]> map =req.getParameterMap();
        for(String key:map.keySet()){
            System.out.println(key);
            for(String str:map.get(key)){
                System.out.println(str);
            }
        }
    }
}
亂碼問題的解決方式

由於現在的 request 屬於接收客戶端的參數,所以必然有其默認的語言編碼,主要是由於在解析過程中默認使用的編碼方式為 ISO-8859-1(此編碼不支持中文),所以解析時一定會出現亂碼。要想解決這種亂碼問題,需要設置 request 中的編碼方式,告訴服務器以何種方式來解析數據。或者在接收到亂碼數據以后,再通過相應的編碼格式還原。

方式一:req.setCharacterEncoding("UTF-8");

該方法值針對post有效,對get是無效的,但是Tomcat8 起,以后的 GET方式請求是不會出現亂碼的,所以使用Tomcat8及以上的Tomcat版本,只需要設置該post的編碼即可

方式二:

 String str=req.getParameter("uname");
String str1=new String(str.getBytes("ISO-8859-1"),"UTF-8");

該方式借助了 String 對象的方法,該種方式對任何請求有效,是通用的,但只能針對單個參數進行編碼轉換來達到解決亂碼的問題

 

請求轉發

請求轉發,是一種服務器的行為,當客戶端請求到達后,服務器進行轉發,此時會將請求對象進行保存,地址欄中的 URL 地址不會改變,得到響應后,服務器端再將響應發送給客戶端,從始至終只有一個請求發出。實現方式如下,達到多個資源協同響應的效果。

            servlet01.java
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 servlet01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name= req.getParameter("uname");
        req.setAttribute("uname", name);
        
        //轉發到servlet02
        req.getRequestDispatcher("s02").forward(req,resp);
    }
}


       servlet02.java 
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 servlet02 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println(req.getAttribute("uname")); //轉發到index.jsp頁面 ,請求轉發的過程中,用的是同一個request和response req.getRequestDispatcher("index.jsp").forward(req,resp); } } index.jsp頁面 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 歡迎${uname }來到首頁 </body> </html>

 

HttpServletResponse 

Web 服務器收到客戶端的 http 請求,會針對每一次請求,分別創建一個用於 代表請求的 request 對象和 代表響應的 response 對象。request 和 response 對象代表請求和響應:獲取客戶端數據,需要通過request 對象; 向客戶端輸出數據,需要通過 response 對象。HttpServletResponse 的主要功能用於服務器對客戶端的請求進行響應,將Web 服務器處理后的結果返回給客戶端。service()方法中形參接收的是HttpServletResponse 接口的實例化對象,這個對象中封裝了向客戶端發送數據、發送響應頭,發送響應狀態碼的方法。

 

常用方法

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 Servlet04 extends HttpServlet{
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        String str=req.getParameter("uname");
    String str1=new String(str.getBytes("ISO-8859-1"),"UTF-8");
        System.out.println(str1);
        
        
        resp.addHeader("name", "zhangsan");
        resp.setHeader("name", "lisi");
        
        resp.setHeader("refresh", "3;url=http://www.shsxt.com");
        resp.sendError(404);

    }
}

 

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 Servlet04 extends HttpServlet{
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {    
    resp.setContentType("text/html;charset=UTF-8");
        resp.getOutputStream().write("<h3> hello world</h3> ".getBytes());

 

將圖片顯示在網頁上

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

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



public class Servlet05 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("image/jpg;charset=UTF-8");
        String realpath=req.getServletContext().getRealPath("/");
        System.out.println(realpath);
        
        String filepath=realpath+"1.jpg";
        File file=new File(filepath);
        if(file.exists()&& file.isFile()){
            InputStream is=new FileInputStream(file);
            byte[] bs=new byte[1024];
            int len=0;
            while((len=is.read(bs))!=-1){
                    resp.getOutputStream().write(bs,0,len);
            }
            resp.getOutputStream().close();
            is.close();
        }
        else{
            resp.setContentType("text/html;charset=UTF-8");
            resp.getWriter().write("<h1>文件不存在!</h1>");
        }
        
    }
}

 

重定向

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 Servlet06 extends HttpServlet{
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.sendRedirect("s05");
            
    }
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM