9.response和request对象(我的JavaEE笔记)

一、简介

(1) web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象和代表响应的request对象。

(2)request和response对象既然代表请求和响应,那我们要获取客户端(浏览器)提交过来的数据,只需要找request对象就行了。要客户端输出数据,只需要找response对象就行了。

注意:request中封装的是浏览器的信息和请求参数,即浏览器的请求;response中封装的是服务器向浏览器发送的数据、响应头和编码格式等,即服务器的响应。

二、HttpServletResponse

HttpServletResponse对象服务器的响应。这个对象中封装了向客户端发送数据、发送响应头和发送状态码的方法。

2.1 response常见应用(工程ResAndReq)

2.1.1向浏览器输出中文数据

package cn.itcast.response;
//向浏览器输出中文
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResponseDemo1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        test2(response);
    }
    
    public void test1(HttpServletResponse response) throws IOException{
        String data = "中国";
        
        //设置码表头,告诉浏览器打开文本时应该使用的码表
        response.setHeader("content-type", "text/html;charset=UTF-8");
        //直接从response对象中获得输出流
        OutputStream out = response.getOutputStream();
        byte[] b = data.getBytes("UTF-8");
        out.write(b);//注意使用字节流
    }
    
    public void test2(HttpServletResponse response) throws IOException{
        String data = "中国";
        response.setHeader("content-type", "text/html;charset=UTF-8");
        //设置response的码表
        response.setCharacterEncoding("UTF-8");
        //这行代码相当于上面两行代码的功能
        //response.setContentType("text/html;charset=UTF-8");
        
        //因为respon使用的码表是iso-8859-1,于是会使用此码表编码信息,这样是找不到汉字的,
        //所以我们需要在上面设置response的码表
        PrintWriter out = response.getWriter();
        out.write(data);
        
        //注意:OutputSream和PrintWriter的区别,后者一般是输出字符串内容个,多用于输出网页文本
        //而前者是字节流,可以处理任何数据,但是两者不能同时使用。
    }
    //显示数字
    public void test3(HttpServletResponse response) throws IOException{
        //但是我们发现浏览器中显示的不是1,这是因为浏览器是一种文本显示,它会先查看1对应
        //码表中是哪个字符,然后显示,所以这里我们需要先将数字转换成字符串
        response.getOutputStream().write(1);
    }

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

2.1.2文件下载和中文名字文件的下载

package cn.itcast.response;
//文件下载,浏览器中会弹出下载窗口
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResponseDemo2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        test2(response);
    }
    
    private void test1(HttpServletResponse response) throws IOException{
        String path = this.getServletContext().getRealPath("/download/1.jpg");
        String filename = path.substring(path.lastIndexOf("\\") + 1);
        //其中content-disposition是http头,告诉浏览器使用下载方式打开
        response.setHeader("content-disposition", "attachment;filename="+filename);
        
        FileInputStream in = new FileInputStream(path);
        int len = 0;
        byte[] buffer = new byte[1024];
        OutputStream out = response.getOutputStream();
        while((len = in.read(buffer)) > 0){
            out.write(buffer, 0, len);
        }
        in.close();
        //注意:浏览器关闭后会自动关闭和response关联的流,我们不需要专门关闭
        
    }
    
    //当图片的名字含有中文
    private void test2(HttpServletResponse response) throws IOException{
        String path = this.getServletContext().getRealPath("/download/图片.jpg");
        String filename = path.substring(path.lastIndexOf("\\") + 1);
        //其中方法URLEncoder.encode会将文件名转换成ASCII码
        response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
        
        FileInputStream in = new FileInputStream(path);
        int len = 0;
        byte[] buffer = new byte[1024];
        OutputStream out = response.getOutputStream();
        while((len = in.read(buffer)) > 0){
            out.write(buffer, 0, len);
        }
        in.close();
        
    }
    
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

注意:在开发中尽量使用字节流,因为字节流可以处理任何数据,而字符流只能用来处理文本。

2.1.3输出随机图片(如验证码)

