java--servlet输出流和请求包含的一些小细节

来源:互联网 发布:nginx配置ip端口访问 编辑:程序博客网 时间:2024/06/06 17:44

这里写图片描述

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><html>  <head>    <title>servlet输出流和包含的一些小细节</title>  </head>  <body>    <!--         1.servlt两种输出流:字节流(response.getOutputStream())和字符流(response.getWriter())            1)用字节流输出时,中文采用out.write("湖南城院".getBytes("utf-8"));            对于字节流用response.setContentType("text/html;charset=utf-8");无效            2)用字符流输出时,中英文都采用pw.println("pw湖南城院");方式            对于字节流用response.setContentType("text/html;charset=utf-8");设置            3)在servlet中,字节流和字符流不能同时出现        2.请求包含(共享同一个request和response ,类似函数调用中的传参)            1)通过request实现,与转发一样是通过RequestDispatcher,只是前者是rd.forward(req,resp),后者是rd.include(req,resp);            2)在第1个servlet中out.flush(),对两个servlet的输出都没有影响。但如果在第1个servlet中out.close(),则第1个之后的输出以及第2个servlet中的输出都无效(不会输出),注意,后面的rd.include()仍然有效即第2个servlet虽然不能输出但仍会执行,且没有异常报出!            3)页面内容输出顺序:          servlet1..包含之前的输出...         servlet2.....(被包含的servlet输出)         servlet1..包含之后的输出...            4)由于该方式和转发一样是共享同一个request和response,因此有关页面参数读取和两个servlet之间的传参特性,同转发!            5)访问顺序(同转发): 第1个GET方式,第2个走的是doGet()。 第1个POST方式,第2个走的是doPost()。            6)一个小细节:被包含servlet中的所有输出信息(包括<html><body>等标记内容)都会原样输出,                //因此要注意,两个servlet之间的输出内容不要出现标记嵌套冲突! ( 如:<html><body><html><body>...</body></html></body></html>  )     -->    GET:<a href="servlet/out">servlt两种输出流:字节流和字符流</a><br/>    POST:<form action="<%=request.getContextPath()%>/servlet/out" method="post">        姓名:<input type="text" name="name"/><br/>        <input type="submit" value="提交"/>    </form>    <h2>请求包含</h2>    GET:<a href="servlet/one?name=tom湖南">请求包含--两个servlet的访问顺序,读取页面数据,传参</a><br/>    POST:<form action="<%=request.getContextPath()%>/servlet/one" method="post">        姓名:<input type="text" name="name"/><br/>        <input type="submit" value="提交"/>    </form>  </body></html>

servlt两种输出流
Servlet通过ServletResponse响应用户的请求。
它的方法:
        setCharacterEncoding – ISO-8859-1
        setContentLength(int.)
        setContentType -如果不设置默认为text/plain-文本。text/html
        getOutputStream - 返回的是ServletOutputStream
        getWriter - 返回PrintWriter
HttpServletResponse:
继承ServletResponse
它扩展的方法如下:
        addHeader(name,value) – 向http响应头加入一项内容。
        sendError(int)向客户端发送一个代表特定错误的HTTP响应状态码。-405
        sentError(int,msg)
        setHeader(name,value)
        setStatus(302)设置http响应的状态码。
        setHeader(“location”.,”index.jsp”);
        addCookie(Cookie)向http响应加入一个Cookie
使用HttpServletResponse显示中文:

package cn.hncu.servlet;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;public class OutServlet extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        /*//response.setContentType("text/html;charset=utf-8");//这一句对字节流无效//OutputStream out=response.getOutputStream();//此输出流没有.print()方式的输出        ServletOutputStream out=response.getOutputStream();//out.println("湖南城院");//编码问题--500报错//ServletOutputStream的print方法。默认以ISO-8859-1的方式编码,IOS-8859-1不识别中文所以出错。        out.write("out湖南城院".getBytes());//乱码        out.write("out湖南城院".getBytes("utf-8"));        *///      response.setCharacterEncoding("utf-8");//      response.setContentType("text/html");//这两句等于下面这句        response.setContentType("text/html;charset=utf-8");//这一句对字节流无效        PrintWriter pw=response.getWriter();        pw.println("pw湖南城院");    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        /*        //response.setContentType("text/html;charset=utf-8");//这一句对字节流无效        //OutputStream out=response.getOutputStream();//此输出流没有.print()方式的输出                ServletOutputStream out=response.getOutputStream();        //out.println("湖南城院");//编码问题--500报错                out.write("out湖南城院-post".getBytes());//乱码                out.write("out湖南城院-post".getBytes("utf-8"));                *///              response.setCharacterEncoding("utf-8");//              response.setContentType("text/html");//这两句等于下面这句                response.setContentType("text/html;charset=utf-8");//这一句对字节流无效                PrintWriter pw=response.getWriter();                pw.println("pw湖南城院-post");    }}

这里写图片描述

这里写图片描述

包含
在某种情况下,一个Servlet类可能无法完成全部的工作,为了让各Servlet协同工作,Servlet规范为Web组件之间协同工作提供了两种途径:
        请求转发。-源组件将请求转发给目标组件。
        请求包含。-源组件将目录组件的结果包含到自身的响应结果中来
请求包含的处理特点如下:
1、如果目标组件为Servlet或jsp就调用它的service方法。如果是html页面就直接将结果内容添加到源组件的响应结果中。
2、再返回到源组件中继续执行后续的代码。
3、在目标组件中设置的响应头将会被忽略。
4、如果在目录组件中关闭了输出流,则源组件后面的输出将不会输出到客户端。

package cn.hncu.servlet.three;import java.io.IOException;import java.io.PrintWriter;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 SrcIncludeServlet extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html;charset=utf-8");        PrintWriter out = response.getWriter();        out.println("include1111..get...包含之前...");        //out.flush();        //out.close();        //请求包含        RequestDispatcher rd = request.getRequestDispatcher("/servlet/DestIncludeServlet");        rd.include(request, response);//包含---可理解成类似调用函数的方式。   主要是调用第2个servlet中的service(req,resp)    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        System.out.println("include...post....11111");        response.setContentType("text/html;charset=utf-8");        PrintWriter out = response.getWriter();        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");        out.println("  <BODY>");        out.println("include1111..post...包含之前...");        //请求包含        RequestDispatcher rd = request.getRequestDispatcher("/servlet/DestIncludeServlet");        rd.include(request, response);//包含        out.println("include1111..post...包含之后...");        out.println("  </BODY>");        out.println("</HTML>");    }}
package cn.hncu.servlet.three;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;public class DestIncludeServlet extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html;charset=utf-8");        PrintWriter out = response.getWriter();        out.println("include2222..get页面数据输出......");    }    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 PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>destInclude</TITLE></HEAD>");        out.println("  <BODY>");        out.println("include2222..post页面数据输出......");        out.println("  </BODY>");        out.println("</HTML>");    }}

这里写图片描述

这里写图片描述

0 0
原创粉丝点击