javaweb-(Servlet-5)

关于Servlet的跳转

   通过 Request 对象传递数据

方法声明

功能描述

Void

setAttribute(String name,Object o)

用于将一个对象与一个名称关联后存储到 ServletRequest 对象中

Object

getAttribute(String name)

用于从 ServletRequest 对象中返回指定名称的属性对象

void

removeAttribute(String name);

用于从 ServletRequest 对象中删除指定名称的属性

两种方法

RequestDispatcher接口的----forward(ServletRequest request,ServletResponse response)

该方法用于将请求从一个 Servlet 传递给另一个 Web 资源【Servlet程序/html/JSP】。【请求转发】

Redirect----HttpServletRespone.sendRedirect(String path)

HttpServletResponse 接口定义了一个 sendRedirect(String path) 方法.将请求从一个 Servlet 传递给另一个 Web 资源【Servlet程序/html/JSP】

1.forward方法

forward属于RequestDispatcher接口

HttpServletRequest接口从ServletRequest接口中继承了一个获取 RequestDispatcher 对象的方法RequestDispatcher getRequestDispatcher (String path).这个方法返回一个RequestDispatcher对象

参数String path---目标路径【必须以“/”开头,用于表示当前 Web 应用的根目录】

需要注意的是,WEB-INF 目录中的内容对 RequestDispatcher 对象也是可见的。因此,传递给 getRequestDispatcher(String path) 方法的资源可以是 WEB-INF 目录中的文件

具体步骤:

1.获得RequestDispatcher接口对象

RequestDispatcher接口对象=HttpServletRequest接口对象.getRequestDispatcher (String path);

2.调用forward方法传递请求实现跳转

RequestDispatcher接口对象.forward(ServletRequest request,ServletResponse response).

3.传递参数

通过HttpServletRequest对象传递数据的

1.储存数据的方法

HttpServletRequest对象的方法void setAttribute(String name,Object o)用于将一个对象与一个名称关联后存储到 ServletRequest 对象中

2.获得数据对象的方法

Object getAttribute(String name) 用于从 ServletRequest 对象中返回指定名称的属性对象

3.删除数据对象的方法

void removeAttribute(String name) 用于从 ServletRequest 对象中删除指定名称的属性

通过forward方法传递请求实现跳转的结构图

例如:

package com.wangxing.servlet;

import java.io.IOException;

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

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

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("OneServlet");
		//forward(ServletRequest request,ServletResponse response)该方法用于将请求从一个 Servlet 传递给另一个 Web 资源【Servlet程序/html/JSP】
//		RequestDispatcher requestDispatcher = req.getRequestDispatcher("/mm.jpg");
//		requestDispatcher.forward(req, resp);
//		req.getRequestDispatcher("/test.html").forward(req, resp);
		
		
		//测试RequestDispatcher对象传递参数 
		//使用forward(req, resp);跳转由于是同一个请求对象所以地址栏是不会改变的
		//void setAttribute(String name,Object o) 用于将一个对象与一个名称关联后存储到 ServletRequest 对象中
		req.setAttribute("name", "zhangsan");
		req.getRequestDispatcher("/other").forward(req, resp);
		
		
	}
	
	
	
}

 

package com.wangxing.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 OtherServlet extends HttpServlet{

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

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		Object attribute = req.getAttribute("name");
		String name = (String)attribute;
		System.out.println("OtherServlet---name="+name);
	}

		
}

2.sendRedirect()[重定向]

HttpServletResponse 接口定义了一个 sendRedirect(String path) 方法.

将请求从一个 Servlet 传递给另一个 Web 资源【Servlet程序/html/JSP】

结构图

package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 测试sendRedirect方法
 * @author 14336
 *
 */
public class OneServlet extends HttpServlet{

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

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("OneServlet----");
		//sendRedirect(String path) 方法将请求从一个 Servlet 传递给另一个 Web 资源【Servlet程序/html/JSP】
		//此方法由调用者resp响应对象调用我们猜测,它实际上是
		//给了一个资源地址让浏览器再次向这个资源地址发起请求
		//所以它的请求对象是不同的,不可以使用请求对象传递数据
		
//		resp.sendRedirect("/mm.jpg");//错误
		//加了"/"我们发现地址跳转了但是未找到资源
		//测试加"./"表示在当前文件夹中寻找
		//这里的路径不是地址栏的虚拟路径,而是相对/绝对路径
//		resp.sendRedirect("./mm.jpg");//可以跳转
//		resp.sendRedirect("test.html");//可以跳转
		
		//测试通过sendRedirect方法跳转能否传递数据
		req.setAttribute("name", "zhangsan");
		resp.sendRedirect("other");
		
	}
	
}
package com.wangxing.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 OtherServlet extends HttpServlet{

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

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	     String reques = req.getRequestURI();
	     resp.setCharacterEncoding("utf-8");
	     System.out.println("request="+reques);
	      String name = (String)req.getAttribute("name");
	      System.out.println("name="+name);
	      PrintWriter printWriter =resp.getWriter();
	      printWriter.write("other"+new String("xiangying".getBytes(), "utf-8"));
	      printWriter.close();
	}
	
}

区别: 

RequestDispatcher.forward(req, resp)

HttpServletRespone.sendRedirect()

请求转发

重定向

使用的是同一个请求对象

使用的是不同的请求对象

浏览器地址栏中的url不会变

浏览器地址栏中的url会变化

可以通过HttpServletRequest对象传递数据

不可以通过HttpServletRequest对象传递数据

设置目标路径时“/”可以写也可以不写

设置目标路径时“/”一定不能写

依赖ServletRequest接口

依赖HttpServletRespone对象

 

上面的测试是由Servlet程序访问Html/其他的Servlet

我们能不能通过html访问Servlet程序?

能,有三种方式:

  1. 通过html的表单元素
  2. 通过html的超链接
  3. 通过javascript的ajax发送异步请求
package com.wangxing.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 LoginServlet extends HttpServlet{

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

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//getParameter("username");获得表单数据中的值
		String name = req.getParameter("username");
		String password = req.getParameter("password");
		System.out.println("name="+name+"\n"+"pass"+password);
	}

	
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<!--  
<center>
	<form action="./login" mothod="post">
		<table border="1px">
			<tr align="center">
				<td colspan="2"><h1>用户登录</h1></td>
			</tr>
			<tr>
				<td>账号:</td>
				<td><input type="text" name="username"/></td>
			</tr>
			<tr>
				<td>密码:</td>
				<td><input type="password" name="password"/></td>
			</tr>			
			<tr>
				<td><input type="submit" value="登录"/></td>
			</tr>		
		</table>
	</form>
</center>
-->
<h1 align="center"><a href="login?username=张三&password=123">用户登录</a></h1>
</body>
</html>

 

猜你喜欢

转载自blog.csdn.net/weixin_52192654/article/details/115017828