package cn.itcast.response;
//输出一张带有随机数的图片
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ResponseDemo3 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        //6.设置头,控制浏览器不要缓存图片,为了兼容性,三种类型的头都需要声明
        response.setHeader("Expires", "-1");
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Pragma", "no-cache");
        
        //5.通知浏览器以图片方式打开
        response.setHeader("content-type", "image/jpeg");
        
        
        //1.在内存中创建一副图片,80是宽,20是高,一般都是使用TYPE_INT_BGR
        BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_BGR);
        //2.得到图片
        Graphics2D graphics = (Graphics2D) image.getGraphics();
        graphics.setColor(Color.WHITE);//设置图片颜色
        graphics.fillRect(0, 0, 80, 20);//重绘图片的范围
        
        //3.向图片上写数据
        graphics.setColor(Color.RED);//设置图片上的颜色
        graphics.setFont(new Font(null, Font.BOLD, 20));//设置字体,null表示使用默认字体,加粗
        //graphics.drawString("123", 0, 20);这是向图片上写一个固定的值123
        graphics.drawString(makeNum(), 0, 20);//这里我们向图片上写入一个随机值
        
        //4.将图片写给浏览器
        ImageIO.write(image, "jpg", response.getOutputStream());
        
    }
    private String makeNum(){
        Random r = new Random();
        String num = r.nextInt(9999) + "";//产生一个0-9999的数字,但又可能不足四位,我们需要补零
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < 4 - num.length(); i++){
            sb.append("0");
        }
        num = sb.toString() + num;
        
        return num; 
    }

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

2.1.4更多头信息

package cn.itcast.response;
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 ResponseDemo4 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setHeader("refresh", "5");//每五秒刷新一次
        response.setHeader("content-type", "text/html;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.getWriter().write("我是Tom");
    }

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

2.2通过response实现请求重定向

package cn.itcast.response;
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 ResponseDemo5 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //方式一、通过设置头的方式,但是这种方式我们不推荐,因为会向服务器发两次请求
        //会降低服务器的性能,同时注意:浏览器中的地址发生了变化
        /*response.setHeader("location", "/ResAndReq/register.html");
        response.setStatus(302);*/
        
        //方式二:推荐使用此方式
        response.sendRedirect("/ResAndReq/register.html");
    }

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

2.3 response细节

(1)getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOutputStream、PrintWriter对象。

(2)getOutputStream和getWriter这两个方法互相排斥,调用其中的任何一个方法后,就不能再调用另一个方法。

(3)servlet程序向ServletOutputStream和PrintWriter对象中写入的数据将被servlet引擎从response里面获取,servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。

(4)servlet的service方法结束后,servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,servlet引擎将调用close方法关闭该输出对象。

2.3.1 各类地址的写法

web工程中url地址的写法,不要用绝对地址,只要是写地址请一定使用斜杠(/)开头,这个斜杠如果是给服务器用的就代表web工程(WebRoot),如果是给浏览器用的就代表webapps。如果要读取硬盘下的东西那使用"\",比如c:\aaa\bbb,如果处理的是一个url资源的话那就使用"/"这种斜杠。在web开发中需要用到地址的情况有servletContext、forward、sendRedirect、html。

package cn.itcast.response;
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 ResponseDemo6 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //ServletContext(WebRoot下download/1.jpg)
        this.getServletContext().getRealPath("/download/1.jpg");
        
        //forward(WebRoot/register.html)
        this.getServletContext().getRequestDispatcher("/register.html");
        
        //sendRedirect(WebRoot/register.html)
        response.sendRedirect("/ResAndReq/register.html");
        
        //html中
        //<a href="/ResAndReq/servlet/ResponseDemo5">按钮</a>
        
    }

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

        doGet(request, response);
    }
}

三、HttpServletRequest

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。

3.1常用方法

3.1.1获得浏览器的信息

getRequestURL()方法返回客户端发出请求时完整的URL
getRequestURI()方法返回请求行中的资源名部分
getQueryString()方法返回请求行中的参数部分
getRemoteAddr()方法返回请求的客户机的完整IP地址
getRemoteHost()方法返回发出请求的客户机的完整主机名
getRemotePort()方法返回客户机所使用的网络端口号
getLocalAddr()方法返回Web服务器的IP地址
getLocalName()方法返回Web服务器的主机名
getMethod()得到客户机的请求方式

例1:获取浏览器环境信息

package cn.itcast.request;
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 RequestDemo1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //结果:http://localhost:8080/ResAndReq/servlet/RequestDemo1
        System.out.println(request.getRequestURL());
        
        //结果:/ResAndReq/servlet/RequestDemo1
        System.out.println(request.getRequestURI());
        
        //结果:null,这里我们没带参数,如果使用
        //http://localhost:8080/ResAndReq/servlet/RequestDemo1?name=yj访问
        //就会返回name=yj
        System.out.println(request.getQueryString());
        
        //结果:0:0:0:0:0:0:0:1这是来访者的地址(IPV6)
        System.out.println(request.getRemoteAddr());
        
        //结果:0:0:0:0:0:0:0:1,注册了才能返回主机名,否则返回此地址
        System.out.println(request.getRemoteHost());
        
        //结果:19404返回浏览器端口号
        System.out.println(request.getRemotePort());
        
        //结果:0:0:0:0:0:0:0:1返回web服务器的IP地址
        System.out.println(request.getLocalAddr());
        
        //结果:0:0:0:0:0:0:0:1服务器的主机名,没有注册所有返回此地址
        System.out.println(request.getLocalName());
        
        //结果:GET这里我们使用的是GET方式
        System.out.println(request.getMethod());    
    }

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

