Servlet請求與響應

1.Servlet技術

首先對於Servlet 就是利用java類編寫的服務端的程序,可以看作是位於客戶端和服務端的一箇中間層,負責接收和請求客戶端用戶的響應。
Servlet提供的功能
1.對客戶端發送給的數據進行讀取和攔截
2.讀取客戶端請求的隱含數據
3.運行結果或者生成結果
4.發送響應的數據
Servlet的生命週期
1.初始化
初始化階段可分爲裝載和初始化兩階段,裝載是由Servlet容器裝載一個servlet類,把它裝在的java內存中,Servlet容器可以創建一個Servlet對象在web.xml中配置對應起來。初始化階段調用Servlet中的init() 方法,在整個聲明週期中只能調用一次。
2.運行階段
當有客戶端發起請求時,Servlet會創建HttpServletRequest和HttpServletResponse對象,然後調用service(HttpServletRequest request,HttpServletResponse response)方法。serivce()方法通過request對象獲取請求對信息處理,再由response對象對客戶端做出響應。
3.消亡階段
調用destroy()對Servlet對象進行銷燬動作,在消亡過程,Servlet容器將釋放它所佔的資源,在整個Servlet生命週期destory()只調用一次。
JSP與Servlet的區別
1.Servlet是java代碼,JSP是頁面代碼
2.Servlet運行速度快過JSP Servlet是一個java類,編譯時會轉換爲類文件;JSP需要先編譯爲java類,然後再運行。
3.Servlet需要手動編譯,JSP需要服務器自動編譯
Web容器
Web容器的作用就是創建一個Servlet的實例,並根據web.xml中的URL進行響應。當客戶端請求HTTP服務器時,會使用HTTP傳遞請求,標頭,參數等信息。當HTTP服務器將請求轉給Web容器時,Web容器會創建一個HttpServletResquest和HttpServletResponse對象。Web容器會根據配置的Web.xml查找響應的Servlet並調用他的service()方法,該方法會根據HTTP請求的方式,決定是調用doPost()或者doGet()方法。處理之後,Web容器轉換爲HTTP響應,由HTTP服務器做出響應。
關於HttpServletRequest對象
HttpServletRequest對象是請求封裝對象,由Web容器生成,可以獲取HTTP請求信息。
使用getReader() ;getInputStream()獲取body內容
1.getReader()獲取body內容 編寫Servlet類

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        BufferedReader br = request.getReader();//獲取BufferedReader對象
        String input = "";
        String body = "";
        while((input = br.readLine())!=null){
            body +=input+"<br/>";
        }
        response.setContentType("text/html:charset = UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head><title>test</title></head>");
        out.println("<body>");
        out.println(body);
        out.println("</body>");
        out.println("</html>");
        out.flush();
        out.close();
    }

2.getInputStream()獲得上傳文件的內容

public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        byte[] body = readByte(request);
        String textbody = new String(body,"UTF-8");
        String finame = getfilename(textbody);
        writeof(finame,body);
        response.setContentType("text/html;charset = UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head><title>test</title></head>");
        out.println("<script>alert(\"上傳成功\")</script><body>");
        out.println(textbody);
        out.println("</body>");
        out.println("</html>");
        out.flush();
        out.close();
    }
    public byte[] readByte(HttpServletRequest request) throws IOException{
        int len = request.getContentLength();
        InputStream is = request.getInputStream();
        byte[] b = new byte[len];
        is.read(b);
        is.close();
        return b;
    }
    public String getfilename(String bodyText){
        //String filename = bodyText.substring(bodyText.indexOf("filename=\"")+10);
        //filename = filename.substring(bodyText.indexOf("\\")+1,filename.indexOf("\""));
        String filename = StringUtils.substringBetween(bodyText,"filename=\"","\"");//提取字符串bodyText的從filemame=\到\的內容
        return filename;
    }
    public void writeof(String filename,byte[] body)throws FileNotFoundException,IOException {
        FileOutputStream fi = new FileOutputStream("D:/"+filename);
        fi.write(body);
        fi.flush();
        fi.close();
    }

使用getPart() getParts() 獲取上傳文件必須要使用

@MultipartConfig(location = "D:/",maxFileSize = 1024*1024*10)
//主要是設置存放生成文件的地址 允許文件上傳的最大值

