jsp的核心语法: jsp表达式 <%=表达式%>和 jsp脚本<%>。
以后开发jsp的原则: 尽量在jsp页面中少写,甚至不写java代码。
目标:
1)使用EL表达式代替jsp表达式。
2)使用JSP标签代替jsp脚本。
使用EL表达式替换掉jsp表达式
EL表达式作用: 向浏览器输出域对象中的变量值或表达式计算的结果!!!
语法: ${变量或表达式}
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>EL语法</title> </head> <body> <% String name = "Lucy"; pageContext.setAttribute("username", name, pageContext.REQUEST_SCOPE); %> jsp表达式输出:<%=name %><br/> <%--从四个域获取数据 --%> EL表达式()输出:${username }------------<%=pageContext.findAttribute("username")%><br/> <%-- ${username } 等价于 <%=pageContext.findAttribute("username")%> --%> <%-- 从指定的域中获取数据 --%> EL表达式输出:${requestScope.username }------------<%=pageContext.getAttribute("username", pageContext.REQUEST_SCOPE) %><br/> <%-- ${requestScope.username }等价于 <%=pageContext.getAttribute("username", pageContext.REQUEST_SCOPE) %> --%> </body> </html>
1)输出基本数据类型变量
从四个域获取:${name}
从指定域获取:${pageScope.name}
域范围: pageScope / requestScope / sessionScope / applicationScope
2)输出对象的属性值
3)输出集合对象(List和Map)
4)EL表达式计算
Student.java
package com.rk.entity; public class Student { private String name; private int age; public Student(String name, int age) { super(); this.name = name; this.age = age; } public Student() { super(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
EL输出不同类型的数据
<%@page import="com.rk.entity.Student"%> <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>EL输出不同类型的数据</title> </head> <body> <% Student stu = new Student(); stu.setName("lucy"); stu.setAge(10); pageContext.setAttribute("s", stu, pageContext.REQUEST_SCOPE); %> <%--使用EL获取对象属性 --%> Student信息:姓名=${s.name },年龄=${s.age } <%-- ${s.name} 等价于 (点相对于调用getXX()方法) <%=((Student)pageContext.findAttribute("s")).getName()%> --%> <hr/> <% List<Student> listOfStudent = new ArrayList<Student>(); listOfStudent.add(new Student("lucy",10)); listOfStudent.add(new Student("lily",10)); listOfStudent.add(new Student("tom",11)); pageContext.setAttribute("list", listOfStudent, pageContext.REQUEST_SCOPE); %> <%--使用EL获取List对象 --%> Student信息:姓名=${list[0].name },年龄=${list[0].age }<br/> Student信息:姓名=${list[1].name },年龄=${list[1].age }<br/> Student信息:姓名=${list[2].name },年龄=${list[2].age }<br/> <%-- list[0]等价于 (中括号相对于调用get(参数)方法) ((List)pageContext.findAttribute("list")).get(0) --%> <hr/> <% Map<String,Student> mapOfStudent = new HashMap<String,Student>(); mapOfStudent.put("100",new Student("lucy",10)); mapOfStudent.put("101",new Student("lily",10)); mapOfStudent.put("102",new Student("tom",11)); pageContext.setAttribute("map", mapOfStudent, pageContext.REQUEST_SCOPE); %> <%--使用EL获取Map对象 --%> Student信息:姓名=${map["102"].name },年龄=${map["102"].age }<br/> Student信息:姓名=${map["101"].name },年龄=${map["101"].age }<br/> Student信息:姓名=${map["100"].name },年龄=${map["100"].age }<br/> </body> </html>
EL表达式计算
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>EL表达式计算</title> </head> <body> <%-- 1)算术表达式 + - * / --%> ${10+5 }<br/> ${10*5 } <hr/> <%-- 2)比较运算 > < >= <= == != --%> ${10>5 }<br/> ${10<5 }<br/> ${10!=10 } <hr/> <%-- 3)逻辑运算 && || ! --%> ${true && false }<br/> ${true || false }<br/> ${!false }<br/> <hr/> <%-- 4)判空 null 或 空字符串: empty --%> <% //String name = "eric"; //String name = null; String name = ""; pageContext.setAttribute("name",name); %> 判断null: ${name==null }<br/> 判断空字符: ${name=="" }<br/> 判空: ${name==null || name=="" }<br/> 另一种判空写法: ${empty name } </body> </html>
jsp标签作用:替换jsp脚本。
1)流程判断(if for循环)
2)跳转页面(转发,重定向)
3)。。。。。
1)内置标签(动作标签): 不需要在jsp页面导入标签
2)jstl标签: 需要在jsp页面中导入标签
3)自定义标签 : 开发者自行定义,需要在jsp页面导入标签
转发标签: <jsp:forward />
参数标签: <jsp:param/>
包含标签: <jsp:include/>
<jsp:forward />和<jsp:param/>标签
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>JSP内置标签(动作标签)</title> </head> <body> <%-- 转发 --%> <% //request.getRequestDispatcher("/target.jsp?username=lucy&password=123456").forward(request,response); %> <%-- 参数 --%> <jsp:forward page="/target.jsp"> <jsp:param value="tom" name="username"/> <jsp:param value="123456" name="password"/> </jsp:forward> </body> </html>
target.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>跳转目标页面</title> </head> <body> 目标页面<br/> 用户名:<%=request.getParameter("username") %><br/> 密码:<%=request.getParameter("password") %><br/> </body> </html>
<jsp:include/>和<jsp:param/>标签
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>JSP内置标签(动作标签)</title> </head> <body> 这里是原网页的内容<br/> <jsp:include page="/common/footer.jsp"> <jsp:param value="tom" name="username"/> </jsp:include> 这里是原网页的内容<br/> </body> </html>
footer.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>通用的底部</title> </head> <body> 这里是通用的页面底部 <br> <%=request.getParameter("username") %><br/> </body> </html>
<jsp:include/>原理: 包含与被包含的页面先各自翻译成java源文件,然后再运行时合并在一起。(先翻译再合并),动态包含。
序号 | 角度 | 静态包含 | 动态包含 |
---|---|---|---|
1 | 语法不同 | 静态包含语法: <%@include file="被包含的页面"%> | 动态包含语法: <jsp:include page="被包含的页面"> |
2 | 参数传递不同 | 静态包含不能向被包含页面传递参数 | 动态包含可以向被包含页面传递参数 |
3 | 原理不同 | 静态包含: 先合并再翻译 | 动态包含: 先翻译再合并 |
JSTL (全名:Java Standard Tag Libarary - java标准标签库)
核心标签库 (c标签库) 天天用
国际化标签(fmt标签库)
EL函数库(fn函数库)
xml标签库(x标签库)
sql标签库(sql标签库)
使用JSTL标签步骤
1) 导入jstl支持的jar包(标签背后隐藏的java代码)。注意:使用javaee5.0的项目自动导入jstl支持jar包
2)使用taglib指令导入标签库 <%@taglib uri="tld文件的uri名称" prefix="简写" %>
3)在jsp中使用标签
核心标签库的重点标签:
保存数据:<c:set></c:set>
获取数据:<c:out value=""></c:out>
单条件判断:<c:if test=""></c:if>
多条件判断
<c:choose></c:choose>
<c:when test=""></c:when>
<c:otherwise></c:otherwise>
循环数据:
<c:forEach></c:forEach>
<c:forTokens items="" delims=""></c:forTokens>
重定向:<c:redirect></c:redirect>
<%@page import="com.rk.entity.Student"%> <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>JSTL核心标签库</title> </head> <body> <%--使用标签 --%> <%--set标签 :保存数据(保存到域中)默认保存到page域 --%> <c:set var="username" value="tomcat" scope="request"></c:set> 用户名:${username }<br/> <hr/> <%--out标签: 获取数据(从域中) default: 当value值为null时,使用默认值 escapeXml: 是否对value值进行转义,false,不转义,true,转义(默认) --%> <% String msg = null; pageContext.setAttribute("msg", msg); %> <c:out value="${username} }"></c:out><br/> <c:out value="${msg }" default="<h1>h1标题</h1>" escapeXml="true"></c:out><br/> <c:out value="${msg }" default="<h1>h1标题</h1>" escapeXml="false"></c:out><br/> <hr/> <%--if标签 :单条件判断--%> <c:if test="${!empty msg}"> 条件成立 </c:if> <c:if test="${empty msg}"> 条件不成立 </c:if> <hr/> <%--choose标签+when标签+otherwirse标签: 多条件判断 --%> <c:set var="score" value="56"></c:set> <c:choose> <c:when test="${score>=90 && score<=100}"> 优秀 </c:when> <c:when test="${score>=80 && score<90}"> 良好 </c:when> <c:when test="${score>=70 && score<80}"> 一般 </c:when> <c:when test="${score>=60 && score<70}"> 及格 </c:when> <c:otherwise> 不及格 </c:otherwise> </c:choose> <hr/> <%-- forEach标签:循环 --%> <% //List List<Student> list = new ArrayList<Student>(); list.add(new Student("rose",18)); list.add(new Student("jack",28)); list.add(new Student("lucy",38)); //放入域中 pageContext.setAttribute("list",list); //Map Map<String,Student> map = new HashMap<String,Student>(); map.put("100",new Student("mark",20)); map.put("101",new Student("maxwell",30)); map.put("102",new Student("narci",40)); //放入域中 pageContext.setAttribute("map",map); %> <%-- begin="" : 从哪个元素开始遍历,从0开始.默认从0开始 end="": 到哪个元素结束。默认到最后一个元素 step="" : 步长 (每次加几) ,默认1 items="": 需要遍历的数据(集合) var="": 每个元素的名称 varStatus="": 当前正在遍历元素的状态对象。(count属性:当前位置,从1开始) --%> <c:forEach items="${list}" var="student" varStatus="varSta"> 序号:${varSta.count} - 姓名:${student.name } - 年龄:${student.age}<br/> </c:forEach> <hr/> <c:forEach items="${map}" var="entry"> ${entry.key } - 姓名: ${entry.value.name } - 年龄:${entry.value.age }<br/> </c:forEach> <hr/> <%-- forToken标签: 循环特殊字符串 --%> <c:set var="str" value="java-php-net-C"></c:set> <c:forTokens items="${str}" delims="-" var="s"> ${s }<br/> </c:forTokens> <%--redrict:重定向 --%> <c:redirect url="http://www.baidu.com"></c:redirect> </body> </html>
可以通过查看jstl-1.2.jar包下的META-INF\c.tld文件,来查看jstl的core核心标签库的具体使用方法。