3.1.2获得浏览器的请求头

getHeader(String name)方法
getHeaders(String name)方法
getHeaderNames方法

例1.获取请求头

package cn.itcast.request;
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 RequestDemo2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //获取请求头,但是这个头可能出现多次,此时我们可以使用getHeaders方法
        String head = request.getHeader("Accept-Encoding");
        
        System.out.println(head);
        if(head.contains("gzip")){
            //看是否包含gzip头,若存在,再向其输出压缩数据
        }else{
            //不存在则输出没有压缩的数据
        }
        
        //当一个头出现多次
        Enumeration e = request.getHeaders("Accept-Encoding");
        while(e.hasMoreElements()){
            String value = (String) e.nextElement();
            System.out.println(value);
        }
        
        //获得所有的头和对应的值
        e = request.getHeaderNames();
        while(e.hasMoreElements()){
            String name = (String) e.nextElement();
            String value = request.getHeader(name);
            System.out.println(value);
        }
    }

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

3.1.3获得浏览器请求参数(即浏览器提交的数据)

package cn.itcast.request;
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 RequestDemo3 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String value = request.getParameter("name");
        System.out.println(value);
        
        String[] values = request.getParameterValues("name");
        //注意这里必须判断values是否为空,否则在没有参数的时候会出现异常
        for(int i = 0; values != null && i < values.length; i++){
            System.out.println(values[i]);
        }
        
        //获取所有参数名称,并根据名称获取其值,如:
        //http://localhost:8080/ResAndReq/servlet/RequestDemo1?name=yj&like=ali
        //得到name=yj&like=ali
        Enumeration e = request.getParameterNames();
        while(e.hasMoreElements()){
            String name = (String) e.nextElement();
            value = request.getParameter(name);
            System.out.println(name + "=" + value);
        }
        
        //下面这种方式在框架中大量使用,注意Map中第二个参数有可能是字符串或数组,所以使用String[]
        Map<String, String[]> map = request.getParameterMap();
        for(Map.Entry<String, String[]> me : map.entrySet()){
            String name = me.getKey();
            String[] v = me.getValue();
            System.out.println(name + "=" + v);
        }
    }

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

说明:对于表单提交过来的各种表单数据,也可以通过上面的方式获得。

3.1.4请求参数的中文乱码问题

package cn.itcast.request;
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 RequestDemo4 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //post提交时乱码解决方式:设置服务器打开请求数据时用的码表,即request使用的码表
        //request.setCharacterEncoding("UTF-8");
        
        String username = request.getParameter("username");
        System.out.println(username);
        
        //get提交时乱码解决方式:先使用iso8859-1得到数据,然后再使用正确的编码转换过来
        byte[] source = username.getBytes("iso8859-1");
        username = new String(source, "UTF-8");
        System.out.println(username);
        
    }

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

form.html

<!DOCTYPE html>
<html>
  <head>
    <title>form.html</title>
    <meta name="content-type" content="text/html; charset=UTF-8">
  </head>
  
  <body>
    <form action="/ResAndReq/servlet/RequestDemo4" method="get">
        用户名:<input type="text" name="username"/><br/>
        密码:<input type="password" name="password"/><br/>
        <input type="submit" value="提交"/>
    </form>
  </body>
</html>

注意:使用post方式提交表单数据时需要注意几点:
(1)在html中我们使用<meta name="content-type" content="text/html; charset=UTF-8">规定保存此文件的格式,我们可以选中文件右键àProperties可以在下面的Default处看到文件的编码格式,是和我们设置的编码一致的。

(2)表单在提交的时候我们需要查看浏览器使用哪张码表打开此表单,如果使用GBK打开此表单,那么填写在此表单中提交的数据也将使用GBK编码,提交到服务器之后request.getParameter默认会使用iso8859-1码表将获得的数据转换成字符串,此时会出现乱码。我们可以使用request.setCharacterEncoding("GBK");将Request使用的码表换成GBK,这样和浏览器使用的编码就一致了。
??????????????????????????????????

使用get方式提交表单数据时需要注意:
当使用get方式提交表单数据时,设置Request编码是无效的,于是我们需要先使用iso8859码表得到乱码数据,然后再使用何时的码表将乱码转换成正确的文本数据。这是看视频教程中是这样解决的,但是在自己本地却不好使,当我的网页使用UTF-8打开时提交的数据能正确显示,但是如果使用GBK打开则不能正确显示。也就是网页使用UTF-8编码的数据提交才能正确显示,不是默认去查iso8859-1吗,这难道是tomcat的原因????

