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>"); }}
- java--servlet输出流和请求包含的一些小细节
- javaEE------------------有关servlet的一些细节(输出流以及转发、重定向和请求包含)
- 【Java.Web】Servlet —— 请求的转发和包含
- javaEE:day9-request和response的转发、重定向、请求包含小细节
- request和response的转发、重定向、请求包含小细节
- servlet中的一些小细节
- 11 java 王少飞-Servlet的一些细节
- Servlet的一些细节
- Servlet的一些细节
- Servlet的一些细节
- Servlet的一些细节
- Servlet的一些细节
- Servlet的一些细节
- Servlet的一些细节
- servlet的一些细节
- Servlet的一些细节
- Servlet的一些细节
- [Servlet]Servlet的一些细节
- 取得uuid并且放进钥匙串
- Opencv模块学习
- DOM同时设置mouseover与mouseout事件控制元素显示时出现闪烁问题
- redhat系统下网络配置
- Apache commons codec |MD5 SHA BASE64 简单方便操作
- java--servlet输出流和请求包含的一些小细节
- HTML第一章课后四
- 禁止浏览器缓存方案
- Single address spaces: design flaw or feature? part1
- 20条linux命令面试问答
- 强烈推荐一个在线caffe网络可视化工具!!
- linux系统的7种运行级别
- PostgreSQL创建新表
- 线程中的对象