javaEE:day2-Http頭協議(doget/dopost)、轉發與重定向、gzip壓縮

http頭協議

凡是以超鏈接登錄的都是doget,表單請求可以設置請求頭協議:doget、dopost

doget請求,可以直接用url帶參數訪問頁面文件,如:http://127.0.0.1:8080/helloWeb_jun/login.jsp?name=aaa&pwd=123123123

而如果在表單中設置了method="post"的話則不能用上面的方式訪問,必須是通過超鏈接點擊訪問。

瀏覽器的兼容: 我們要設置response.setContentType();用來設置頭協議中的key,value。如:response.setContentType("text/html;charset=utf-8"); 來指定編碼、文件類型等屬性。

要做只能從當前頁面跳轉 判斷拿到的referer是否是null,是否是從當前站點跳轉過去的。`String refer=request.getHeader(“Referer”);

    String str = "";
    if(refer==null){
        str = "看點廣告";
    }else{
        if(refer.contains("helloWeb")){
            str = "<img src='./imgs/1.jpg'>";
        }else{
            str = "請從主頁點擊查看";
        }
    }`

轉發與重定向:轉發與重定向的圖解

重定向:相當於做兩次請求 第一次請求是爲了拿到資源的位置,第二次纔是直接訪問資源 沒有第一次請求的request和response了

重定向用到的方法是

String path = "/helloWeb_jun/jsps/result.jsp";
        response.sendRedirect(path);

轉發:做一次請求 但是服務器內部會有一次轉發,將請求轉到資源 這時,保留原來的request和response 。

轉發用到的方法是:

String path ="/jsps/result.jsp";
        request.getRequestDispatcher(path).forward(request, response);

gzip壓縮

以壓縮格式,要設

        response.setContentType("text/html");
        response.setHeader("Content-Encoding", "gzip");
        response.setHeader("Content-length", ""+dest.length);

這裏可以用setHeader的key,value來設置,也可以用response.setContentLength(dest.length); 來設置。

壓縮

聲明一點,如果是很小的文件,那麼壓縮之後反而會更大,因爲壓縮有開銷。

        ByteArrayOutputStream array = new ByteArrayOutputStream();
        GZIPOutputStream gout= new GZIPOutputStream(array);
        gout.write(str);
        gout.close();

來壓縮,最後從array返回出去的就是壓縮好的字節數組。

創建Servlet的幾種方法:

1、直接new Servlet。—這種不需要手動配置xml

2、用implements Servlet ,然後補全來寫。–這個需要自己手動去xml文檔中配置

3、用extends HttpServlet 然後覆蓋所需要的函數來寫—這個需要手動去xml文檔中配置

配置類似如下所示:

<servlet>
    <servlet-name>imgServlet</servlet-name>
    <servlet-class>cn.hncu.imgServlet.imgServlet</servlet-class>
</servlet>
  <servlet-mapping>
    <servlet-name>imgServlet</servlet-name>
    <url-pattern>/servlet/imgServlet</url-pattern>
  </servlet-mapping>

這個

<url-pattern>/servlet/imgServlet</url-pattern>

裏面的/servlet/imgServlet就是我們在表單中的action的值

最後,本文代碼如下:

GzipServlet

package cn.hncu.imgServlet;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.zip.GZIPOutputStream;

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

public class GzipServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String msg = "dfjwoefjalsdjfowejflasjdfiowe放假偶爾發接哦我IQ耳機佛全文見佛千萬IE附件分接歐文積分fjweofjwoefjwofj";


        byte[] str = msg.getBytes();
        //將字節數組壓到array內存中去
        ByteArrayOutputStream array = new ByteArrayOutputStream();
        GZIPOutputStream gout= new GZIPOutputStream(array);
        gout.write(str);
        gout.close();
        //將壓縮後的數據從array中拿出
        byte[] dest = array.toByteArray();
        response.setContentType("text/html");
        //response.setContentLength(dest.length);
        response.setHeader("Content-Encoding", "gzip");
        response.setHeader("Content-length", ""+dest.length);

        OutputStream out = response.getOutputStream();
        out.write(dest);
        out.flush();
        out.close();
    }

}

