请求转发和重定向
作用: 用于web组件的跳转,从A组件调到另一个组件
请求转发forward
由服务器端进行页面跳转,称为转发 .服务器只发出了一次请求
方法
request.getRequestDispatcher("/需要跳转的地址").forward(req,resp);
1.在请求转发中,地址栏中的参数可以共享
2.请求转发中,最后显示在浏览器上的内容为最后一个资源的内容
3.在请求转发中,不能访问站外(跨域)资源. 跨域:ip,端口,协议 任意一个改变都叫跨域
4.在请求转发中,地址栏不发生改变(对于浏览器来说 只发送 只有一次请求)
5.在请求转发中,可以访问WEB-INF下面的资源
@WebServlet("/forward/one")
public class OneServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("OneServlet.service");
//接收参数
String name = req.getParameter("name");
System.out.println("OneServletName = " + name);
//请求转发
req.getRequestDispatcher("/forward/two").forward(req,resp);
// req.getRequestDispatcher("index.jsp").forward(req,resp);
//req.getRequestDispatcher("http://baidu.com").forward(req,resp);
return;
}
}
@WebServlet("/forward/two")
public class TwoServlet extends HttpServlet {
/* @Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("TwoServlet.service");
String name = req.getParameter("name");
System.out.println("TwoServletName = " + name);
resp.getOutputStream().write("我是twoServlet".getBytes());
}*/
}
使用request.getRequestDispatcher("/需要跳转的地址").forward(req,resp),可以与JSP交互,如果jsp文件是在WEB-INF目录下,则跳转地址为 : /WEB-INF/xxx.jsp
重定向redirect
由客户端进行的页面跳转,称为重定向。服务器发出多次请求
1.在重定向中,地址栏中的参数不能共享
2.在重定向中,最后显示在浏览器上的内容为最后一个资源的内容
3.在重定向中,能访问站外资源(跨域访问)
4.在重定向中,地址栏发生改变(表示有多次请求)
5.在重定向中,不可以访问WEB-INF下面的资源
转发与重定向的区别
- 地址栏: 转发地址栏不会发生改变,还是上一个地址. 重定向会变化,新地址
在请求转发中,地址栏中的参数可以共享,在重定向中,地址栏中的参数不能共享
- 跳转位置:转发在服务端进行跳转 ,重定向在浏览器跳转
- 跨域访问: 在请求转发中,不能访问站外(跨域)资源 ,重定向中可以
三大作用域
用于Servlet之间数据共享的服务器内存区域,作用域结构是一个Map<String,Object>
作用域 | 类型 | 作用范围 |
---|---|---|
请求域 | HttpServletRequest | 只在同一次请求起作用 |
会话域 | HttpSession | 同一会话起作用,浏览器第一次访问知道浏览器关闭称为一次会话 |
上下文域 | ServletContext | 服务器启动知道服务器关闭整个过程都起作用 |
从上到下,有限期变长
请求域:只有在请求转发中才能用
作用域方法
域对象
这里的req只是我举例的一个参数
- request域:
req.setAttribute("键",Object数据(可以传入集合对象))
- session域:req.getSession().setAttribute(“键”,Object数据)
- 上下文域:req.getServletContext().setAttribute(“键”,object)
获取值
Object getAttribute(“键”) :从中得到一个值
EL表达式
概念: EL(Expression Language) :表达式语言
简单来说就是让JSP代码更加简化,这里只是简单了解一下即可
语法: ${变量名或者表达式}
@WebServlet("/el")
public class ELServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("name","小罗");
req.getRequestDispatcher("/WEB-INF/el.jsp").forward(req,resp);
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
名字:${name}
</body>
</html>
- 获取对象中的属性 对象.属性 或者对象[‘属性名称’]
El算术表达式
+,- , * , 除: /或者(div) , 取余%或者mod
比较表达式
逻辑表达式
&& 或者and
||
! 或者not
三元运算符
${逻辑判断? 真 :假}
判空表达式(注意)
判空,判断内容是否为空,不是对象是否为空
从EL作用域取值
页面域对象名:pageContext,是JSp其中一个内置对象名
pageContext对象
pageContext.findAttribute("msg")
先去request 域寻找key为msg对应的value值,如果找不到,则去session中寻找,如果没有就去servletContext中寻找,如果找不到则返回空字符串""
JSTL标签库
主要还是为了简化JSP
常用的标签库
- 核心标签库 url:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
,用于页面逻辑控制 ,例如 if,forEach 前缀为 :c - 格式化标签库:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
,用于执行格式化操作,如格式化日志字符串 前缀:fmt
使用前,需要导包 在:\apache-tomcat-8.5.46\webapps\examples\WEB-INF\lib下
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--test 里面放入之歌判断表达式--%>
<c:if test="${age>=18}">
成年人,可以蹦迪
</c:if>
<%--choose--%>
<c:choose>
<c:when test="">
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
<%--foreach标签--
相当于 for(String x :list){
x
}
%>
<%--foreach--%>
<%--
items :共享在域对象中的key
varStatus 对象属性 用来标记序号的
index属性 是索引 count 是序号
--%>
<c:forEach items="${list}" var="x" varStatus="vs">
${x}---${vs.count}-----${vs.index} <br/>
</c:forEach>
<%-- value 表示给谁格式化
pattern 格式化的样式
--%>
<fmt:formatDate value="${birthday}" pattern="yyyy-MM-dd"/>
</body>
</html>
@WebServlet("/jstl")
public class JSTLServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("age","18");
req.setAttribute("list", Arrays.asList("a","b","c","d"));
req.setAttribute("birthday",new Date());
req.getRequestDispatcher("/WEB-INF/jstl.jsp").forward(req,resp);
}
}