一、JPS
1.java 服务器页面
jsp全称java server pages(java服务器页面),本质是一个servlet。它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。将内容的生成和显示进行分离,用JSP技术,Web页面开发人员可以使用HTML或者XML标识来设计和格式化最终页面,并使用JSP标识或者小脚本来生成页面上的动态内容。
2.jsp脚本
<%....%> java代码片段
<%=..%> 输出表达式,相当于out.print()
<%!...%> 声明成员变量
3.jsp指令
格式:<%@ 指令名称 属性="值" 属性="值"%>,用于指示JSP执行某些步骤,用于指示JSP表现特定行为。
例如:<%@page language="java" import="java.util.*" pageEncoding="utf-8"%>
jsp指令的分类:page-声明jsp页面的一些属性、include-静态包含、taglib-导入标签库。
注意:一个页面中可以出现多个指令,指令可以放在任意位置,一般都放在jsp页面最上面。
1)page指令
重要属性:
contentType:设置响应流的编码,及通知浏览器用什么编码打开。设置文件的mimetype。
pageEncoding:设置页面的编码
import:导入所需要的包
pageEncoding与contentType都是page指令的属性,它们都是用来设置编码,有如下联系:
如果这两个属性只提供了其中一个,那么没有提供的那个属性的编码值就是提供的这个属性的编码值,例如:在jsp页面中设置了contentType=”text/html;charset=utf-8”,那么没有设置的pageEncoding的值就为utf-8,反之亦然;如果两个属性都没有提供,那么两者的默认编码就是ISO-8859-1。
根据对这两个属性的讲解,它们有如下区别:
pageEncoding是设置当前页面的编码,该编码是给服务器看的,可以让服务器正确的将jsp文件翻译成Java文件;
contentType有两个作用:一是设置响应字符流的编码,二是设置Content-Type响应头,即通知浏览器使用什么编码方式解码响应信息。
了解属性:
language:当前jsp页面里面可以嵌套的语言
buffer:设置jsp页面的流的缓冲区的大小
autoFlush:是否自动刷新
extends:声明当前jsp的页面继承于哪个类,必须继承的是httpservlet 及其子类
session:设置jsp页面是否可以使用session内置对象
isELIgnored:是否忽略el表达式,可取值为true/false。如果值为true,那么页面上的el表达式就不会被解析。
errorPage:当前jsp页面出现异常的时候要跳转到的jsp页面
isErrorPage:当前jsp页面是否是一个错误页面,若值为true,可以使用jsp页面的一个内置对象exception,调用相关的函数
2)include指令
include指令的作用是在JSP页面中静态包含一个文件,同时由JSP解析包含的文件内容,生成一个java文件。包含的是目标文件的源码;包含过来,一起翻译。
格式:<%@include file="相对路径或者是内部路径" %>
例子:
main.jsp中的代码
<%
String s = “abc”;
%>
<%include file=“part.jsp” %>
part.jsp中的代码
<%=s %> 没有定义变量s
尽管part.jsp本身会有错误但是运行main.jsp就可以正确引入part.jsp
3)taglib指令
用于导入标签库。
格式:<%@taglib prefix="前缀名" uri="名称空间" %>
uri 标签文件的URI地址
prefix 标签组的命名空间前缀
若taglib指令导入之后
<前缀名:标签 .. >
例如:<c:if test="boolean表达式">输出内容</c:if >
4.jsp对象
1)9大内置对象
在jsp页面上可以直接使用的对象
内置对象 类型
out JspWriter
request HttpServletRequest
response HttpServletResponse
session HttpSession
exception Throwable
page Servlet(this)
config ServletConfig
application ServletContext
pageContext PageContext
2)JSP域对象
application整个项目、session一次会话、request一次请求、pageContext一个页面。
pagecontext:
可以通过pageContext对象获取jsp中其他的内置对象。 PageContext类中定义了如下八个方法:getPage()、getRequest()、getResponse()、getServletConfig()、getServletContext()、getException()、getSession()等方法,其中getOut()放是在其父类中定义的,有了这些方法,pageContext对象自然能够获取其他八个内置对象了。
pageContext也是一个域对象,所以他有以下方法:
void setAttribute(String name,Object value)
Object getAttribute(String name);
Void removeAttribute(String name);
我们还可以利用以下方法操作其他域中的对象:
Object getAttribute(String name, int scope):
该方法的第一个参数是域属性的名称,第二个参数指定是从那个域中取出域属性;
在PageContext中已经定义了如下几个静态常量作为scope的可选值:
- int APPLICATION_SCOPE:表示从application域中获取数据;
- int PAGE_SCOPE:表示从pageContext域中获取数据;
- int REQUEST_SCOPE:表示从request域中获取数据;
- int SESSION_SCOPE:表示从session域中获取数据。
void setAttribute(String name,Object value,int scope):
该方法的第一个参数指的是域属性的名称,第二参数指的是域属性的值,第三个参数指定域属性保存的域,scope的取值同上;
void removeAttribute(String name,int scope):
该方法的第一个参数指的是域属性的名称,第二个参数指的是将指定域属性从哪个域中移出,scope的取值同上;
PageContext类的父类中定义了如下方法:
Object findAttribute(String name):该方法是从jsp的四个域pageContext、request、session、application依次查找指定名称的域属性,如果找到就停止,这说明如果这四个域中存在同名的属性,那么返回的数据是从page范围中获取的。即表示谁的域范围越小,谁的优先级越高。
5.jsp的动作标签
<jsp:forward>:请求转发 相当于java中request.getRequestDispatcher(..).forward(..);
<jsp:forward page="内部路径"></jsp:forward>
<jsp:include>:动态包含,就是将被包含页面或者servlet的运行结果包含到当前页面中。
二、el
EL是Expression Language的缩写,它是jsp内置的表达式语言,从jsp2.0开始,就不让再使用java脚本,而是使用el表达式或动态标签来代替java脚本。EL表达式的格式如下:${表达式}。EL表达式代替的是java脚本中的<%= …%>,也就是说EL表达式也是向浏览器端输出数据。例如${1+2}会向浏览器端输出3。
1.EL作用
获取数据:EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
执行运算:利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
获取web开发常用对象:EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
调用Java方法:EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。
获取域中数据:${pageScope|requestScope|sessionScope|applicationScope.属性名}
注意:若属性名中出现了"."|"+"|"-"等特殊符号,需要使用[]获取,例如:${requestScope["arr.age"] }
${属性名}:依次从pageContext,request,session,application查找指定属性,若查找到返回值,结束该次查找;若查找不到,返回""。
获取复杂数据
获取数组中的数据:${域中的名称[index]}
获取list中的数据:${域中的名称[index]}
获取map中的数据:${域中的名称.键名}
2.javabean导航
java语言编写的一个可重用的组件,狭义上来说就是我们编写的一个普通的java类 例如:User Person
javabean规范:
1.必须是一个公共的具体的类 public class
2.提供私有的字段 private String id;//id称之为字段
3.提供公共访问字段的方法 get|set|is方法:public String getId(){..},一旦有公共的方法之后,get|set|is之后的内容,将首字母小写,将这个东西称之为bean属性,id就是一个bean属性。
4.提供一个无参的构造器
5.一般实现序列化接口 serializable
${域中javabean名称.bean属性}
3.执行运算
四则运算、关系(>..)、逻辑(&& ||)
+:只能进行加法运算,字符串形式数字可以进行加法运算.
empty:判断一个容器的长度是否为0(array set list map),还可以判断一个对象是否为空,${empty 域中的对象名称}
三元运算符: ${ 3>4?"yes":"no" }
4.el的内置对象(了解)
11个
pageScope、requestScope、sessionScope、applicationScope
param、paramValues
header、haederValues
initParam
cookie★
pageContext★
注意:除了pagecontext其余对象获取的全是map集合。
了解:和参数相关的el内置对象
param、paramValues
例如:访问栏http://localhost/day?username=tom,则${param.username }结果为tom
了解:和请求头相关的el内置对象
header、haederValues
例如:${headerValues["user-agent"][0] }
了解:和全局初始化参数相关的el内置对象
initParam
参数具体在web.xml中。
pageContext:获取不是map集合,相当于jsp的pageContext内置对象
在jsp页面中获取项目名:${pageContext.request.contextPath}
5.cookie内置对象
${cookie}获取map{key=Cookie},key是cookie的名称,value是cookie本身。
例如:创建cookie: Cookie c=new Cookie("username","tom");
通过${cookie}获取相当于:{username=new Cookie("username","tom")}
若要获取名称username的cookie的value值(获取tom):${cookie.username.value}--javabean导航
获取jsession的值:${cookie.JSESSIONID.value}
6.jsp注释
html注释 <!-- -->,注释的内容只在页面上看不到 java代码和html源代码都有
java注释,只在java代码中存在
jsp注释 <%-- --%>,只在jsp页面中存在,翻译成java文件之后就没有了
三、jstl
JSTL(JSP Standard Tag Library,jsp标准标签库)是Apache对EL表达式的扩展,也就是说JSTL依赖EL表达式。JSTL是标签语言,使用起来非常方便。但是它不是jsp内置的标签,所以用的时候需要我们自己导包,以及指定标签库。
使用步骤:
1.导入jar包 (jstl.jar和standard.jar)
2.在页面上导入标签库:<%@taglib prefix="" uri=""%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
jstl的分类:core:核心类库 ★、fmt:格式化|国际化、xml:过时了、sql:过时了、函数库:很少使用
1.core
★c:if
★c:forEach
c:set 往域中设置值、c:choose 相当于switch..case
c:when
c:otherwise 分支
★c:if 判断
<c:if test="${el表达式}">满足的时候输出的内容</c:if>
<c:if test="${3>4 }">
3大于4
</c:if>
<c:if test="${3<=4 }">
3不大于4
</c:if>
★c:forEach 循环
格式1:
<c:forEach begin="从那里开始" end="到那里结束" step="步长" var="给变量起个名字" varStatus="循环状态变量">
${i }--${vs.count }--${vs.current }<br>
</c:forEach>
varStatus:用来记录循环的状态,常用的属性:count:记录次数、current:当前遍历的内容。
例如:
<c:forEach begin="1" end="20" step="2" var="i" varStatus="vs">
${i }--${vs.count }--${vs.current }<br>
</c:forEach>
格式2:
<c:forEach items="${el获取域中的容器}" var="n">
${n }
</c:forEach>
例如:
//遍历list
<c:forEach items="${list }" var="n">
${n }
</c:forEach>
//遍历map
<c:forEach items="${map }" var="en">
${en.key }-- ${en.value }<br/>
</c:forEach>
扩展:
c:set 、c:choose、c:when
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:set var="day" value="4"/><!-- 相当于 pageContext.setAttribute("day",3) -->
<c:choose>
<c:when test="${day==1 }">
周1
</c:when>
<c:when test="${day==2}">
周2
</c:when>
<c:when test="${day==3 }">
周3
</c:when>
<c:otherwise>
其他
</c:otherwise>
</c:choose>