深入理解JSP、EL表达式和JSTL标签
JSP、EL表达式、JSTL标签第一节 JSPServlet3.1JSP 2.3jsp:模板引擎,在当今springboot开发中,对jsp支持不是特别好,所以对于大家要求jsp会用即可MVC设计思想==》all in one1.1 JSP是什么全称: Java Server Pages,java服务器页面。和Servlet一样,是sun公司定义的一种动态网页开发技术。...
JSP、EL表达式、JSTL标签
第一节 JSP
Servlet3.1
JSP 2.3
jsp:模板引擎,在当今springboot开发中,对jsp支持不是特别好,所以对于大家要求jsp会用即可
MVC设计思想==》all in one
1.1 JSP是什么
全称: Java Server Pages,java服务器页面。和Servlet一样,是sun公司定义的一种动态网页开发技术。
特点:基于html模版,可以在html模版嵌入java代码和jsp中的标签。(重要的一个应用)
可以在html页面去书写java代码
tomcat可以包含的资源:
静态技术:
html:静态页面。
CSS:修饰美化html页面。
JavaScript:动态修改html页面和css样式。
动态技术
Servlet:运行在服务器上的java小程序。适合编写java代码,写网页困难,适合业务处理
Servlet三个用途:
1 接受浏览器发送的数据 (request.getParmarter())
2 负责调用业务层 (service),方法类
3转发重定向
JSP:适合编写动态内容,不适合写写java代码的业务逻辑,主要用于显示页面。
1.2 为什么要用JSP
2.1 jsp性能好,可以在html页面中动态嵌入元素
2.2 服务器调用的是已经编译好的JSP文件
2.3 JSP基于Java Servlet Api,有很多强大企业的支持。
2.4 JSP可以与处理业务逻辑的Servlet一起使用,该模式被Java Servlet模版引擎所支持。
1.3 JSP优势
3.1 与纯 Servlet 相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println语句
3.2 与JavaScript相比:虽然JavaScript可以在客户端动态生成HTML,但是很难与服务器交互,因此不能提供复杂的服务,比如访问数据库和图像处理等等。
3.3 与静态HTML相比:静态HTML不包含动态信息
1.4 JSP语法
1.4.1 JSP语法格式
JSP页面中可以包含指令,Java语句、变量、方法或表达式、静态内容(html、css、javascript)
语法格式:
指令:
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
脚本:
<% java代码 %>
<% int i=10;%>
脚本表达式:
输出变量: <%=2+3%>等价于输出语句 (注意:不能使用分号来结束表达式)
声明:
<%!
定义方法
%>
静态资源:HTML、CSS、JS
1.4.2 JSP注释
格式: <%-- 网页注释 --%>:安全,省流量
网页注释:
,特点,不安全,耗流量
1.4.3 代码演示
<%--指令,页面的设置--%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%--1、模板元素 --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>第一个JSP页面</title>
</head>
<body>
<%--我是jsp特有的注释 --%>
<!--我是HTML的注释 -->
<a href="http://www.baidu.com">百度一下</a>
<%--jsp脚本 --%>
<% int c=10; %>
</body>
</html>
<%--指令,页面设置信息 --%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta charset="UTF-8">
<title>第二个JSP页面</title>
</head>
<body>
<%--我是JSP的注释,我是不会出现在对应的java类中的 --%>
<!--我是HTML的注释,会写出到页面 -->
<!--jsp脚本之声明 -->
<!--声明一个属性 -->
<%!private int count; %>
<!--声明并且实现方法 -->
<%!public void show(){
System.out.println(count);
} %>
<%!private int age=10; %>
<%-- <%!show(); %> --%>
<!--jsp脚本之方法内使用 -->
<!-- 局部变量 -->
<%
int c=1;
%>
<%
count++;
c++;%>
<%
System.out.println("局部变量:"+c);
System.out.println("成员变量:"+count);
%>
<%
System.out.println("请求的IP地址:"+request.getRemoteAddr());
%>
<!--jsp脚本之三:赋值、输出内容 -->
<h1>访问次数:<%=count %></h1>
</body>
</html>
通过查看源码,发现所有的jsp页面都变成类, (文件名_jsp.java),类继承HttpJspBase, HttpJsbBase又继承HttpServlet,所有的jsp页面都是Servlet。
语法总结
1.jsp可以在html页面使用<%java代码 %>
2.jsp中声明java变量使用<%!int a=0 %>
3.jsp中想在浏览器页面展示某一个变量值<%=a %>
1.5 JSP指令(了解)
告诉JSP引擎如何解析jsp文件中的内容
语法: <%@ 指令名称 属性名称1=“属性值1” 属性名称2=“属性值2” 。。。。。%>
示例:<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>
1.5.1 page指令
作用:用于定义JSP页面的各种属性。
import和java代码的含义一样
<%@ page import="java.util.Date,java.util.List"%>
或者:
<%@ page import="java.util.Date"%>
<%@ page import="java.util.List"%>
session:是否会自动创建session对象,默认值为true;
buffer:JSP中有java.servlet.jsp.JspWriter输出字符流。设置输出数据的缓存大小。默认8kb.
errorPage:如果页面中有错误,跳转到指定的资源 errorPage="/uri" 如果写“/”则代表当前应用的目录 下,绝对路径。 如果不写“/”则代表相对路径
isErrorPage:是否创建throwable对象。默认是false,被跳转的页面必须是true
contentType:等同于response.setContentType(“text/html”;charset=utf-8);服务器发送客户端的内容编码
pageEncoding: Jsp文件本身的编码
isELIgnored: 是否支持EL表达式。 默认是false,支持表达式;是true表示不支持表达式,${1+1};false输出结果2 true按照原样输出 是否支持el表达式
1.5.2 include指令
include指令
静态包含:把其它资源包含到当前页面中 <%@ include file="header.jsp" %>
动态包含: <jsp:include page=“header.jsp"></jsp:include>
两者的区别:翻译的时间段不同(可在tomcat工作目录下查看)
静态包含:在翻译时就把两个文件进行合并,运行时效率高。会将两个jsp翻译成一个class文件
动态包含:不会合并文件,当代码执行到include时,才包含另一个文件的内容。,两个class文件
1.5.3 taglib指令
作用:在JSP页面中导入JSTL标签库。JSTL替换jsp中的java代码片段。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"prefix="c" %>
1.6 JSP的6个动作标签
使用标签的形式表示一段java代码,例如:
jsp:include 动态包含
jsp:forward请求转发
jsp:param 请求设置参数
jsp:useBean 创建一个对象
jsp:setProperty给指定的对象属性赋值
jsp:getProperty取出指定的对象属值
<jsp:forward page="MyFirstJsp.jsp">
<jsp:param name="name" value="张三"/>
</jsp:forward>
在MyFirstJsp.jsp使用String name = request.getParameter("name");进行获取值
效果上虽然你访问的是index.jsp,但是出现的内容是MyFirstJsp.jsp
jsp的一个作用,可以写java代码,并且进行调用
1.7 内置对象
Servlet中内置对象:request 、response、session、application、config、out(PrintWriter)
Jsp本质是Servlet,包含九个内置对象
对象名 | 类型 | 说明 |
---|---|---|
request | javax.servlet.http.HttpServletRequest | |
response | javax.servlet.http.HttpServletResponse | |
session | javax.servlet.http.HttpSession | 由session=“true”开关 |
application | javax.servlet.ServletContext | |
config | javax.servlet.ServletConfig | |
exception | java.lang.Throwable | 由isErrorPage=“false”开关 |
out | javax.servlet.jsp.JspWriter | javax.servlet.jsp.JspWriter |
pageContext | javax.servlet.jsp.PageContext | |
page | java.lang.Object当前对象this | 当前servlet实例 |
r r s a c e o p p
代码演示:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<!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>JSP内置对象</title>
</head>
<body>
<%
//页面上下文对象
pageContext.setAttribute("msg", "我是PageContext对象");
System.out.println(pageContext.getAttribute("msg"));
//请求对象
System.out.println("请求对象:"+request);
//响应对象
response.getWriter().print("OK");
//当前页面对象
System.out.println(page.getClass());//输出到控制台
//输出对象
out.print(48);//输出到浏览器:48
out.write(48);//输出到浏览器:0
int no=101;
//会话对象
System.out.println(session);
//全局对象
System.out.println(application.getRealPath("/"));
//配置对象--初始化参数
System.out.println(config.getServletName());
//异常对象
System.out.println(exception);
System.out.println(application);
application.setAttribute("author", "1711");
%>
<h1>jsp脚本:<%=no %></h1>
<h1>jsp脚本:<% out.print(no); %></h1>
</body>
</html>
jsp的out和getWriter()方法的区别
1 out是JspWriter类型,getWriter()是PrintWriter类型
2 out输出到缓冲区中,没有写到response中,getWriter()直接写到response中。
3 out一般用在jsp中,getWriter()用在Servlet中
作业:
在servlet中获取web.xml中init-param的参数
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>com.qf.controller.MyServlet</servlet-class>
<init-param>
<param-name>driverclassName</param-name>
<param-value>com.jdbc.mysql.Driver</param-value>
</init-param>
</servlet>
1.8 pageContext对象
pageContext作用:
1 代表页面上下文,获取其他八个内置对象
2 作用容器使用
1.8.1 域对象
一个容器,存值==》get/setAttribute==>容器的作用域不同
jsp中共包含四个域对象分别是pageContext,request、session、application
request域的使用场景:本次请求之后,数据就不再使用了,根据学号查询学生,根据新闻id查询新闻。
session域的使用场景:同一个会话中共享的数据,使用session,用户登录信息,页面上显示欢迎您:xxx
application域的使用场景:所有用户共享的数据。整个程序的配置信息,一般不用,对内存消耗比较大
pageContext:同一个页面
request:两个页面
session:一次会话==》同一个项目 ==>request.getSession()
application:同一个服务器 ==》request.getServletContext()
在eclipse中同时运行两个项目application.setAttrbute()
pageContext域的使用场景:当前页面。
其中pageContext可以操作其他三个域对象(request,session,application)的数据
void setAttribute(String name,Object o);
Object getAttribute(String name);
void removeAttribute(String name);
操作其它域对象的方法
void setAttribute(String name,Objecto,int Scope);
Object getAttribute(String name,int Scope);
void removeAttribute(String name,intScope);
Scope作用域,值如下:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext.SESSION_SCOPE
PageContext.APPLICATION_SCOPE
findAttribute(Stringname)自动从pageContext,request ,session ,application依次查找,
找到了就取值,结束查找 (作用域的范围由小到大)
1.8.2 它可以访问其它的8个内置对象
在普通类中可以通过PageContext获取其它JSP隐式对象,具体如下:
getException方法返回exception隐式对象
getPage方法返回page隐式对象
getRequest方法返回request隐式对象
getResponse方法返回response隐式对象
getServletConfig方法返回config隐式对象
getServletContext方法返回application隐式对象
getSession方法返回session隐式对象
getOut方法返回out隐式对象
1.8.3 提供了简易方法
pageContext.forward(“2.jsp”);//转发 request.getRequestDispatcher().forward();
pageContext.include(“2.jsp”);//动态包含
第二节 EL表达式
解决jsp存在大量java代码问题
2.1 EL概述和基本语法
EL表达式:Expression Language表达式语言
目的:简化jsp中java代码开发,代替脚本表达式<%=username%>
它不是一种开发语言,是jsp中获取数据的一种规范
格式如: ${EL表达式} 等价于pageContext.findAttribute(name)
EL表达式是用来取attrbute的,如果要去url中键值对,你需要使用param,如果是一个变量,也必须先放到attrbute中
2.2 EL的具体功能
案例1:获取简单数据
<br />=====================案例一:获取简单数据===================
<br />
<%
pageContext.setAttribute("username", "张三");
request.setAttribute("age", "25");
//request.setAttribute("username", "李四");
session.setAttribute("phone", "13838383838");
application.setAttribute("address", "北京昌平沙河");
User user = new User();
user.setUsername("学智");
user.setPassword("8888");
user.setPhone("1899999999");
user.setGender("妖");
user.setAdd(new Address("泰国","曼谷","xxx区"));
pageContext.setAttribute("u", user);
%>
<br />-----------------findAttribute()获取数据-------------------
<br />
<%=pageContext.findAttribute("username")%><br />
<%=pageContext.findAttribute("age")%><br />
<%=pageContext.findAttribute("phone")%><br />
<%=pageContext.findAttribute("address")%><br />
<br />-----------------el表达式获取数据-------------------
<br /> ${username }
<br /> ${age }
<br /> ${phone }
<br /> ${address }
<br /> ${"username" }
<br />
案例2:获取实体类对象中的属性值
public class User{ private String name; private Address address; get/set } public class Address{ private String addr; get/set } <% User user= new User(); user.setName("gggg"); Address address = new Address(); address.setAddr("北京市海淀区"); user.setAddress(address); //必须要先把user对象封装成attrbute session.setAttribute("user", user); /* request.getRequestDispatcher("testEl.jsp").forward(request, response); */ response.sendRedirect("testEl.jsp"); %> <!-- EL表达式中的.表示调用该属性的get方法 name和address,addr是get方法后首字母小写--> <%-- 我是:$住在{user.name } , 住在 ${user.address.addr } --%>
案例3:使用List和Map集合
<% List<String> list =new ArrayList<String>(); list.add("aa"); list.add("bb"); list.add("cc"); pageContext.setAttribute("list", list); Map<String,String> map =new HashMap<String,String>(); map.put("aa", "11"); map.put("bb", "22"); map.put("cc", "33"); pageContext.setAttribute("map", map); %> <h1>1.以数组的下标形式获取list值</h1> ${list[0]}<br> ${list[1]}<br> ${list[2]}<br> <h1>2.以提供的方法get(index)</h1> ${list.get(0)} <h1>3.使用El表达式获取map中的值(以key的形式获取)</h1> ${map.aa}<br> ${map.bb}<br> ${map.cc}<br> <h1>4.使用El表达式获取map中的值</h1> ${map['aa']}
2.3 使用EL表达式执行运算、empty关键字
执行运算
算术运算
${10+20 }<br/>
${10-20 }<br/>
${10*20 }<br/>
${3%5}<br/>
关系运算
${10==9 }<br/>
${"abc"=="abc" }<br/>
${s1==s2 } equals<br/>
${s1 eq s2 }<br/>
${10>20}<br/>
${10 gt 20}<br/>
${5 < 10}<br/>
${5 lt 10}<br/>
${5 != 10}<br/>
${5 ne 10}<br/>
三目运算
${score>80?"优秀":"一般" }<br/>
${flag==0?"没有激活":flag==1?"激活":"删除" }<br/>
${sex==0?"男":"女" }<br/>
逻辑运算
${true && false}<br/>
${true || false}<br/>
${!true}<br/>
${true and false}<br/>
${true or false}<br/>
${not true}<br/>
<% String s1=""; pageContext.setAttribute("s1", s1); String s2=null; pageContext.setAttribute("s2", s2); String s3="122222"; pageContext.setAttribute("s3", s3); List list1 =new ArrayList(); pageContext.setAttribute("list1", list1); %> <!-- empty关键只要内容是空true --> ${empty s1}<br> ${empty s2}<br> ${empty s3}<br> ${empty list1}<br>
2.4 隐式对象(11个)
JSP 表达式语言定义了一组隐式对象,其中许多对象在 JSP scriplet 和表达式中可用:
**pageContext:**页面上下文,可以获取jsp中其他八个内置对象
pageScope、requestScope、sessionScope、applicationScope表示四个域对象中集合
param 表示request.getParameter(“username”); ${param.username}
paramvalues 表示request.getPrameterValues(“hobby”); ${paramValues.hobby}
header 表示 request.getHeader(“accept”); ${header.accept};
headerValues 表示 request.getHeaderValues(“accept-encoding”); ${headerValues[“accept-encoding”][0]}
cookie 表示 request.getCookies(); ${cookie.JSESSIONID}
initParam 表示 ServletContext(application)初始化参数
总结:
1.jsp的基础语法<%%>,<%! %>,<%= %>
2.jsp的本质是servlet,他也可以接收请求,request对象的使用
3.jsp的九大内置对象:pageContext,request,response,session,application,out
4.四大域对象是用来干嘛的?他们作用范围是什么?容器?
5.el表达式是用来代替<%%>中的java代码,el表达式是用来取attribute中的值,不是用来取变量的
6.el表达式如何取attribute中对象属性值,如何去取attribute中list和map中的值
明天讲页面渲染的一个重要应用
第三节 JSTL
3.1 什么是JSTL
JSTL:全称Java Server Pages Standard Tag Library,JSP标准标签库,代替jsp页面的脚本,实现逻辑控制。
3.2 JSTL的作用
实现JSP页面中逻辑处理。如判断, 循环等;
下载JSTL库,http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
把jstl.jar、standard.jar放入WEB-INF/lib目录下
3.3 使用JSTL
必须在JSP页面添加tablib指令库
<% @taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c">
3.4 常用标签介绍
3.4.1 通用标签set,out,remove
<!-- 基础标签:声明变量,输出变量,移除变量,变量默认值 -->
<h3>基础标签:声明变量,输出变量,移除变量,变量默认值</h3>
<!--1.声明变量k var:是变量名 value:变量的值(必须是EL表达式)-->
<c:set var="k" value="${1+1}"></c:set>
<!--2.输出变量k value:使用EL表示表示变量-->
移除前输出的内容:<c:out value="${k}"></c:out><br>
<!--3.移除指定变量 -->
<c:remove var="k"/>
移除后输出的内容:<c:out value="${k}"></c:out><br>
<!--4.给指定变量赋默认值 -->
默认值:<c:out value="${m}" default="123456"></c:out>
3.4.2 条件标签if,choose
<c:if>
<!-- 条件标签:if choose -->
<!-- test属性中是条件,但是条件需要使用EL表达式来书写 -->
<h3>条件标签:if</h3>
<c:if test="${8>2 }">
8大于2是成立的
</c:if>
<c:if test="${8<2 }">
8小于2是成立的
</c:if>
<br>
<%-- 如果只是一个基本数据类型直接书写不需要${} --%>
<c:set var="m" value="5"></c:set>
<c:if test="${m>3}">
5大于3是成立的
</c:if>
<c:choose>
<h3>条件标签:choose(等价于java中switch)</h3>
<%-- 测试成绩等级 >90 优秀 >80 良好 >70 中等 >60及格--%>
<c:set var="score" value="80"></c:set>
<c:choose>
<c:when test="${score>=90 }">优秀</c:when>
<c:when test="${score>=80 }">良好</c:when>
<c:when test="${score>=70 }">中等</c:when>
<c:when test="${score>=60 }">及格</c:when>
<c:otherwise>不及格</c:otherwise>
</c:choose>
3.4.3 迭代标签foreach
for基础遍历
<!-- 遍历for:输出1到10 的值 -->
<!--var: 变量,把遍历的每一个值都存储在变量中进行输出
begin:开始 如果是变量使用EL表达式表示
end:结束 如果是变量使用EL表达式表示
step:间隔的长度
for( int i=0;i<10;i++){
System.out.println(i);
}
-->
示例代码:
<c:forEach var="i" begin="1" end="10" step="2">
${i}<br>
</c:forEach>
foreach遍历
<h3>测试list集合遍历获取学生列表</h3>
<table border="1" width="80%" bordercolor="red" cellspacing="0"
align="center">
<tr>
<th>学号</th>
<th>姓名</th>
<th>成绩</th>
<th>班级</th>
<th>是否是第一个</th>
<th>是否是最后一个</th>
<th>计数count</th>
<th>索引index</th>
</tr>
<!-- varStatus:变量状态:遍历出的每一项内容的状态:
isFirst() first
isLast() last
getCount() count 计数 重要的
getIndex() index
-->
<!-- var :遍历出的每一项使用变量先存储
items:集合(使用El表达式)
-->
<c:forEach var="stu" items="${students}" varStatus="vs">
<tr>
<td>${stu.id}</td>
<td>${stu.name}</td>
<td>${stu.score}</td>
<td>${stu.classes}</td>
<td>${vs.first}</td>
<td>${vs.last}</td>
<td>${vs.count}</td>
<td>${vs.index}</td>
</tr>
</c:forEach>
</table>
3.4.4 url标签
<c:url var="" value="">
<c:url var="loc" value="/stu.jsp">
<c:param name="username" value="张三"></c:param>
</c:url>
<a href="${loc}">学生列表</a>
总结
1 jsp 包含的内容
指令 脚本 脚本表达式 声明 HTML css javascript
<%@page language=“java” contentType="" pageEncoding=“utf-8”%>
<%
%>
<%=aaa%>
<%!
%>
2 指令
page指令
include包含指令
taglib 指令
3 jsp动作标签
jsp:include
jsp:forward
jsp:parm
jsp:useBean
jsp:setPropertity
jsp:getPropertity
4 jsp内置对象(九大)
request
response
session
application
config
exception
out
pageContext
page
5 pageContext: 1获取其他八个内置对象 ,2 作为容器使用,可以获取或设置其他容器中的数据
6 4个域对象 request session application pageContext
7 EL表达式 :代替页面中的脚本表达式(输出语句)
${表达式}
7.1 输出简单数据
${ username}
7.2 输出对象的属性
${user.username}
${user.address.counry}
7.3 输出集合数据
list集合
${list[0]}
${list[1]}
map集合
${maps.cn}
${maps[“10”]}
7.4执行运算
算术运算
关系元素
逻辑元素
三元操作
empty空判断
7.5 EL 11个隐式对象
pageContext ${pageContext.request.contextpath}
pageScope 、requestScope、sessionScope、applicationScope
param
paramValues
header
headerValues
initparam
cookie
8 JSTL
三个通用标签 set out remove
逻辑控制 if choose (when otherwise) foreach
url 网址标签
面试题
1、Jsp和Servlet的区别
2、Jsp的执行原理
3、说说Jsp的隐藏对象有哪些
4、说出Jsp内置对象以及方法
更多推荐
所有评论(0)