java--servlet相关类(4)
来源:互联网 发布:投标书编制软件 编辑:程序博客网 时间:2024/06/11 10:21
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><html> <head> <title>转发/重定向的一些小细节</title> </head> <body> <!-- 1.转发时,两个servlet都输出信息的问题: 转发是通过request进行----助理解是呼叫转移 , 转发时,路径不要带项目名 1)OneServlet的输出信息只是保存到缓存中,会被TwoServlet清空。因此OneServlet中的内容无法输出 2)如果在OneServlet中调用"out.flush();",那么OneServlet中的信息会输出,而TwoServlet不会输出。不但如此,OneServlet中的转发都会出异常,因为: 刷缓存就是要Tomcat帮我们输出信息。而同一个请求,Tomcat只会输出一次,因此输出之后流就关闭了,无法再转发。 3)该方式下,地址栏中始终显示的是第1个的访问地址 2.转发时(共享同一个request和response),两个servlet的访问顺序,传参: 1)访问顺序:OneServlet中是GET方式,TwoServlet走的是doGet()。 OneServlet中是POST方式,TwoServlet走的是doPost()。 2)在OneServlet中转发代码之后,不能再调用类似 转发或重定向 的代码。否则会500异常,因为转发之后,不能再回到此处进行跳转到别的页面 3)读取页面参数: 由于是共享同一个request,请求页面的参数在两个servlet当中都可以读取出来。---请求页面中,GET方式的参数是在地址栏中通过"?name=Jack&age=22"上传,POST方式是通过<input>组件上传的。 4)两个servlet之间传参: 在OneServlet中request.setAttribute(),在TwoServlet中request.getAttribute()可以读取到 3.重定向(两个不同的request和response),两个servlet的访问顺序,传参: 1)重定向是通过response实现的: response.sendRedirect() //重定向时的路径一定要带项目名称 2)第1个servlet中的内容会输出,但瞬间就会被第2个覆盖。因为浏览器接收到第1个的响应时,立刻会自动发起第2次请求,进而接收并显示第2次请求的响应结果。 3)在第1个servlet重定向代码之后,不能再调用类似 转发或重定向 的代码。否则会500异常,因为转发之后,不能再回到此处进行跳转到别的页面 4)访问顺序: 无论第1个是GET方式还是POST方式,第2个走的是doGet()。----该方式下,地址栏中最终会显示成第2个的访问地址 5)读取页面参数: 由于是不同的request,请求页面的参数在第1个servlet当中能够读取出来,而第2个servlet中不能读取出来。 6)两个servlet之间传参: “无法”通过 在第1个中request.setAttribute(),在第2个中request.getAttribute(); ----通过attribute的路中走不通的 如果非要传参,可以通过:在第1个servlet当中给重定向地址添加“?name=Jack&age=25”实现---该方式下地址栏会显示参数信息,明文传输信息,因此敏感数据要加密 7)站外跳转 只能通过重定向来实现,而且地址必须以“http://”开头,否则会被识别成站内。 --> <h2>转发</h2> GET:<a href="servlet/one?name=湖南">转发--两个servlet的访问顺序,读取页面数据,传参</a><br/> POST:<form action="<%=request.getContextPath()%>/servlet/one" method="post"> 姓名:<input type="text" name="name"/><br/> <input type="submit" value="提交"/> </form> <h2>重定向</h2> GET:<a href="servlet/oneServlet?name=rose湖南">重定向--两个servlet的访问顺序,读取页面数据,传参</a><br/> POST:<form action="<%=request.getContextPath()%>/servlet/oneServlet" method="post"> 姓名:<input type="text" name="name"/><br/> <input type="submit" value="提交"/> </form> </body></html>
转发演示
在某种情况下,一个Servlet类可能无法完成全部的工作,为了让各Servlet协同工作,Servlet规范为Web组件之间协同工作提供了两种途径:
请求转发。-源组件将请求转发给目标组件。
请求包含。-源组件将目录组件的结果包含到自身的响应结果中来。
注:转发和包含会共享同一个request的response对像
获取RequestDispatcher的两种方法
调用ServletContext.getRequestDispatcher(path)
调用HttpServletRequest.getRequestDispatcher(path)
以上两者的区别在于 (建议使用第二种并使用/开头)
前者path参数必须是绝对路径,即必须以/开头。
后者path即可以是绝对路径,也可以是相对路径
请求转发的处理流程
1、清空用于存放响应正文数据的缓冲区。
也正因此,源组件在转发之前的内容不会被发送的客户端。
2、如果目标组件为Servlet、Jsp就调用它们的Service方法。如果目标组件为html页面,就读取此文本将它发送到客户端。
3、关闭输出流。也正因此,源组件在调用之后发送的文本不会被发送的客户端。
cn.hncu.servlet.one.OneServlet
package cn.hncu.servlet.one;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 OneServlet 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("GET城院!");// out.flush();//刷完之后,本页面输出,而TwoServlet不会输出,转发会出异常(转发及之后的代码都不会执行) System.out.println("GET城院!"); String name=request.getParameter("name"); //有中文 byte bs[]=name.getBytes("ISO-8859-1"); name=new String(bs,"utf-8"); request.setAttribute("age", "10城院"); String age=(String) request.getAttribute("age"); System.out.println("OneServlet-GET:name="+name+",age="+age); request.getRequestDispatcher("/servlet/two").forward(request, response);// response.sendRedirect("/servletDemo_4/servlet/two");//500异常 out.println("GET城院2..."); System.out.println("GET城院2..."); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("POST城院!");// out.flush();//刷完之后,本页面输出,而TwoServlet不会输出,转发会出异常(转发及之后的代码都不会执行) System.out.println("POST城院!"); String name=request.getParameter("name"); //有中文 byte bs[]=name.getBytes("ISO-8859-1"); name=new String(bs,"utf-8"); request.setAttribute("age", "10城院"); String age=(String) request.getAttribute("age"); System.out.println("OneServlet-POST:name="+name+",age="+age); request.getRequestDispatcher("/servlet/two").forward(request, response);// response.sendRedirect("/servletDemo_4/servlet/two");//500异常 out.println("POST城院2..."); System.out.println("POST城院2..."); }}
cn.hncu.servlet.one.TwoServlet
package cn.hncu.servlet.one;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 TwoServlet 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("TwoServlet-GET城院!"); String name=request.getParameter("name"); //有中文 if(name!=null){ byte bs[]=name.getBytes("ISO-8859-1"); name=new String(bs,"utf-8"); } String age=(String) request.getAttribute("age"); out.println("<br/>name="+name+",age="+age); System.out.println("TwoServlet-GET:name="+name+",age="+age); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("TwoServlet-POST城院!"); String name=request.getParameter("name"); //有中文 if(name!=null){ byte bs[]=name.getBytes("ISO-8859-1"); name=new String(bs,"utf-8"); } String age=(String) request.getAttribute("age"); out.println("<br/>name="+name+",age="+age); System.out.println("TwoServlet-POST:name="+name+",age="+age); }}
重定向演示
注:重定向是浏览器自动又向服务器发起的新请求。所以不会共享之前的request和response对像。
cn.hncu.servlet.two.OneServlet
package cn.hncu.servlet.two;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 OneServlet 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("GET城院!");// out.flush();//刷完之后,本页面输出,而TwoServlet不会输出,转发会出异常(转发及之后的代码都不会执行) System.out.println("GET城院!"); String name=request.getParameter("name"); //有中文 byte bs[]=name.getBytes("ISO-8859-1"); name=new String(bs,"utf-8"); request.setAttribute("age", "10城院"); String age=(String) request.getAttribute("age"); System.out.println("OneServlet-GET:name="+name+",age="+age); response.sendRedirect("/servletDemo_4/servlet/two"); //在地址后面或者地址栏信息后面添加参数--不安全(明文传输消息),所以敏感信息选哟加密// request.getRequestDispatcher("/servlet/two").forward(request, response);//500异常 out.println("GET城院2..."); System.out.println("GET城院2..."); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("POST城院!");// out.flush();//刷完之后,本页面输出,而TwoServlet不会输出,转发会出异常(转发及之后的代码都不会执行) System.out.println("POST城院!"); String name=request.getParameter("name"); //有中文 byte bs[]=name.getBytes("ISO-8859-1"); name=new String(bs,"utf-8"); request.setAttribute("age", "10城院"); String age=(String) request.getAttribute("age"); System.out.println("OneServlet-POST:name="+name+",age="+age); response.sendRedirect("/servletDemo_4/servlet/two");// request.getRequestDispatcher("/servlet/two").forward(request, response);//500异常 out.println("POST城院2..."); System.out.println("POST城院2..."); }}
cn.hncu.servlet.two.TwoServlet
package cn.hncu.servlet.two;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 TwoServlet 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("TwoServlet-GET城院!"); String name=request.getParameter("name"); //有中文 byte bs[]=name.getBytes("ISO-8859-1"); name=new String(bs,"utf-8"); String age=(String) request.getAttribute("age"); out.println("<br/>name="+name+",age="+age); System.out.println("TwoServlet-GET:name="+name+",age="+age); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("TwoServlet-POST城院!"); String name=request.getParameter("name"); //有中文 byte bs[]=name.getBytes("ISO-8859-1"); name=new String(bs,"utf-8"); String age=(String) request.getAttribute("age"); out.println("<br/>name="+name+",age="+age); System.out.println("TwoServlet-POST:name="+name+",age="+age); }}
输出:
- java--servlet相关类(4)
- java--servlet相关类(1)
- java--servlet相关类(2)
- java--servlet相关类(3)
- Java Servlet相关操作
- javaweb学习(4)--servlet相关
- Servlet相关常用类
- Servlet相关常用类
- java web Servlet及其相关类的介绍
- Java基础——Servlet(六)分页相关
- Java基础——Servlet(七)过滤器&监听器 相关
- JAVA中得到类相关路径 或 Servlet/JSP相关路径的方法
- java servlet获得客户端相关信息
- java基础:jsp、Servlet相关知识
- java(15)--Servlet中response相关知识
- java(15)--servlet中Request相关知识
- 【每天学一点】JAVA Servlet相关
- 【每天学一点】JAVA Servlet相关02
- 数组简单介绍
- 关于eSIM的一些简单介绍
- 棋盘问题(POJ1321)(A)
- 打工
- 关于打包成APK
- java--servlet相关类(4)
- 机房收费系统之上下机思路整理
- C语言位运算
- unity3d--物体移动方式总结
- Error和Exception的区别
- 稀疏表示之OMP,SOMP算法及openCV实现
- SQL 之 范式
- Codeforces722D-Generating Sets(set + 二分答案)
- MFC中tab control控件的使用方法