第六天:JSP EL表达式 jstl标签
1.Jsp原理:
Jsp本质上是一个Servlet,项目中的jsp页面在用户第一次访问的时候会被翻译成java类,这个java(org.apache.jasper.runtime.HttpJspBase)类会继承httpServlet
什么是JSP:
* Java Server Pages(Java服务器端的页面)
为什么要学习JSP:
* SUN公司推出的Servlet自身有缺陷,没有办法与ASP,PHP进行竞争.推出了动态网页开发技术JSP.
使用JSP:
* JSP = HTML + Java代码 + JSP自身的东西.
执行JSP的过程:
* JSP翻译成Servlet,编译这个Servlet的类,生成class文件.得到执行.
JSP的脚本
- <%! %> 声明脚本 :翻译成Servlet中的成员内容. 定义变量,方法,类. -- 不建议.
- <% %> 代码块脚本 :翻译成Servlet中service方法内部的内容. 定义类,变量
- <%= %> 输出脚本 :翻译成Servlet中service方法中out.print();
JSP的注释
- HTML的注释 :<!-- 注释 -->
在jsp翻译的时候会被翻译到servelt代码中使用输出语句输入到浏览器中
- Java代码的注释 :// 单行注释 /*多行注释*/ /** 文档注释 */
- JSP的注释 :<%-- JSP的注释 --%>
JSP的指令:
- 指令的语法:
<%@ 指令名称 属性名称=”属性值” 属性名称=”属性值” ...%>
JSP中有三个指令:page指令, include指令, taglib指令.
- JSP中page指令:<%@ page %> -- 设置JSP的.
* language :JSP脚本中使用的语言.现在只能写java.
* contentType :设置浏览器打开这个JSP的时候采用的默认的字符集的编码.
* pageEncoding :设置文件保存到本地硬盘,以及生成Servlet后,Servlet保存到硬盘上的编码.
* import :在JSP中引入类对象.但是import可以出现多次.
* isELIgnored :设置在JSP中是否忽略EL表达式.默认值是false不忽略.
* errorPage :设置错误友好页面的提示.指定当前页面出错之后跳转的错误页面
* isErrorPage :通过这个设置显示JSP的错误信息. 如果值设置成true,那么在这个页面中可以直接使用一个execption对象获取错误信息
- JSP中的include指令:指示JSP包含其他的页面.
<%@ include file="logo.jsp" %>
<%@ include file="menu.jsp" %>
<h1>BODY部分</h1>
<%@ include file="footer.jsp" %>
- JSP中的taglib指令:指示JSP引入标签库.
<%@ taglib uri="标签的URI的路径" prefix="标签的别名" %>
JSP的内置对象(重点)
- JSP的内置对象:在JSP中可以直接使用的对象.
- JSP中有9大内置对象:
- page内置对象 :真实对象是Object,就是JSP翻译成Servlet后的类的引用.
- out内置对象 :out和response.getWriter是不是同一个对象?区别是什么?
* 不是out真实对象JspWriter ,response获得Writer是PrintWriter.
- pageContext内置对象 :
* 获得其他的8个内置对象 :编写通用性代码或者框架的时候.
* 向JSP的四个域中存取数据 :
JSP的四个域范围:
* PageScope:当前页面中有效.pageContextPageContext
* RequestScope:一次请求范围.requestHttpServletRequest
* SessionScope:一次会话范围.sessionHttpSession
* ApplicationScope:应用范围applicationServletContext
2. EL表达式:
Jsp + javaBean(jsp开发模式一)
问题:前端代码和服务器代码耦合(项目难以维护)
要解决这个问题,我们就要尽量的在jsp页面中少写java代码(jsp中不要写java代码)
EL的概述
- 什么是EL:
- 为什么学习EL:
* 简化JSP的代码,而且减少<%%>
- 使用EL表达式:
* 语法:${ EL表达式 }
EL的常用功能:
1. EL获取数据
注意:El表达式只能获取域对象中的数据
PageContext
Request
Session
Application(ServeltContext)
1.存取是普通的单值数据
<%=pageContext.getAttribute("name") %>
<%=request.getAttribute("name") %>
<%=session.getAttribute("name") %>
<%=application.getAttribute("name") %>
${ pageScope.name }
${ requestScope.name }
${ sessionScope.name }
${ applicationScope.name }
注意:
1. 通过域对象调用方法如果值没有获取的是null对象,El表达式获取数据如果没有获取到返回””
2. ${ name }类似findAttribute("name") 先从pageContext域中查找,没找到去request域中查询,没有找到去session域中找,没有找到就去application域中找
2. 获取数组(List集合)的数据
${ arrs[0] }
${ arrs[1] }
${ arrs[2] }
${ arrs[3] }
3. 获取Map集合的数据
4. 获取对象的数据
${ user.id }
${ user.username }
${ user.password }
注意:el表达式获取对象属性值的时候,如果属性找不到,会直接报错
5. 获取对象的集合的数据
<%
User user1 = new User(1,"aaa","123");
User user2 = new User(2,"bbb","123");
User user3 = new User(3,"ccc","123");
List<User> userList = new ArrayList<User>();
userList.add(user1);
userList.add(user2);
userList.add(user3);
pageContext.setAttribute("userList", userList);
%>
${ userList[0].id } - ${ userList[0].username } - ${ userList[0].password }<br/>
${ userList[1].id } - ${ userList[1].username } - ${ userList[1].password }<br/>
${ userList[2].id } - ${ userList[2].username } - ${ userList[2].password }<br/>
pageContext 用来获取request对象 在jsp页面中动态获取项目的虚拟路径
${pageContext.request.contextPath}
3.JSTL
1.1 JSTL的概述
- 什么是JSTL:
- 为什么学习JSTL:
* JSTL和EL结合 替换页面中<%%>
- JSTL版本:
* JSTL1.0 :不支持EL表达式.
* JSTL1.1 和 1.2 :支持EL表达式.
- JSTL的标签库:包含了五类标签.
* core(核心标签),fmt(国际化标签),xml(XML标签),sql(SQL标签),fn(JSTL提供EL函数库)
- 使用JSTL:
* 1.引入JSTL的相关的依赖jar包.
* 在页面中引入标签库.<%@ taglib uri=”” prefix=””%>
JSTL的核心标签的用法
* if--条件判断
* forEach---循环遍历
例子:
<%-- Created by IntelliJ IDEA. User: lz Date: 2021/12/17 Time: 12:29 To change this template use File | Settings | File Templates. --%> <%--jsp指令声明--%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Title</title> </head> <body> <%--EL表达式获取数据 域对象可以共享数据,他们都有setAttribute和getAttribute方法用来设置数据和获取数据--%> ${requestScope.username} <%--jstl是要结合el表达式的--%> <c:if test="${not empty username}"> 欢迎您,${username} </c:if> <c:forEach var="i" begin="0" end="11" step="2"> ${i} <br/> </c:forEach> </body> </html>
package com.swlz.jsp; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/servletJSPDemo1") public class ServletJSPDemo1 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("username","jackson");//域对象(共享数据) request.getRequestDispatcher("/user.jsp").forward(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } }
今日学习感受:人生的路很长,需要自己一点一滴去慢慢创造属于自己的人生,选择自己的人生,自己既然选择了一条路,无论如何都要坚持下去,加油,追梦人!!!最后一句话:天生我材必有用!!!!