JSP
java服务页面
jsp的出现是为了简化页面的书写
在jsp上面既可以写HTML CSS JS 也可以写java代码
jsp本质上是一个Servlet
原理: 当你请求一个jsp页面时,服务器会去查找该jsp页面是否存在,如果找到,tomcat的js转换引擎,就会把.jsp转换成.java文件,在编译成.class字节码文件,调用service()方法对外提供服务
index.jsp--服务器JS转换引擎--index_jsp_.java--index_jsp.class
index_jsp.java--继承--HttpServlet
早期JSP脚本
早期jsp页面书写java代码的语法
标记语言注释:<!-- -->
缺点:
1.会发送到客户端
2.不能注释Java代码
jsp注释:<%-- --%>
优点;
1.不会发送到客户端
2.能注释Java代码
<%!
定义成员变量
java代码
int num = 100;
%>
<%
定义在service()方法中的局部变量
String name = "jack";
System.out.println(num);
System.out.println(name);
%>
<%=%>相当于out.write()
在service()方法中
将内容打印在页面上
<%="ABC"%>
<%=name%>
3大指令(page include taglib)
指令:配置JSP页面的属性或者导入一些额外的内容
格式:<%@ 指令名称 属性名="属性值" %>
●配置指令-配置JSP页面的属性
<%@page >
language:指定jsp页面使用的语言。只有一个值java
import:导入软件包
pageEncoding:设置页面编码
1.指定jsp文件的编码
2.告诉浏览器页面使用的编码格式
autoFlush:自动刷新
buffer:缓冲区大小
isErrorPage:是否是错误页面
true:是错误页面,可以使用内置对象exception
false:不是
errorPage:指定错误页面,当页面发生异常时,指定跳转的页面
一般在开发完成后,会在web.xml中通过<error-page>标签来配置整个项目的错误页面
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
●静态包含布局指令
复用性 这个页面不会生成一个java类
<%@include file="top.jsp" %>
●导入第三方的标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
6个动作标签
JavaBean:一种符合特定规范的Java类
1.私有所有成员变量
2.提供公共的访问方式 setter或getter
3.提供空参构造
使用一个ID和一个给定作用范围和同一ID的JavaBean相关联
<jsp:useBean> Person p = new Person()
设置JavaBean的属性值
<jsp:setProperty> p.setName("zhangsan")
取得JavaBean的属性值
<jsp:getProperty> String name = p.getName()
<jsp:useBean id="对象名" class="路径">
<jsp:setProperty name="对象名" property="name" value="jack"/>
<jsp:setProperty name="对象名" property="age" value="18"/>
<jsp:getProperty name="对象名" property="name"/>
<jsp:getProperty name="对象名" property="age"/>
</jsp:useBean>
内部转发
<jsp:forward page="/welcome"/>
动态包含 页面布局
这个页面单独生成一个java类
<jsp:include page="top.jsp"/>
传递参数
<jsp:param name="msg" value="asd"/>
9个内置对象
内置对象:
在jsp转换后的.java文件的service方法中声明好的对象
在jsp中可以直接使用
页面域
pageContext.getXXX 获取获取其他八个内置对象
application.setAttritbute() 全局域对象
session 会话域对象
request 请求域对象
pageContext 页面域对象 范围这个jsp页面
config 配置对象
out 输出对象,在使用对象向页面输出信息时,采用out
this 当前的jsp对象
response 响应对象
exception 异常对象 把页面指定为异常页面
el表达式
jsp的内置表达式语言,从jsp2.0开始.
用来替代<%=..%>
作用:
1.获取域中数据
2.执行运算
3.获取常见的web对象
4.调用java的方法
格式:
${el表达式}
四则运算
加法运算 +
只能进行加法运算,字符串形式数字可以进行加法运算
判断是否为空、0 empty
判断一个容器的长度是否为0(array set list map)
还可以判断一个对象是否为空
${empty 域中的对象名称}
取反 not
${not empty 域中对象名称}
el表达式支持调用方法,这个方法要有返回值
el表达式支持运算符,也支持三元表达式
三元表达式 取不到就是空串
${list.size()>3 ? "大于" : "不大于"}
内置对象
${applicationScope.XXX} 全局域对象
sessionScope 会话域对象
requestScope 请求域对象
pageScope 页面域对象 范围这个jsp页面
param 获取请求参数
发送http://localhost:8080/ELDemo/demo.jsp?username=zhangsan这个请求,有请求参数,就可以在页面中获取
${param.username} 获取请求参数username的值
${cookie.key.value} cookie获取
获取数据
获取简单数据
<%
request.setAttribute("rkey", "rvalue");
%>
老方式: <%=request.getAttribute("rkey") %>
el方式: ${requestScope.rkey}
取不到就是null
<%=request.getAttritbute("msg")%>
便捷获取: ${rkey} 取不到就会空串展示
获取复杂数据
<%
//往request域中放入数组
request.setAttribute("arr", new String[]{"aa","bb"});
//往request域中放入list
List list=new ArrayList();
list.add("aaa");
request.setAttribute("list", list);
//往request域中放入map
Map m=new HashMap();
m.put("username","tom");
m.put("age",18);
request.setAttribute("map", m);
%>
获取数组中的数据
${域中的名称[index]}
老方式:<%=((String[])request.getAttribute("arr"))[1]%>
el方式:${arr[1]}
获取list中的数据
${域中的名称[index]}
老方式:<%=((List)request.getAttribute("list")).get(1)%>
el方式:${list[1]}
获取map中的数据
${域中的名称.键名}
老方式:<%=((Map)request.getAttribute("map")).get("age")%>
el方式:${map.age}
判断容器是否为null、0
${list.size()==0}
${empty list}
取反
${not empty list}
获取对象中字段的值
<%
User u=new User();
u.setId("001");
u.setName("tom");
//将u放入域中
request.setAttribute("user", u);
%>
获取域中javabean的id值:
老方式:<%=((User)request.getAttribute("user")).getId()%>
el方式:${user.id }
jstl标签
概述:
jsp标准的标签库语言 apache的 用来替代java脚本
使用步骤:
1.导入jar包(jstl.jar和standard.jar)
放在WEB-INF/lib下
2.在页面上导入标签库
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
使用格式:
<c: >
jstl的分类:
core:核心类库
★c:if
★c:forEach
fmt:格式化|国际化
xml:过时了
sql:过时了
函数库:很少使用
jstl标签配合 el表达式来使用就可以写逻辑(判断 循环)
判断
条件一般写在el表达式中 ${条件}
<c:if test="条件">
<h1>你能看到吗?</h1>
</c:if>
<c:if test="${not empty name }">
${name}欢迎你!
</c:if>
循环
普通循环
begin开始索引 end终止索引 var给变量起名 step步长
<c:foreach begin="0" end="7" var="i" step="1">
${arr[i]}
</c:foreach>
新式循环
varStatus可选参数 遍历状态
v.count 元素编号 从1开始
v.index 元素索引 从0开始
v.current 当前遍历的元素
v.first 是不是第一个元素 返回值Boolean
v.last 是不是最后一个元素 返回值Boolean
<c:foreach items="${arr}" var="ele" varStatus="v">
${ele}--${v.count}
</c:foreach>
<c:foreach items="${map}" var="kvObj" varStatus="v">
${kvObj.key}--${kvObj.value.name}
</c:foreach>
自动补项目路径
<c:url value="/demo1" />
往域中存数据
保存数据(保存到域中)默认保存到page域
<c:set var="name" value="rose" scope="request" />
取域中数据
default:当value值为null时,使用默认值
escapeXml:是否对value值进行转义,false,不转义,true,转义(默认)
<c:out value="${name}" default="<h3>标题</h3>" escapeXml="false" />
多条件判断
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>
循环特殊字符串
forToken标签
<%
String str = "java-php-net-平面";
pageContext.setAttribute("str",str);
%>
<c:forTokens items="${str}" delims="-" var="s">
${s }<br/>
</c:forTokens>
重定向
<c:redirect url="http://www.baidu.com" />