day12
jsp
1.jsp概述
在servlet创建之初,其中会书写页面的html代码,但是这种形式使用起来非常复杂,面对
繁琐的页面构成,无法灵活书写,所以sun公司决定提出一门新的技术,将html和java
代码同时放在页面当中。这样就可以检查前台页面与后台页面相互传值和处理逻辑的过程。
简化了操作。这门技术就是jsp。
jsp是一门动态资源开发技术。
2.JSP原理
jsp本质是一个Servlet文件,在初次访问jsp页面的时候,jsp会由jsp翻译引擎翻译成一个Servlet文件。
实验:tomcat/work/host/.../index_jsp.java,查看其中的类名,继承的类名,下方重写的init destroy service 方法。
3.JSP语法
3.1 模(mu)板元素
页面中的html内容,会被当做模板元素输出。
例:out.write("\">\r\n");
out.write(" \r\n");
out.write("<title>My JSP 'index.jsp' starting");
html内容会通过out.write()输出到页面中,html原有内容不变。
3.2 jsp脚本表达式
格式:<%=jsp脚本表达式%>
out.print(new Date().toLocaleString());
页面中的jsp脚本表达式会在访问页面时被翻译成Java语句。通过out.print()方法输出在对应位置。输出的内容为表达式计算的结果值。
3.3 jsp脚本片段
格式:<%jsp脚本片段%>
页面中书写的jsp脚本片段,在被翻译到servlet中时,会变成一个java语句,放在对应的位置。脚本片段可以书写的不完整,但是要保证多个脚本片段拼接带来仍然是一个完整的Java语句。否则会导致页面报错,不能正常执行。
3.4 jsp声明
格式:<%!jsp声明%>
页面中jsp声明在被翻译到servlet中时,会变成一个成员变量/方法,存放在类内方法外。这个变量/方法可以被当前servlet文件中使用。
3.5 jsp注释
java注释 <% // java %> java注释在被翻译到servlet中时,仍然为java语句,只不过为注释内容,不会向页面中输出这段内容。
html注释 <!-- html注释 -->
jsp注释 <%-- jsp注释 --%> jsp注释在被翻译到servlet中时,将完全抛弃其中的内容。注释的内容不会出现在servlet文件中(慎用,可能导致不必要的错误。
3.6 jsp指令
jsp指令本身不会产生任何输出,是用来规定jsp翻译引擎如何将页面翻译成servlet文件的。jsp指令出现的位置和数量都是任意的。
<%@page% 属性名= 属性值> 声明当前jsp页面的基本属性,用于规定页面如何被jsp翻译引擎翻译jsp到servlet。
import ="" 导入需要使用到的包。(默认导入java.lang*,javax.servlet.*,javax.servlet.jsp.*,javax.servlet.http.*)各个包之间用逗号隔开。
session = "true|false" 用来指定当前页面是否使用session,如果设置为true,则翻译过来的servlet中将会有对session对象的引用,用于可以直接在jsp中使用session隐式对象。但是这将导致一旦访问jsp就会调用request.getSession()方法,可能导致不必要的空间浪费,如果确定jsp中不需要session可以设为false。
buffer="none|8kb" out隐式对象所使用的缓冲区的大小。
errorPage = "relative_url" 如果页面出错,将要跳转的页面,除了在jsp中使用此属性指定错误页面外也可以在web.xml中配置整个web应用的错误页面,如果两个都设置则jsp中的此属性起作用。在web.xml中添加<error-page>标签,可以全局显示错误友好页面。
isErrorPage = "true|false" 如果设置此属性为true,翻译过来的servlet中将含有Exception隐式对象,其中封装的就是上一个页面中抛出的异常对象。
pageEncoding = "utf-8" 服务器翻译jsp时使用的编码集,如果想防止jsp乱码,应该保证文件编码和jsp翻译成servlet用的编码以及输出到浏览器后浏览器打开的编码一致,此属性一旦设置好,翻译引擎会间接帮我们设置content-type属性。
<%@include%> 用于将两个页面合并输出的指令。
只有file属性,可通过这个属性引入指定路径的页面。
<%@taglib%> 用于引入标签库的指令。
4.九大隐式对象。
page 代表当前servlet的对象(jsp被翻译后的servlet文件)。
request 代表请求的对象。
response 代表响应的对象。
session 代表会话的对象。
config 代表当前servlet配置信息的对象。
application 代表当前web应用的对象。
out 代表输出缓冲区的对象
exception 代表跳转页面的错误信息的对象。
pageContext 代表当前页面上下文的对象。
5. pageContext详解
代表当前jsp页面的执行环境的对象。
功能一:作为入口获取其他八大隐式对象。
getException()方法返回exception隐式对象。
getException方法返回exception隐式对象
getPage()方法返回page隐式对象
getRequest()方法返回request隐式对象
getResponse()方法返回response隐式对象
getServletConfig()方法返回config隐式对象
getServletContext()方法返回application隐式对象
getSession()方法返回session隐式对象
getOut()方法返回out隐式对象
功能二:作为域对象使用。
域对象:如果一个对象身上有一个可以被看见的范围,在这个范围内利用对象身上的map实现数据的共享,这个对象就称之为域对象。
setAttribute(String name,Object value);
getAttribute(String name);
removeAttribute(String name);
getAttributeNames();
生命周期:在访问jsp页面开始的时候,pageContext对象创建,
在访问jsp页面结束的时候,pageContext对象销毁。
作用范围:在整个jsp页面范围内。
主要功能:在整个jsp页面范围内共享数据。
功能三:设置其他作用域中的值
setAttribute(String name,Object value,int scope); // 设置指定域中的域属性。
getAttribute(String name,int scope); // 获取指定域中的域属性。
removeAttribute(String name,int scope);
getAttributeNamesInScope(scope);
scope可选值:
PageContext.APPLICATION_SCOPE 代表servletcontext域
PageContext.SESSION_SCOPE 代表session域
PageContext.REQUEST_SCOPE 代表request域
PageContext.PAGE_SCOPE 代表pageContext域
功能四:自动搜寻域
findAttribute(String name);
在四个作用域中,由小到大的搜索指定名称的域属性,如果在某一个域中搜寻到属性,则不会继续搜索更大范围的域。
功能五:便捷的请求转发
pageContext.forward(location);
6.四大作用域
什么是作用域:在一个时间内有一个可以被看见的范围,在这个范围内共享数据,这个范围就称之为作用域。
由大到小的顺序排列:
ServletContext --- application --- web应用
生命周期:web应用加载,servletContext对象产生。
web应用移出容器或服务器关闭,servletContext对象销毁。
作用范围:整个web应用。
主要功能:在整个web应用的范围内共享数据。
Session --- session --- 会话范围
生命周期:在调用request.getSesssion()时,session对象产生。
意外身亡:当服务器意外关闭的时候,session对象会被销毁。
超时死亡:在web.xml中配置了session的最大生命时长,默认为30分钟。一个session对象,超过30分钟没有任何操作,则服务器会将其销毁。
自杀:
作用范围:整个会话范围。
主要功能:在整个会话
request --- request --- 请求
生命周期:在请求链开始的时候,request对象产生。
在请求链结束的时候,reqeust对象销毁。
作用范围:整个请求链。
主要功能:在整个请求链中共享数据。
pageContext --- pageContext --- jsp页面中上下文。
生命周期:在访问jsp页面开始的时候,pageContext对象产生。
在
作用范围:整个jsp页面。
主要功能:在整个jsp页面内共享数据。
7.JSP标签技术
7.1jsp标签技术概述
jsp中既可以书写html内容展示页面,也可以书写Java语句处理逻辑。两者还可以相互嵌套。在代码量较少的时候,较为方便,一旦页面构成复杂,处理的逻辑繁琐,都会导致代码量骤增,使得页面中的html和Java语句的可读性较低。难以维护和管理。所以sun公司提出,将页面中的Java语句都使用标签替代。这样页面中只会出先标签相关的内容,页面可读性会增强,代码的可维护性会提高。
7.2EL表达式 !!
EL 全名为Expression Language,用来替代<%= %>脚本表达式
EL具有获取数据、执行运算、获取常用开发对象、调用java方法这四方面的功能。javaEE目前内置了EL表达式,可以在jsp页面中直接使用
EL表达式可以替换全部jsp脚本表达式的内容<%=%>
EL表达式用法 el表达式只能操作域中属性,el表达式不能进行遍历,el表达式不能设置值。
${el表达式}
a.获取数据
获取常量数据
<h3>el表达式获取常量</h3>
<%=123 %>
<%=123.123 %>
<%="abc" %>
<%=true %>
<hr/>
${123 }
${123.123 }
${"abc" }
${true }
获取变量数据
<h3>el表达式获取变量</h3>
<%=request.getContextPath() %>
${pageContext.request.contextPath}
获取域中的属性
自动搜寻域
<%
pageContext.setAttribute("name", "朴大胖");
request.setAttribute("name","曹二胖");
session.setAttribute("name", "鑫三胖");
application.setAttribute("name", "李一瘦");
%>
<%=pageContext.findAttribute("name") %>
${name}
获取指定域的域属性
<h3>获取指定域中的域属性</h3>
${pageScope.name }
${requestScope.name }
${sessionScope.name }
${applicationScope.name }
删除指定域中数据后再次获取
<%
pageContext.setAttribute("name", "朴大胖");
request.setAttribute("name","曹二胖");
session.setAttribute("name", "鑫三胖");
application.setAttribute("name", "李一瘦");
%>
<%pageContext.removeAttribute("name",PageContext.PAGE_SCOPE); %>
${name }
获取数组
<h3>el获取数组</h3>
<%
String[] s = {"a","b","c"};
pageContext.setAttribute("s", s);
%>
${s[0] } ${s[1] }
获取链表
<h3>el获取链表</h3>
<%
List l = new LinkedList();
l.add("abc");
l.add(123);
pageContext.setAttribute("l", l);
%>
${l[0] }
获取映射
<h3>el获取映射</h3>
<%
Map map = new HashMap();
map.put("name", "caoyang");
map.put("height","180");
map.put("gender","male");
map.put("wife.first","小聋女");
pageContext.setAttribute("map", map);
pageContext.setAttribute("h", "height");
%>
${map.name }
${map["height"] }
${map[h] }
${map["wife.first"] }
获取javabean对象
<h3>el表达式获取javabean</h3>
<%
Person p = new Person("lishuai",18,"bj");
pageContext.setAttribute("p", p);
%>
${p.name }
${p["age"] }
${p["addr"] }
b.执行运算
关系运算
<h4>关系运算</h4>
${3>2 }
${3<2 }
${3==2 }
${3<=2 }
${3>=2 }
${3!=2 }
逻辑运算
${true or false }
${true and false }
${not(true) }
${!true }
${true && false }
${true || false }
算术运算
<h4>算术运算</h4>
${3+2 }
${3-2 }
${3/2 }
${3*2 }
${3%2 }
${3+"2" }
${3-"2" }
empty运算
<h4>empty运算</h4>
<h5>如果对象为null 字符串为空 集合数组没有任何元素 empty操作都会返回true,其他任何内容都会返回false</h5>
<%
String str = null;
pageContext.setAttribute("str", str);
String abc = "";
pageContext.setAttribute("abc", abc);
List list = new ArrayList();
//list.add("anc");
pageContext.setAttribute("list", list);
String[] arrs = {};
pageContext.setAttribute("arrs", arrs);
%>
${empty str }
${empty abc }
${empty list }
${empty arrs }
三元表达式运算
<h4>el三元表达式</h4>
<%
List listx = new ArrayList();
listx.add("abc");
pageContext.setAttribute("listx", listx);
%>
${empty listx?"yes":"no" }
c.获取常用开发对象——el表达式内置的11个隐式对象
代表作用域的隐式对象:
pageScope
requestScope
sessionScope
applicationScope
代表请求头的隐式对象:
header可以获取指定名称的请求头的内容,结果存放在一个Map<String,String>
headerValues可以获取请求头的内容,结果存放在一个Map<String,String[]>
代表请求参数
param 可以获取指定名称的请参数的内容,结果存放在一个Map<String,String>
paramValues可以获取请求参数的内容,结果存放在一个Map<String,String[]>
代表初始化配置参数的隐式对象:
initParam 可以获取初始化配置参数,将结果存放在一个Map<String,String[]>
代表cookie信息的隐式对象:
cookie可以获取cookie中指定名称的参数,将结果存放在一个Map<String cookieName,cookie>对象
代表当前页面上下文的隐式对象:
pageContext 可以在整个页面内共享数据,结果存放在一个Map<String,Object>
7.3 jstl标签库 !!!
<c:set> 设置/修改属性
设置/修改域中属性:
<c:set var="a" value="abc" scope="request"></c:set>
${a}
<c:set var="a" value="123" scope="request"></c:set>
${a}
设置/修改map中属性:
<%
Map map = new HashMap();
pageContext.setAttribute("map", map);
%>
<c:set target="${map }" property="name" value="lishuai"></c:set>
${map.name}
<c:set var="a" value="123" scope="request"></c:set>
${a}
<h4>修改map属性</h4>
<c:set target="${map }" property="name" value="caoyang"></c:set>
${map.name }
修改javabean中属性值</h4>
<%
Person p = new Person("caoyang",17,"ah");
pageContext.setAttribute("p", p);
%>
${p.name }
<br/>
修改后:
<c:set target="${p }" property="name" value="piaoqian"></c:set>
${p.name }
<c:remove> 删除域属性/指定域属性
<h3>c:remove删除域/指定域属性</h3>
<c:set var="name" value="谢逊" scope="page"></c:set>
<c:set var="age" value="17" scope="page"></c:set>
<c:set var="name" value="殷天正" scope="request"></c:set>
<c:set var="name" value="韦一笑" scope="session"></c:set>
<c:set var="name" value="黛绮丝" scope="application"></c:set>
<c:remove var="name" scope="page" />
${pageScope.name }
${requestScope.name }
${sessionScope.name }
${applicationScope.name }
<hr/>
<c:remove var="name"/>
${pageScope.age }
${pageScope.name }
${requestScope.name }
${sessionScope.name }
${applicationScope.name }
<c:if> 用于判断结构
<h3>c:if用于判断结构</h3>
<%
pageContext.setAttribute("count", 100);
%>
<c:if test="${count == 100 }" var="f">
count等于100
</c:if>
${f }
<c:if test="${count > 100 }" var="f1">
count大于等于100
</c:if>
${f1 }
<c:choose> 选择判断结构
<h3>c:choose选择判断结构</h3>
<c:choose>
<c:when test="${count <10 }">count小于10</c:when>
<c:when test="${count <100 }">count大于等于10小于100</c:when>
<c:when test="${count <1000 }">count大于等于100小于1000</c:when>
<c:otherwise>count大于等于1000</c:otherwise>
</c:choose>
<c:forEach> 循环遍历结构
<h3>c:forEach 循环遍历</h3>
<c:forEach begin="0" end="100" step="2" var="i">
${i }
</c:forEach>
<hr/>
<%
List list = new LinkedList();
list.add("张无忌");
list.add("张三丰");
list.add("张飞");
list.add("灭绝师太");
pageContext.setAttribute("list", list);
%>
<c:forEach items="${list }" var="e" step="2">
${e }
</c:forEach>
<!-- 遍历0到一百之间的偶数 ,并且他们的总数下标为3的整数将这些数字变为红色-->
<c:forEach begin="0" end="100" step="2" var="q" varStatus="stat">
<c:if test="${stat.index%3 == 0 }">
<font color="red">${q }</font>
</c:if>
<c:if test="${stat.index%3 != 0 }">
<font color="blue">${q }</font>
</c:if>
</c:forEach>
<c:forTokens> 用于切割字符串的标签。
<c:forTokens items="www.tedu.cn" delims="." var="str">
${str }
</c:forTokens>
<c:catch> 用于捕获异常。
<h3>c:catch捕获异常</h3>
<c:catch var="exce">
<%
String str = null;
str.toCharArray();
%>
</c:catch>
${exce }
7.4自定义标签
略