跳转页面,jsp,el表达式
页面跳转
请求转发
只会发送一条请求
只发送一条请求,地址栏不变,还是index,客户端无感知跳转 因为只发送了一条请求,所以request中数据共享
适合向页面传递数据,比如数据展示,可以通过后端把数据获取,然后设置到request中 并转发到对应的jsp页面,在jsp页面进行操作
@WebServlet("/a/b/c")
public class _01_Forward extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("name", "张三");
request.getRequestDispatcher("/_01_forward.jsp").forward(request, response);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
重定向
重定向跳转 客户端发送两条请求,地址栏变为login,并且 request数据不共享,适合做普通的页面跳转
@WebServlet("/q/w/e")
public class _02_SendRedurect extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 重定向
// 加/ 定位到 webapps
// 不加 相对路径
req.setAttribute("name", "李四");
// getContextPath : /项目名
String str = req.getContextPath();
// /JSP_01
System.out.println(str);
resp.sendRedirect(req.getContextPath()+"/_01_forward.jsp");
}
}
通过测试发现 重定向跳转 会发送两条请求而地址栏 也是最后一个请求,并且request数据不共享,所以不能做数据传递
JSP内置对象
不用创建,直接使用 本质 就是service方法中的局部变量 Request 请求对象 Response 响应 对象 Session 会话 Out 输出流,用于向页面打印 Application servletContext 全局环境 Config servletConfig
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
被跳转过来的<%=request.getAttribute("name") %>
<%= session.getAttribute("xxx") %>
<%= application.getAttribute("xxx") %>
</body>
</html>
E表达式
EL表达式
EL表达式 主要用于获取数据 等于 request.getAttribute(“xxxx”)
- 为什么使用EL表达式
MVC应该是轻量级的框架,但是在JSP中 通过 <%%> 这种写法,功能太强,不符合MVC设计理念 甚至你可以直接把操作数据库的JDBC代码在JSP中编写,完全脱离了后端java类 所以 为了尽可能的在视图层出现java逻辑代码,提出了EL表达式和JSTL
4.3 语法 ${xxx} 等于 request.getAttribute(“xxx”) 这两句话是等价的
<body>
request.getAttribute("hello") : <%= request.getAttribute("hello") %> <br>
\${hello } : ${hello }
</body>
可以通过\ 忽略el表达式
JSTL表达式
JSTL : JSP Standard Tag Library JSP标准标签库 使用JSTL必须先导入对应的jar包 最初的设计目的是解决两个问题, 1 上述分析的问题,不符合MVC模式 2 写JSP的人,应该是前端或者是美工,不需要有java编程基础
简单来说 它们就是用来简化JSP中的java代码的,使JSP代码更简短美观但是EL表达式只能解决数据获取的问题,比如用户列表等循环遍历操作或者是流程控制操作,EL表达式是做不到的,此时就需要依赖JSTL完成这件事.但是JSTL不能获取数据所以 一般EL表达式会和JSTL一起使用,功能才更加强大
- 标签库
1 核心标签库 : 最常用的部分,比如流程判断,循环遍历等 2 I18N 格式标签库 : 对数据显示进行格式化,比如时间格式化,数字格式化
核心标签库
1.导包
2 引入
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
3.1循环结构
例,后端传入一个集合
List<User> users = new ArrayList<User>();
users.add(new User(1, "admin1", "root"));
users.add(new User(2, "admin2", "root"));
users.add(new User(3, "admin3", "root"));
users.add(new User(4, "admin4", "root"));
users.add(new User(5, "admin5", "root"));
request.setAttribute("users", users);
Map map = new HashMap();
map.put("k1", "v1");
map.put("k2", "v2");
map.put("k3", "v3");
request.setAttribute("map", map);
jsp遍历
<table width="500" align="center" border="1">
<tr>
<th>ID</th>
<th>用户名</th>
<th>密码</th>
<!-- 集合操作 -->
</tr>
<%-- items 是集合,通过EL表达式获取数据, --%>
<%-- 把集合中的每个数据 都赋值给变量 user , 然后就可以通过el表达式 获取这个user中的数据并展示到页面 --%>
<c:forEach items="${users }" var='user'>
<tr>
<td>${user.id }</td>
<td>${user.username }</td>
<td>${user.password }</td>
</tr>
</c:forEach>
<!-- map操作 -->
<c:forEach items="${map }" var="entry">
${entry.key } : ${entry.value } <br>
</c:forEach>
3.2 分支结构
后端发送 request.setAttribute("value", new Random().nextInt(11)); jsp操作
<!-- 流程控制 if -->
<!-- 判断是否为空 只有if 没有else -->
<c:if test="${empty users }">
没有获取数据
</c:if>
<!-- 相当于switch -->
<c:choose>
<%-- case == eq > gt >=ge < lt <= le != ne -- && and || or %>
<c:when test="${value < 5 }">
小
</c:when>
<%-- case --%>
<c:when test="${value > 5 or value < 10 }">
大
</c:when>
<%-- default --%>
<c:otherwise>
豹子
</c:otherwise>
</c:choose>
格式标签库
导fmt包 后端发送并跳转
request.setAttribute("date", new Date());
request.getRequestDispatcher("fmt.jsp").forward(request, resp);
jsp操作
默认 : ${date }
<br>
格式化之后 : <fmt:formatDate value="${date }" /> <br>
自定义格式 : <fmt:formatDate value="${date }" pattern="yyyy年MM月dd日 HH:mm:ss SSS"/> <br>
<!-- pattern前面加空格 -->
|