servlet的转发(request.getRequestDispatcher().forward())

1.字符流与字节流

package cn.hncu.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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 {
		doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//字节流
		ServletOutputStream out=response.getOutputStream();
		out.println("hello..");
//		out.println("中文..");	//字节流无法用print()输出中文--只支持iso8859-1,所以英文可以,中文不可以--出现500异常
		out.write("中文".getBytes());//字节流可以用write()方法输出中文---不用设置编码
		
		getServletContext().getContextPath();
		//只能获取一种流(字节流,字符流不能共存)
//		PrintWriter pw=response.getWriter();
//		response.setCharacterEncoding("utf-8");//只是设置传输编码,并没有告诉浏览器要用什么编码来解析
		response.setContentType("text/html;charset=utf-8");//既可以设置传输编码,又可以告诉浏览器使用什么编码来解析
//		pw.println("中文");
		
	}

}
2.转发(request.getRequestDispatcher("/OutTwoServlet").forward(request, response))
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 OutOneServlet 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 {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		out.println("第一个Servlet的输出信息");
//		out.flush();
		/*
		 * 1.第1个servlet的输出信息只是保存在缓存中,会被第2个servlet清空
		 * 2.如果第1个servlet刷了缓存flush(),第2个servlet不会输出,而且转发会出现异常
		 * 3.这种方式下,转发后地址栏显示的还是第一个servlet的地址
		 */
		//转发--站内转发,不要带项目名
		request.getRequestDispatcher("/OutTwoServlet").forward(request, response);
	}
}
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 OutTwoServlet 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 {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		out.println("第二个Servlet的输出信息");
	}

}
package cn.hncu.servlet;

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:794530831@qq.com">dragon_Dai</a>
 * @version 2017-09-30 下午2:59:49
 * @filename ForwardOneServlet.java
 */
public class ForwardOneServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("One.111:doGet....");
		//转发地址栏中,地址栏中显示的第一个servlet的地址,真正应答的是第2个servlet
		
//		request.setCharacterEncoding("utf-8");  Get方式请求,这样对中文乱码解决无效
		//上面这一句只是设置请求体的编码,而Get方式的数据在请求头中
		String name=request.getParameter("name");
		name=new String(name.getBytes("iso8859-1"), "utf-8");
		
		String age=request.getParameter("age");
		System.out.println(name+","+age);
		
		//传参数--通过这种方式,往request容器中存放数据,供下一个servlet从中取
		request.setAttribute("time", "2017年9月29日20点13");
		
		//转发--如果第一个servlet通过get方式请求,转发后的第二个servlet,也是采用get方式请求
		request.getRequestDispatcher("/ForwardTwoServlet").forward(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("One.222:doPost....");
		
		request.setCharacterEncoding("utf-8");
		String name=request.getParameter("name");
		String age=request.getParameter("age");
		System.out.println(name+","+age);
		//转发--如果第一个servlet通过post方式请求,转发后的第二个servlet,也是采用post方式请求
		int n=5;
		if(n>3){
			request.getRequestDispatcher("/ForwardTwoServlet").forward(request, response);
		}
		//第一个servlet转发代码后,不能再转发,否则会发生500异常
//		if(n<10){
//			request.getRequestDispatcher("/OutTwoServlet").forward(request, response);
//		}
	}

}
package cn.hncu.servlet;

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 ForwardTwoServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("Two.111:doGet....");
		
//		request.setCharacterEncoding("utf-8");  Get方式请求,这样对中文乱码解决无效
		//上面这一句只是设置请求体的编码,而Get方式的数据在请求头中
		String name=request.getParameter("name");
		name=new String(name.getBytes("iso8859-1"), "utf-8");
		
		String age=request.getParameter("age");
		System.out.println(name+","+age);
		
		//从requset中取出前面存放的数据--因为可以存放各种数据,所以返回值为Object
		String time = (String) request.getAttribute("time");
		System.out.println(time);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("Two.222:doPost....");
		
		request.setCharacterEncoding("utf-8");
		String name=request.getParameter("name");
		String age=request.getParameter("age");
		System.out.println(name+","+age);
	}
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值