JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP实际上就是Servlet。,就是在html当中嵌入java代码实现动态开发。JSP的目的是输出动态的内容用来展示,但是不适合用来写java逻辑
一,jsp的原理
jsp页面会被服务器首先翻译成java文件,里面的html内容都会使用out.writer()输出,然后进过java的虚拟机编译为.class文件,然后运行。服务器把运行的结果返回给浏览器。
JSP的基本语法
JSP模版元素
网页的静态内容。如:html标签和文本。JSP脚本
1.小脚本:<%System.out.println(“hello world”)%>
2.表达式:<%=3+5%>等价于out.print(3+5)注意这个表达式当中没有分号
3.申明:<%! %>表示在类中定义全局成员,和静态的代码块。因为一个jsp就是一个servlet的实现类。JSP注释
JSP注释:<%–这里是注释–%>这种注释是不会翻译成 html的,相当于java的注释
网页注释:<!–网页注释–>,推荐使用JSP注释三个指令
三个指令的语法都是一样的如下:
<%@ 指令名称 属性1=“属性值1” 属性2=“属性值2”。。。%>
或者
<%@ 指令名称 属性1=“属性值1”%>
<%@ 指令名称 属性2=“属性值2”%>1,page指令:用于定义JSP页面的各种属性,其中有8中指令
- import指令和java代码中的import是一样的
<%@ page import="java.util.Date,java.util.List"%>
<%@ page import="java.util.Date"%>
<%@ page import="java.util.List"%>
- session:是否会自动创建session对象。默认值是true;
- buffer: JSP中有javax.servlet.jsp.JspWriter输出字符流。设置。输出数据的缓存大小,默认是8kb。一般不修改。
- errorPage: 如果页面中有错误,则跳转到指定的资源。
例如<%@page errorPage=”/uri” %>其中/代码当前应用的目录下,代表绝对路径,如果去掉则表示相对路径。 - isErrorPage:是否创建throwable对象。默认是false
- contextType: 等同于response.setContextType(“text/html;charset=utf-8”);告诉浏览器和服务器使用什么编码解析
pageEncoding: 告诉JSP引擎要翻译的文件使用的编码。
<%@ page pageEncoding="gbk" %>
isELIgnored: 是否支持EL表达式。 默认是false
2,include指令,将其他资源包含进来,分为静态包含和动态包含:
静态包含:在将jsp文件翻译成java文件的会后合并两个文件。
<%@ include file="/include/header.jsp" %>
动态包含:不会合并文件,当代吗执行带include时才包含另一个文件。
<jsp:include page="/include/header.jsp"></jsp:include>
原则:能使用静态包含就不适用动态包含
3,taglib:作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
- import指令和java代码中的import是一样的
4、JSP的6个动作
- < jsp:include > 动态包含
- < jsp:forward> 请求转发
- < jsp:param> 设置请求参数
- < jsp:useBean> 创建一个对象
- < jsp:setProperty> 给指定的对象属性赋值
- < jsp:getProperty> 取出指定对象的属性值
<!-- 首先创建一个student实体,class表示的是实体的路径 -->
<jsp:useBean id="stu1" class="com.itheima.entity.Student"></jsp:useBean>
<!-- 设置属性,给name这个属性设置值 -->
<jsp:setProperty property="name" name="stu1" value="jerry"/>
<!-- 获取属性 -->
<jsp:getProperty property="name" name="stu1"/>
<!-- http://localhost:8080/day11_02_jsp2/6.jsp?name=123 -->
<!-- 请求转发,转发到当前应用的7.jsp -->
<jsp:forward page="/7.jsp">
<!-- 设置设置请求参数 -->
<jsp:param value="123" name="name"/>
<jsp:param value="333" name="pwd"/>
</jsp:forward>
5、JSP的9个内置对象
| 对象名 | 类型 | 说明 |
|-------------|---------------------------------------| --------------------------|
| request | javax.servlet.http.HttpServletRequest | |
| response | javax.servlet.http.HttpServletResponse| |
| session | javax.servlet.http.HttpSession | session="true"开关 |
| application | javax.servlet.ServletContext | |
| exception | java.lang.Throwable | 由isErrorPage="false"开关 |
| page | java.lang.Object | 当前对象this当前servlet实例 |
| config | javax.servlet.ServletConfig | |
| out | javax.servlet.jsp.JspWriter | 相当于 printWriter对象 |
| pageContext | javax.servlet.jsp.PageContext | |
pageContext(重要)
本身也是一个域对象:它可以操作其它三个域对象(request session application)的数据
void setAttribute(String name,Object o);
Object getAttribute(String name);
void removeAttribute(String name);
操作其它域对象的方法
void setAttribute(String name,Object o,int Scope);
Object getAttribute(String name,int Scope);
void removeAttribute(String name,int Scope);
scpoe的值:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext.SESSION_SCOPE
PageContext.APPLICATION_SCOPE
findAttribute(String name); 自动从page request session application依次查找,找到了就取值,结束查找。它可以创建其它的8个隐式对象:
在普通类中可以通过PageContext获取其他JSP隐式对象。自定义标签时就使用。提供了的简易方法
pageContext.forward(“2.jsp”);
pageContext.include(“2.jsp”);
6、EL表达式
EL表达式:expression language 表达式语言
要简化jsp中java代码开发。
它不是一种开发语言,是jsp中获取数据的一种规范
1、功能
a.获取数据
EL表达式只能获取存在4个作用域中的数据,如下
${u} 原理: pageContext.findAttribute(“u”);代码是使用pageContext.findAttribute()在四个作用域对象的map当中寻找数据
EL获取对于null这样的数据,在页面中表现为空字符串
其中当找到了u对象时,u.name ==u.getName(),调用对应的getter方法。点后面跟着的是属性名字。
属性导航//u表示一个student,address表示student当中的一个属性 //,这个属性是一个对对象,这个对象下有一个city属性 ${u.address.city}
[]运算符:点能做的,它也能做; 它能做的,点不一定能做
$ {student.name}== student[′name′]== {student[“name”]}
- b.运算
empty :判断null,空字符串和没有元素的集合(即使集合对象本身不为null)都返回true
<%
String str1 = null;
request.setAttribute("str1", str1);
String str2 = "";
request.setAttribute("str2",str2);
String str3 = "abc";
request.setAttribute("str3", str3);
List list1 = new ArrayList();
request.setAttribute("list1", list1);
List list2 = new ArrayList();
list2.add("asdf");
request.setAttribute("list2", list2);
int sex = 0;
request.setAttribute("s", sex);
%>
${ empty str1 } ---- true<br/>
${ empty str2 } ---- true<br/>
${ empty str3 } ---- false <br/>
${ empty list1 } ---- true <br/>
${ empty list2 } ---- false<br/>
三元运算符 :
${ empty list2 ? "你还没有买商品":"你卖的商品如下" }
<input type="radio" name="sex" value="m" ${s==0 ? "checked='checked'":"" }/>男<br/>
<input type="radio" name="sex" value="f" ${s==1 ? "checked='checked'":"" }/>女<br/>
- c.隐式对象:11个,EL表达式当中储存了是一个隐式对象。
<%
//pageContext.setAttribute("p", "pp");
pageContext.setAttribute("p", "pp", PageContext.PAGE_SCOPE);
//pageContext.setAttribute("p", "pp", PageContext.REQUEST_SCOPE);
request.setAttribute("p", "request");
//pageContext.setAttribute("p", "pp", PageContext.SESSION_SCOPE);
session.setAttribute("p", "session");
//pageContext.setAttribute("p", "pp", PageContext.APPLICATION_SCOPE);
application.setAttribute("p", "application");
%>
${p }
${pageScope.p}<!--获取pageContext当中的p的value-->
<!--p可以拿到这四个域的所有数据,并且是从pageContext->request->session->application
的属性开始,因为EL中有隐式对象,这里的隐式对象除了pageContext以为都是继承自Map<String,Object>,都是集合,这也导致${p}这种使用findattribute()的方式找不到request等对象的属性,所有需要通过pageContext这个对象来获取request对象然后调方法 -->
${pageContext.request.contextPath }<!--通过获取request对象来获取contextPath这个request固有的属性-->
三,JSTL
JSTL(JavaServerPages Standard Tag Library)JSP标准标签库
使用JSTL实现JSP页面中逻辑处理。如判断、循环等。
使用:在JSP页面添加taglib指令
核心标签库:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
if判断
<c:if test="${5>3}">
aaaaaaaaaaa
</c:if>
通用标签: set、 out、 remove
<!-- 声明一个变量 num -->
<c:set var="num" value="10" scope="session"></c:set>
输出变量:<%-- <c:out value="${num }"></c:out> --%>${num }
<c:remove var="num" scope="session"/>
输出变量:<c:out value="${num }" default="aaa"></c:out>
switch
<c:set var="num" value="${8 }"></c:set>
<c:choose>
<c:when test="${num==1 }">aaa</c:when>
<c:when test="${num==2 }">bbb</c:when>
<c:when test="${num==3 }">ccc</c:when>
<c:otherwise>
dddd
</c:otherwise>
</c:choose>
迭带标签:foreach
普通循环:var表示int i;begin表示i的初始胡,end表示结束条件,step表示步长
<c:forEach var="i" begin="1" end="10" step="2">
${i }<br/>
</c:forEach>
迭带器
<%
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list", list);
%>
<c:forEach items="${list }" var="l">
${l }
</c:forEach>
foreach(类型 变量名:数组或集合)
<%
//遍历数组
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("eee");
list.add("ffff");
request.setAttribute("list", list);
%>
<table border="1">
<tr>
<th>数据</th>
<th>索引</th>
<th>计数</th>
<th>第一个</th>
<th>最后一个</th>
</tr>
<c:forEach items="${list }" var="l" varStatus="vs">
<tr ${vs.count%2==1 ? "style='background-color:lime'" : "style='background-color:green'" }>
<td>${l }</td>
<td>${vs.index }</td>
<td>${vs.count }</td>
<td>${vs.first }</td>
<td>${vs.last }</td>
</tr>
</c:forEach>
forEach中的varStatus属性。
指向一个字符串,该字符串引用一个对象。 map.put(“vs”,一个对象);
这个对象记录着当前遍历的元素的一些信息:
- getIndex():返回索引。从0开始
- getCount():返回计数。从1开始
- isLast():是否是最后一个元素
- isFirst():是否是第一个元素