转发和重定向
**作用:**为了让jsp和servlet做到责任分离,用于web组件的跳转
**web组件:**jsp+servlet
转发的方法
request.getRequestDispatcher("跳转的地址").forward(request,response)
**跳转的位置:**在服务端进行跳转
重定向的方法
response.sendRedirect("要跳转的地址")
**跳转的位置:**在浏览器进行跳转
转发与重定向的区别
区别 | 转发 | 重定向 |
---|---|---|
访问时的路径 | 访问不写项目路径 | 必须写项目路径 |
地址栏 | 地址不变 | 会变,进行了跳转,重新访问了一次 |
跳转的位置 | 服务端 | 浏览器 |
是否丢失数据 | 不会丢失数据,同一个对象 | 会丢失地址,第二次访问时,浏览器再次向服务器发送请求 |
web-info下资源 | 可以访问 | 不能访问 |
跨域访问 | 不能跨域,只能访问当前资源 | 可以跨域 |
转发和重定向的注意事项:
**1.**想要共享数据的话只能使用请求转发(只有一次请求),重定向不能使用,(会丢失数据,两次请求不一样
2.建议:在不适用请求转发的情况下,就使用重定向,规避求取重复提交的数据
**3.**两种方式不能同时使用
**4.**跳转之后代码会继续执行,但是无效,不在跳转之后写代码
三大作用域及各自使用方法(共享数据)
作用:在多个web组件中共享数据,底层是map集合
作用域 | 类型 | 范围及区别 |
---|---|---|
请求域 | Request | 在同一次请求中使用,数据表中的数据有更新 |
会话域 | Session | 在同一个会话中使用,浏览器第一次访问项目会创建对象,一次请求响应后就会销毁 |
上下文域 | servletContext | 在同一个项目中使用,只有服务器关闭的时候结束 |
作用域常用的方法
得到一个值: Obijiect getAttribute(“键”)
作用域的请求方法与获取方法
不同的作用域获取共享数据的方式不同
请求域
req.setAttribute("name","张三");
req.getAttribute("name")
会话域
HttpSession session = req.getSession();
session.setAttribute("age",24);
HttpSession session = req.getSession();
System.out.println(session.getAttribute("age"));
上下文域
ServletContext servletContext = req.getServletContext();
servletContext.setAttribute("email","1245@qq.com");
ServletContext servletContext = req.getServletContext();
System.out.println(servletContext.getAttribute("email"));
作用域的选择
首先考虑范围小的作用域,若小的作用域满足就使用小的作用域
顺序为:请求域->会话域->上下文域
EL表达式(${变量名或者表达式})
作用:解决jsp页面中繁琐的java代码,可以直接访问javaBean中的属性和方法,做简单的逻辑运算和比较运算.
**目的:**获取作用域中的数据
获得对象属性值的书写方法:${对象.属性名}
**注意:**取对象的属性值,如果不存在,则报错PropertyNotFoundException
若map集合中的key包含特殊字符,使用"对象[“key”]"获取值
EL中使用表达式
算数运算符
比较表达式
三元运算符
判空
只要该属性里面没有内容(空字符串,空集合,作用域变量值空),都表示为true
${empty s.fave}
EL四个作用域取值(使用内置对象)
四大作用域依次查找:pageContext->request->Session->application
pageContext只能在同一个页面进行共享
注意:当多个作用域中的共享数据同名时,使用${name}获取数据只会得到作用域最小的那一个数据
**解决办法:**使用EL中的Scope内置对象,更加见名知意,这样就可以渠道各自作用域的共享数据
req.setAttribute("name","refquest");
req.getSession().setAttribute("name","session");
req.getServletContext().setAttribute("name","application");
取值:
${requestScope.name}
${sessionScope.name}
${applicationScope.name}
JSTL标签库
**作用:**减少jsp代码的复杂度,分离了展示和逻辑代码可以做,一般和el配合使用
**注意:**使用标签库之前需要向lib中添加"taglibs-standard-spec-1.2.5.jar",并在jsp引入指定的标签库
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
单条件判断(if)
<%--test:写el表达式
if中没有else,单条件判断,里面boolean类型的值
s为共享的数据
--%>
<c:if test="${s.age>=18}">
你长大了
</c:if>
多条件判断(choose-when-otherwise)
<c:choose>
<c:when test="${s.age>18}">大于18</c:when>
<c:when test="${s.age<18}">小于18</c:when>
<c:otherwise>等于18</c:otherwise>
</c:choose>
遍历(foreach)
<%--
iterms:对谁做遍历
var:使用变量接收遍历得到的对象
遍历过程中会将取到的对象添加到作用域中
varStatus: 给遍历的对象加序号列可以使用(有四个方法),他是一个对象
--%>
<c:forEach items="${list}" var="iterm" varStatus="vs">
${vs.count}->
${pageScope.iterm}<br>
</c:forEach>
输出连续的数字
<%--在页面中输出连续的数字--%>
<c:forEach begin="1" end="10" var="num">
${num}
</c:forEach>
时间格式转化
//日期格式化
s.setBirthday(new Date());
req.setAttribute("s",s);
req.getRequestDispatcher("/fmt.jsp").forward(req, resp);
<--value:要格式化的日期对象
pattern:指定日期格式
-->
<%--时间的格式--%>
<fmt:formatDate value="${s.birthday}" pattern="yyyy-MM-dd HH:mm:ss"></fmt:formatDate>
eq.setAttribute(“s”,s);
req.getRequestDispatcher(“/fmt.jsp”).forward(req, resp);
<–value:要格式化的日期对象
pattern:指定日期格式
–>
<%–时间的格式–%>
<fmt:formatDate value=“${s.birthday}” pattern=“yyyy-MM-dd HH:mm:ss”></fmt:formatDate>