1.getPart()方法獲取上傳文件的內容

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        Part part = request.getPart("filename");
        String filename = getfilename(part);
        part.write(filename);
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head><title>test</title></head>");
        out.println("<script>alert(\"上傳成功\")</script><body>");
        out.println("</body>");
        out.println("</html>");
        out.flush();
        out.close();
    }
    public String getfilename(Part part){
        if (part==null){
            return null;
        }
        String fileName = part.getHeader("content-disposition");//提供一個默認的文件
        if(StringUtils.isBlank(fileName)){
            return null;
        }
        return StringUtils.substringBetween(fileName,"filename=\"","\"");
    }

2.getParts()方法獲取批量上傳文件

public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        request.getParts();
        for(Part part:request.getParts()){
            if(part.getName().startsWith("filename")){//只處理上傳的文件這裏“提交”也當作是一個part對象
                String filename = getfilename(part);
                part.write(filename);
            }
        }
        response.setContentType("text/html;charset = UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head><title>test</title></head>");
        out.println("<script>alert(\"上傳成功\")</script><body>");
        out.println("</body>");
        out.println("</html>");
        out.flush();
        out.close();
    }
    public String getfilename(Part part){
        if(part==null){
            return null;
        }
        String fileName = part.getHeader("content-disposition");//提供一個默認的文件名
        if(StringUtils.isBlank(fileName)){
            return null;
        }
        return StringUtils.substringBetween(fileName,"filename=\"","\"");
    }

使用RequestDispatcher調派請求
RequestDispatcher接口是爲了多個Servlet之間調整而實現的,調用時指定跳轉的URL地址完成跳轉動作。RequestDispatcher接口有兩種方法實現 include() forward();
1.include()方法,在當前的Servlet頁面顯示另外一個Servlet的內容

public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
        response.setContentType("text/html;charset = utf-8");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head><title>RequestDispatcher</title></head>");
        out.println("<body>");
        out.println("這是第一個<br/>");
        RequestDispatcher rd = request.getRequestDispatcher("/test1");
        rd.include(request,response);
        out.println("這是最後一個<br/>");
        out.println("</body>");
        out.println("</html>");
        out.flush();
        out.close();
    }

2.forward()方法 跳轉到其他的Servlet

public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
        String username = request.getParameter("username");//先獲取請求的參數
        String message = t.getvalue(username);//通過定義的test1類中的方法查找出請求參數所對應的值
        request.setAttribute("message",message);//設置參數值
        RequestDispatcher re = request.getRequestDispatcher("/test2");//轉到
        re.forward(request,response);
    }

關於HTTPServletResponse
HTTPServletResponse是用於對瀏覽器做出響應的操作對象,可設置響應類型。

response.setContentType("text/html;charset = UTF-8");
//MIME類型
//text/html,application/pdf,application/jar application.x-zip,image/jpeg

使用getOutputStream()輸出二進制字符

 public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServerException,IOException{
        response.setContentType("application/msword");
        response.addHeader("Content-disposition","attachment;filename = test.doc");
        InputStream in = getServletContext().getResourceAsStream("/test.doc");
        ServletOutputStream os = response.getOutputStream();
        byte[] b = new byte[1024];
        int len = -1;
        while((len = in.read(b))!= -1){
            os.write(b,0,len);
        }
        in.close();
        os.close();
    }

這裏獲取文件,指定的路徑是相對於Web應用程序的根目錄。
使用sendRedirect(),sendError()方法
1.sendRedirect()方法,對於使用forward()方法跳轉時動作不會被瀏覽器所知,因此地址欄不會發生變化。對於sendRedirect()用於重定向另外一個URL中。
sendRedirect()使用

public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("這是第一個url");
        response.sendRedirect(request.getContextPath()+"/test1");
        out.println("。。。。。。");
        out.close();
    }

跳轉後只顯示其內容,不顯示跳轉前的Servlet內容。
2.sendError()方法,在處理請求時候發生錯誤,就可以用sendError()方法傳遞服務器的狀態和錯誤信息。

response.sendError(HttpServletResponse.SC_NOT_FOUND);
//請求頁面地址不存在
401 訪問拒絕
401.2 服務器配置導致登錄失敗
403 禁止訪問
403.6 IP地址被拒絕
403.9 用戶數過多
404 沒有找到文件或目錄
405 用來訪問本頁面的HTTP不被允許
406 客戶端瀏覽器不接受所請求頁面的MIME類型
500 內部服務器錯誤
504 網關超時
505 HTTP版本不受支持
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章