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>
时间: 2024-10-07 12:09:13

javaEE:day2-Http头协议(doget/dopost)、转发与重定向、gzip压缩的相关文章

转: servlet中的service, doGet, doPost方法的区别和联系

大家都知道在javax.servlet.Servlet接口中只有init, service, destroy方法 但是我们在继承HttpServlet的时候为何一般重写doGet和doPost方法呢 下面我们看一下Servlet源代码: 注意: JDK只是定义了servlet接口,而实现servlet接口的比如tomcat, jboss等服务器 下面我们找到tomcat源代码, 可以到官网下载, 目前最新版本是7.0.53 找到javax.servlet.http.HttpServlet类, 下

#HTTP协议学习# (十二)理解转发与重定向

本文转自:http://blog.csdn.net/meiyalei/article/details/2129120  生动清晰 解释一 转发是服务器行为,重定向是客户端行为.为什么这样说呢,这就要看两个动作的工作流程: 转发过程:客户浏览器发送http请求---->web服务器接受此请求-->调用内部的一个方法在容器内部完成请求处理和转发动作---->将目标资源发送给客户:在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的r

doget,doPost在底层走的是service

doget,doPost在底层走的是service 因为在源码上 先执行service方法 然后再调用doget,doPost方法 原文地址:https://www.cnblogs.com/classmethond/p/10206051.html

请求转发与重定向详解(模拟系统维护中提示的实现)

简介 转发和包含 Servlet对象由Servlet容器创建,并且Servlet对象的service()方法也由容器调用.一个Servlet对象可否直接调用另一个Servlet对象的service()方法呢?答案是否定的,因为一个Servlet对象无法获得另一个Servlet对象的引用. 在旧版的Servlet API中,ServletContext接口中的getServlet(Stringname)方法能根据参数给定的名字返回相应的Servlet对象的引用.从Servlet API2.1开始,

学习笔记(三)GenericServlet HttpServlet 转发和重定向 JSP及隐含对象 域对象

7. MVC 设计模式. 6. 和属性相关的方法: 1). 方法 void setAttribute(String name, Object o): 设置属性  Object getAttribute(String name): 获取指定的属性 Enumeration getAttributeNames(): 获取所有的属性的名字组成的 Enumeration 对象removeAttribute(String name): 移除指定的属性 2). pageContext, request, se

JavaWeb学习之转发和重定向、会话技术:cookie、session、验证码实例、URLConnection使用(下载网页)(4)

1.转发和重定向 HttpServletResponse response 转发: RequestDispatcher dispatcher = request.getRequestDispatcher("/secondServlet"); request.setAttribute("pwd","123");//这里设置的值在secondServlet中可以获取到 dispatcher.forward(request, response);//调

servlet转发与重定向

HttpServletRequest: 表示浏览器向服务器发送的请求报文,由Tomcat创建然后作为参数传递给我们doget,dopost方法. 功能:getParameter()获取请求参数 getContextPath()获取当前项目名 request..getRequestDispatcher("1.html").forward(request, response);可以实现转发功能 HttpServletResponse: 表示服务器响应给浏览器的响应报文,由服务器创建然后作为

定向转发和重定向实现 &lt;select &gt;下拉表单数据传送

定向转发的特点:   (1). 实行转发时浏览器上的网址不变  (如果你这点忽视了,那你就要接受我无尽的鄙视吧! 哇咔咔~~~)    (2). 实行转发时 :   只有一次请求.  不信,看这下面的图:   (俗话说,没图说个jb)  (3).  定向转发的网址必须是本站点的网址.    (因为它不消除,消除数据) (4)  定向转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起. 实现的两个API: 1 RequestDispatcher rd 2 = request.

servlet转发与重定向区别

HttpServletRequest: 表示浏览器向服务器发送的请求报文,由Tomcat创建然后作为参数传递给我们doget,dopost方法. 功能:getParameter()获取请求参数 getContextPath()获取当前项目名 request..getRequestDispatcher("1.html").forward(request, response);可以实现转发功能 HttpServletResponse: 表示服务器响应给浏览器的响应报文,由服务器创建然后作为