还有个问题没有解决:就是当直接使用地址http://localhost:8080/ResAndReq/servlet/RequestDemo4?username='中国' 访问服务器时,不需要设置任何编码就可以显示正确的文本。而且不管浏览器使用什么编码我们在地址栏中都可以看到正确的文本。URL其实对于汉字是直接使用的ASCII码,只是每个字的编码前加上一个%号????

最后还可以更改服务器配置文件,在server.xml中的<Connector>标签的最后加上一个属性:URIEncoding="UTF-8"即可。这时什么都不需要设置了直接使用String username = request.getParameter("username");这种方式一般不适用.这里我们还有一种灵活的方式,在<Connector>标签添加下面这个属性将useBodyEncodingForURI属性设置为true,那么如果我们request.setCharacterEncoding("UTF-8");之后连接器就使用什么编码。不管是什么方式,但是更改服务器的配置文件一般不推荐。

3.1.5 request对象实现请求转发

请求转发是指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。请求转发的应用场景有如MVC设计模式。Request对象提供一个getRequestDispatcher方法,该方法返回一个RequestDespatcher对象,调用这个对象的forward方法可以实现请求转发。

package cn.itcast.request;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestDemo5 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String data = "aaa";
        //注意:在进行数据传递的时候一定不能使用ServletContext对象作为容器,因为
        //此容器是共享的或全局的,在并发访问的时候会出现错误,后面的数据可能会将前面
        //的数据覆盖。
        //this.getServletContext().setAttribute("data", data);//把数据传给jsp处理
        
        //这里最好使用request传递数据,因为浏览器的每次请求都会产生一个自己的request对象
        request.setAttribute("data", data);
        
        //转发
        this.getServletContext().getRequestDispatcher("/text.jsp").forward(request, response);
        /*RequestDispatcher rd = request.getRequestDispatcher("/text.jsp");
        rd.forward(request, response);*/
        
    }

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

注意:在服务器启动后只会产生一个ServletContext对象,这个对象是共享的,而每次请求都会产生一个新的request和response对象,而在转发的过程中是不会创建新的request和response对象,只是会调用多个servlet,后面的servlet会将之前写入的数据清空。

3.2 request对象

此对象同时也是一个域对象(容器),只是这个域对象是针对一次浏览器请求,而不是像ServletContext对象是针对一个web应用,所以声明周期会短,资源也不是共享。开发人员通过request对象在实现转发时,把数据通过request对象带给其他web资源处理。

3.2.1请求转发的细节

forward方法用于将请求转发到RequestDispatcher对象封装的资源。如果在调用forward方法之前,在servlet程序中写入的部分内容已经被真正地传递到了客户端,forward方法将抛出IIIegalStateException异常。如果在调用forward方法之前向servlet引擎的缓冲区(response)中写入了内容,只要写入到缓冲区中的内容还没有被真正输出到客户度,forward方法就可以被正常执行,原来写入到输出缓冲区中的内容将被清空,但是,已经写入到HttpServletResponse对象中的响应头字段信息保持有效,不会被清空或覆盖。

3.2.2请求重定向和请求转发的区别:

(1)一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发。这里的两个servlet共享一个request和response对象。同时地址栏不会发生变化。

(2)一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源,称之为请求重定向。地址栏会发生变化。

(3)RequestDispatcher.forward方法只能将请求转发给同一个web应用中的组件(即多个servlet);而HttpServletResponse.sendRedirect方法可以重定向到同一个站点上的其他应用程序中的资源(多个web应用),甚至是使用绝对URL重定向到其他站点的资源。

(4)调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL地址会发生变化,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址。

(5)HttpServletResponse.sendRedirect方法对浏览器的请求直接做出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源(servlet),浏览器只知道发出了请求并得到了响应结果,并不知道在服务器内部发生了转发行为。

(6)RequestDispatcher.forward方法调用者与被调用者之间共享相同的request和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request和response对象,它们属于两个独立的访问请求和响应过程。

(7)include方法
RequestDispatcher.include方法用于将RequestDispatcher对象封装的资源内容作为当前响应内容的一部分包含进来,从而实现可编程的服务器包含功能。被包含的servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略。

package cn.itcast.request;
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 RequestDemo6 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        request.getRequestDispatcher("/servlet/HeadServlet").include(request, response);
        response.getWriter().write("<br/>aaa<br/>");
        request.getRequestDispatcher("/servlet/FootServlet").include(request, response);
        
    }

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

网头

package cn.itcast.request;
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 HeadServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("这是网头");
    }

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

网脚

package cn.itcast.request;
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 FootServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("这是网脚");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容