servlet1
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
req.setAttribute("key1","servlet1 的key1");
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/s2");
requestDispatcher.forward(req,resp);
}
}
servlet2
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
System.out.println("servlet2: "+username);
Object key1 = req.getAttribute("key1");
System.out.println("servlet是否处理:"+key1);
System.out.println("servlet2处理自己的业务");
}
}
请求转发的特点
- 浏览器地址栏没有发生变化
- 他们是一次请求
- 他们共享的是request域中的数据
- 可以转发到WEB-INF目录下
- 不能访问工程外的资源
请求转发后跳转到上级目录则会发生404,因为
<a href="../../index.html">跳转到../../index.html</a>
..
是参照浏览器中的地址栏进行跳转的,但是请求转发后地址栏是http://localhost:8080/JavaWEB/f
如果使用相对路径跳转会出现错误。
此时要在head标签下引入base标签,base标签的作用就是设置页面相对路径工作时的参考地址,href属性就是参数的地址值
<head>
<meta charset="UTF-8">
<title>chtml</title>
<base href="http://localhost:8080/JavaWEB/a/b/">
</head>
其中<base href="http://localhost:8080/JavaWEB/a/b/">
中的 b后面的 /
一定要注意,代表b是一个目录
WEB中 / 斜杠的不同意义
在web中 / 斜杠是一种绝对路径
/ 斜杠如果被浏览器解析,得到的地址是:
http://ip:port/
<a href="/">斜杠</a>
/ 斜杠如果被服务器解析,得到的地址是:
http://ip:port/工程路径
- /servlet1
- servletContext.getRealPath("/");
- request.getRequestDispatcher("/");
特殊情况:
response.sendRediect("/");
把斜杠解析得到 http://ip:port/
两个输出流的说明:
字节流 getOutputStream();
常用语下载(传递二进制数据)
字符流 getWirter();
常用回传字符串(常用)