DispatcherServlet

package cn.hncu.imgServlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 演示轉發
 * @author <a href="mailto:[email protected]">軍街</a>
 *
 * @version 1.0 2016-7-17
 */
public class DispatcherServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String path ="/jsps/result.jsp";
        request.getRequestDispatcher(path).forward(request, response);
    }

}

RedirectServlet

package cn.hncu.imgServlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 演示重定向
 * @author <a href="mailto:[email protected]">軍街</a>
 *
 * @version 1.0 2016-7-17
 */
public class RedirectServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //法1:
        String path = "/helloWeb_jun/jsps/result.jsp";
        response.sendRedirect(path);
        //法2:
        //response.setStatus(302);
        //response.setHeader("Location", path);

//      response.setCharacterEncoding("utf-8");
    //  response.setCharacterEncoding("gbk");

        //演示狀態碼
//      response.setStatus(404);
//      response.getWriter().write("not found找不到 ,good job");
    }

}

ShowPicServlet

package cn.hncu.imgServlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ShowPicServlet implements Servlet{

    @Override
    public void destroy() {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void init(ServletConfig arg0) throws ServletException {
    }

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1)
            throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) arg0;
        HttpServletResponse response = (HttpServletResponse) arg1;
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

        //String str = "<img src='./imgs/1.jpg'>";
        //做只能從主頁點擊才能進入 靠單純的url不能查看圖片
        //http://127.0.0.1:8080/helloWeb_jun/pic   ----看點廣告
        String refer=request.getHeader("Referer");
        String str = "";
        if(refer==null){
            str = "看點廣告";
        }else{
            if(refer.contains("helloWeb")){
                str = "<img src='./imgs/1.jpg'>";
            }else{
                str = "請從主頁點擊查看";
            }
        }


        out.write(str);
    }

}

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  <body>
    <a href="jspDay1/demo1.jsp">導向我的jsp文件</a> <br>
    <hr/>
    <!--以form表單提交 這種是在url中顯示輸入的-->
    <!-- 默認的method是get -->
    <!-- http://127.0.0.1:8080/helloWeb_jun/login.jsp?name=aaa&pwd=123123123 -->
    <form action="login.jsp">
        姓名:<input type="text" name="name"/><br/>
        密碼:<input type="text" name="pwd"/><br/>
        <input type="submit" value="登錄"/>
    </form>
    <!--以form表單提交 這種是在url中不顯示輸入的-->
    <!-- http://127.0.0.1:8080/helloWeb_jun/login.jsp -->
    <form action="login.jsp" method="post">
        姓名:<input type="text" name="name"/><br/>
        密碼:<input type="text" name="pwd"/><br/>
        <input type="submit" value="登錄"/>
    </form>
    <br/>
    <!--以超鏈接方式登錄-->
    <a href="http://127.0.0.1:8080/helloWeb_jun/login.jsp?name=cv&pwd=6666">以超鏈接方式登錄</a><br/>
    <br/>
    <br/>
    <hr/>
    <a href="pic">查看美女圖</a>
    <br/>
    <br/>
    <hr/>
    <h2>下面演示重定向和轉發</h2>
    <!-- 重定向:相當於做兩次請求 第一次請求是爲了拿到資源的位置,第二次纔是直接訪問資源  沒有第一次請求的request和response了-->
    <!-- 轉發:做一次請求 但是服務器內部會有一次轉發,將請求轉到資源 這時,保留原來的request和response -->
    <a href="redirect">重定向</a><br/>
    <a href="dispatcher">轉發</a><br/>
    <hr/>
    <h2>演示壓縮gzip</h2>
    <!-- http://127.0.0.1:8080/helloWeb_jun/ -->
    <a href="gzip">壓縮gzip</a>

  </body>
</html>

result.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>  
    <h1>這時重定向的最終頁面</h1>
</body>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章