关于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程序?
能,有三种方式:
- 通过html的表单元素
- 通过html的超链接
- 通过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>