菜鸟学Andoid笔记(三十):Response实现重定向和注意事项

一.如何实现重定向

1.重定向的概念

重定向相当于访问这个页面,跳转到另一个页面,状态码是302

2.实现重定向

第一步:在classes建立一个RedirectServlet.class

package com.java;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RedirectServlet {
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
	throws ServletException, IOException {
		resp.setStatus(302);
		resp.setHeader("Location", "/Day04/index.jsp");
		//也可以这样子简写
		//resp.sendRedirect("/Day04/index.jsp");
	}

	public void doPost(HttpServletRequest req, HttpServletResponse resp)
		throws ServletException, IOException {
		doGet(req, resp);
	}
}

第二步:在web.xml设置路径(有什么方法是不用每次在classes新建一个class,不用设置路径就能访问?)

<servlet>
        <servlet-name>RedirectServlet</servlet-name>
        <servlet-class>com.java.RedirectServlet</servlet-class>
    </servlet>
     <servlet-mapping>
        <servlet-name>RedirectServlet</servlet-name>
        <url-pattern>/java/RedirectServlet</url-pattern>
    </servlet-mapping>
二、Response需要注意的问题

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

*response中获取的输出流,在service方法结束后服务器会帮我们关闭,所以一般不要自己在Servlet中关闭这个流.

如何知道这是排斥的?

写一个class在classes测试一下:

package com.java;


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

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		resp.getOutputStream();
		
		resp.getWriter();
		
	}

	public void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doGet(req, resp);
	}

}

这是在浏览器中访问会报错

如果去掉resp.getOutputStream()或resp.getWriter()就不会报错

看另一个例子:

看看Demo1如何跳转到Demo2

Demo1的代码:

package com.java;


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

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
			resp.getWriter();
			//这个是转发,一次请求一次响应,因为Demo2是getOutputStream(),所以跳转失败;
			//this.getServletContext().getRequestDispatcher("/java/Demo2").forward(req, resp);
			//这个是重定向,两次请求两次响应,所以无论Demo2是什么,跳转都不会失败
			resp.sendRedirect("Day04/java/Demo2");
		
	}

	public void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doGet(req, resp);
	}

}

Demo2的代码:

package com.java;

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

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		resp.getOutputStream();
	}

	public void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doGet(req, resp);
	}

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值