一、JSP基础语法
1.理解
JSP:Java Server Page SUN 公司提供的动态网页编程技术,是 Java Web 服务器端的动态资源。
Jsp 就是一个 Servlet,当我们第一次访问 Jsp 的时候,Jsp 引擎都会将这个Jsp 翻译 成一个 Servlet,这个文件存放在 Tomcat 中的 work 目录中。
相比 html 而言,html 只能为用户提供静态数据,而 Jsp 技术允许在页面中嵌套 java 代码,为用户提供动态数据。
2.准备工作
1、修改JSP页面的编码
选择”Window”,选择”Preferfences”,搜索”JSP”,选择”JSP Files”,设置编码为UTF-8(默认是ISO-8859-1)
2、修改模板
将模板中html4修改html5
3.注释
两类三种
第一类:隐式注释
在浏览器中看不见的注释
1.Jsp自己的注释 <%–JSP注释–%>
<%–JSP注释 –%>
2.继承java风格的注释
//单行注释
/多行注释/
第二类:显示注释
在浏览中审查元素或者查看源代码可以看到的注释
继承HTML风格的注释 <!–html注释–>
<!-- JSP页面中写Java代码 --> <% /* Java代码 */ // 定义变量 String str = "Hello"; %>
4.Scriptlet
Scriptlet脚本小程序
所有嵌入在 HTML 代码中的 Java 程序。
JSP一种有三种脚本小程序:
第一种:Java脚本段,可以定义局部变量、写java语句等
生成的源码在编译后的Servlet类中的service方法体中
格式:<% //Java代码 %>
<% %>
第二种:声明,可以声明全局变量、方法、类等
生成的源码在编译后的Servlet类体中
格式:<%! //声明 %>
<%! %>
第三种:输出,可以输出变量或字面量
格式:<%=变量或字面量 %>
<%=1 %><!-- 第一种:Java脚本段,可以定义局部变量、写java语句等 --> <% // 定义变量 int a = 1; // 定义集合 List<String> list = new ArrayList<>(); list.add("Hello"); // 输出 System.out.println(list.get(0)); // 输出 System.out.println(num); // 输出到浏览器 out.print(num); List<String> list2 = null; %> <% if (1 > 0) { %> <h2>哈哈哈哈哈</h2> <% } %> <!-- 第二种:声明,可以声明全局变量、方法、类等 --> <%! // 声明全局变量 int num = 100; // 定义方法 // 定义类 %> <br> <!-- 第三种:输出,可以输出变量或字面量 --> <%=a %> <br> <!-- jsp注释的内容不会被编译 --> <%-- <%=list2.get(0) %> --%> </body> </html>
二、JSP的指令标签
1.page指令
格式:
<%@ page 属性名=“属性值” 属性名=“属性值”%>
常用属性:(多个属性之间用空格隔开)
language:语言,目前只有java
contentType:响应类型及编码格式
pageEncoding:页面编码格式
页面的编码以contentType中的charset的值为准,若charset未设置,则以pageEncoding的属性值为准;
如果pageEncoding的属性也未设置则使用默认编码ISO-8859-1。
import:导包。只有该属性可以在page指令中出现多次。
errorPage:当页面报错时,跳转的页面(与isErrorPage属性结合使用)
isErrorPage:是处理报错的页面,默认是false (与errorPage属性结合使用)<%@page import="java.util.*" import="java.io.*" %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*" errorPage="error.jsp"%>
2.taglib标签
当使用到第三方标签库时需要通过 taglib 标签进行导入。
<%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
3.include静态包含
格式:
<%@ include file=“要包含的文件路径” %> 相对路径特点:
相当于将内容直接复制
只会生成一个源码文件,不能有同名变量。
运行效率快一点点,耦合度高,不够灵活。<!-- 静态包含 --> <%@include file="header.jsp" %> <div style="background-color: green;height: 200px"> <h2>我是主体!</h2> <%-- <% int a =1; %> --%> </div> <!-- 静态包含 --> <%@include file="footer.jsp" %>
4.include动态包含
格式:
<jsp:include page=“要包含的页面”></jsp:include>
有参数:
<jsp:include page=“要包含的页面”>
<jsp:param value=“参数值” name=“参数名”/>
<jsp:param value=“参数值” name=“参数名”/>
</jsp:include>
value:参数值,可以接收表达式
name:参数名,字符串,不接受任何表达式
取值方式:request.getparameter(“参数名”);
特点:
相当于方法的调用
会生成多个源码文件,可以有相同的变量名。
灵活,耦合度低。
动态包含和静态包含的区别:
1、静态包含相当于将内容进行直接的复制,动态包含相当于方法的调用。
2、静态包含只会生成一个源码文件,而动态包含会生成多个源码文件。
3、静态包含不能有同名变量,而动态包含可以有同名变量。
4、静态包含不能传递参数,而动态包含可以。
5、静态包含耦合度高,而动态包含耦合度低。注:
当使用动态包含没有设置参数时,jsp:include双标签中不要有任何内容,包括空格和换行。<% String str = "admin"; %> <!-- 动态包含 --> <jsp:include page="header.jsp"></jsp:include> <!-- 动态包含并传递参数 --> <jsp:include page="header.jsp"> <jsp:param value="zhangsan" name="uname"/> <jsp:param value="<%=str %>" name="uname2"/> </jsp:include> <div style="background-color: green;height: 200px"> <h2>我是主体!</h2> <% int a =20; %> </div> <jsp:include page="footer.jsp"></jsp:include>
三、九大内置对象
1.内置对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-afgytqVQ-1582809367948)(C:\Users\Hello Word\AppData\Roaming\Typora\typora-user-images\1582804488275.png)]
九大内置对象
四大域对象:
pageContext 当前JSP页面有效,跳转页面后无效
request 一次请求,请求转发跳转(服务端跳转)有效,重定向跳转(客户端跳转)无效
session 一次会话,无论是服务端跳转还是客户端,都有效;session对象销毁后失效。
application 整个应用,只有服务器不关闭都不会失效public void setAttribute(String name, Object o) 设置属性的名称及内容 public Object getAttribute(String name) 根据属性名称取属性 public void removeAttribute(String name) 删除指定的属性
两个输出对象
response 响应对象
out 输出对象
一个配置对象
config 获取配置信息
一个异常对象
exception 只有设置过isErrorPage=”true”的页面才能使用
一个页面对象
page 指代jsp页面本身
四、EL表达式
1.EL表达式
EL 表达式一般操作的都是域对象中的数据,操作不了局部变量。(通过限域变量名获取域对象中的值。)
格式:
**限
域
变
量
名
∗
∗
∗
∗
取
值
范
围
:
∗
∗
p
a
g
e
作
用
域
:
{限域变量名}** **取值范围:** page作用域:
限域变量名∗∗∗∗取值范围:∗∗page作用域:{pageScope.限域变量名}
request作用域:r
e
q
u
e
s
t
S
c
o
p
e
.
限
域
变
量
名
s
e
s
s
i
o
n
作
用
域
:
{requestScope.限域变量名} session作用域:
requestScope.限域变量名session作用域:{sessionScope.限域变量名}
application作用域:${applicationScope.限域变量名}
默认取值方式:
EL表达式在取值时,会自动从小范围到大范围查找,找到即止;
从page->request->session->application,如果四个域范围都未找到,则返回空字符串。<% // 设置域对象 pageContext.setAttribute("uname", "zhangsan"); request.setAttribute("uname", "lisi"); session.setAttribute("uname", "wangwu"); application.setAttribute("uname", "zhaoliu"); %> <h4>EL表达式 取值</h4> 获取域对象的值:${uname } <br> request作用域:${requestScope.uname }<br> session作用域:${sessionScope.uname }<br> application作用域:${applicationScope.uname }<br>
2.EL表达式使用
EL表达式取值:
1、判断域对象是否为空
e
m
p
t
y
限
域
变
量
名
∗
∗
该
域
对
象
可
以
是
字
符
串
、
J
a
v
a
B
e
a
n
对
象
、
L
i
s
t
集
合
、
M
a
p
等
∗
∗
{empty 限域变量名}** 该域对象可以是字符串、JavaBean对象、List集合、Map等 **
empty限域变量名∗∗该域对象可以是字符串、JavaBean对象、List集合、Map等∗∗{!empty 限域变量名}
判断域对象不为空
a、字符串:
如果字符串是null或空字符串,返回true
b、JavaBean对象
如果JavaBean是null,返回true
c、List集合
如果集合为null或集合的长度不大于0,返回true
d、Map
如果map对象为null或map没有内容,返回true 2、获取JavaBean对象
a、获取对象
限
域
变
量
名
∗
∗
b
、
获
取
类
中
的
属
性
∗
∗
{限域变量名 }** b、获取类中的属性 **
限域变量名∗∗b、获取类中的属性∗∗{限域变量名.属性名 } 或
限
域
变
量
名
.
g
e
t
属
性
名
(
)
∗
∗
c
、
获
取
对
象
中
的
对
象
的
属
性
∗
∗
{限域变量名.get属性名() }** c、获取对象中的对象的属性 **
限域变量名.get属性名()∗∗c、获取对象中的对象的属性∗∗{限域变量名.属性名.属性名}
注:JavaBean中属性需要提供getter方法
3、获取List集合
a、获取集合对象
限
域
变
量
名
∗
∗
b
、
获
取
集
合
中
的
元
素
∗
∗
{限域变量名 }** b、获取集合中的元素 **
限域变量名∗∗b、获取集合中的元素∗∗{限域变量名[下标] }
c、获取集合的长度
限
域
变
量
名
.
s
i
z
e
(
)
∗
∗
∗
∗
4
、
获
取
M
a
p
对
象
∗
∗
a
、
通
过
m
a
p
的
k
e
y
获
取
值
∗
∗
{限域变量名.size() }** **4、获取Map对象** a、通过map的key获取值 **
限域变量名.size()∗∗∗∗4、获取Map对象∗∗a、通过map的key获取值∗∗{限域变量名.key} 或 ${限域变量名[“key”]}
EL表达式运算:
运算:
${限域变量名1 + 限域变量名2}
${限域变量名1 + 字面量}
比较:
等值比较:
a、 ==
${限域变量名1 == 限域变量名2} 或 ${限域变量名1 == 字面量}
b、eq
${限域变量名1 eq 限域变量名2} 或 ${限域变量名1 eq 字面量}
大小比较:
${限域变量名1 > 限域变量名2}
${限域变量名1 >= 限域变量名2}
限
域
变
量
名
1
+
字
面
量
>
=
限
域
变
量
名
2
注
:
所
有
的
运
算
和
比
较
都
必
须
写
在
表
达
式
里
面
,
即
{限域变量名1 + 字面量 >= 限域变量名2} 注:所有的运算和比较都必须写在表达式里面,即
限域变量名1+字面量>=限域变量名2注:所有的运算和比较都必须写在表达式里面,即{}里面
<% // 字符串 String str = "Hello"; String str2 = null; String str3 = ""; request.setAttribute("str", str); request.setAttribute("str2", str2); request.setAttribute("str3", str3); // JavaBean对象 User user = new User(); user.setUserId(1); user.setUserName("Lisa"); Dog dog = new Dog(); dog.setName("张二狗"); dog.setAge(1); user.setDog(dog); User user2 = null; User user3 = new User(); request.setAttribute("user", user); request.setAttribute("user2", user2); request.setAttribute("user3", user3); // List集合 List<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); List<User> userList = new ArrayList<>(); userList.add(user); List list2 = null; List list3 = new ArrayList<>(); request.setAttribute("list", list); request.setAttribute("list2", list2); request.setAttribute("list3", list3); request.setAttribute("userList", userList); // Map Map<String,Object> map = new HashMap<>(); map.put("uname","admin"); map.put("user",user); map.put("userList",userList); Map map2 = null; Map map3 = new HashMap<>(); request.setAttribute("map", map); request.setAttribute("map2", map2); request.setAttribute("map3", map3); %> <h4>判断域对象是否为空</h4> 字符串:${empty str } -- ${empty str2 } -- ${empty str3 }<br> JavaBean对象:${empty user } -- ${empty user2 } -- ${empty user3 }<br> List集合:${empty list } -- ${empty list2 } -- ${empty list3 }<br> Map:${empty map } -- ${empty map2 } -- ${empty map3 }<br> <h4>获取JavaBean</h4> 获取对象:${user } <br> 获取JavaBean的属性:${user.userName } -- ${user.getUserName() } <br> 获取对象中的对象的属性:${user.dog.name } <h4>获取List集合</h4> 获取集合对象:${list }<br> 获取集合中的元素:${list[0] }<br> 获取集合的长度:${list.size() }<br> 获取对象集合:${userList } -- ${userList[0] } -- ${userList[0].userName } <h4>获取Map对象</h4> 过map的key获取值:${map.uname } -- ${map["user"].userName } -- ${map.userList[0].userName } <% request.setAttribute("num", 10); request.setAttribute("num2", 2); request.setAttribute("s1", "aa"); request.setAttribute("s2", "bb"); %> <h4>EL表达式运算</h4> ${num+1 } -- ${num + num2 }<br> ${num/num2 } -- ${num div num2 }<br> ${num > 1 } -- ${num+num2 > 10 }<br> ${num == num2 } -- ${s1 == s2 } -- ${s1 == "aa" } -- ${s1 eq s2 }
五、JSTL标签库
1.标签的使用
1、将jstl所需的两个jar包拷贝到项目的WEB-INF的lib目录下
2、在需要使用标签库的页面引入对应库<%--核心签库--%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> prefix表示该库的前缀,可以是任意字符,但一般使用"c" <%--格式化标签库--%> <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
2.条件动作标签
1)if标签
无主体内容
<c:if test=“条件” var=“限域变量名” scope=“域范围”></c:if>
有主体内容
<c:if test=“条件” var=“限域变量名” scope=“域范围”>
内容
/c:if>
常用属性:
test:if判断的条件,一般结合el表达式操作域对象
**var:**条件判断后的返回结果(true|false),存在一个域对象中
**scope:**域对象的范围,默认是page。可以取值page|request|session|application 注:if标签没有else标签,所以如果需要else的效果,需要写一个完全相反的条件
<% // 后台将数据存到request作用域中 request.setAttribute("score", 59); %> <c:if test="${score > 100 }" var="flag" scope="request"></c:if>${requestScope.flag } <br> <c:if test="${'1' == '1'}" var="flag2" ></c:if>${flag2 } <br> <c:if test="${'1==1'}" var="flag3" ></c:if>${flag3 } <br> <c:if test="1==1" var="flag4" ></c:if>${flag4 } <br> <%-- <c:if test="${1 == '1'}" var="flag5" ></c:if>${flag5 } <br> --%> <c:if test="${score == '59'}" var="flag6" ></c:if>${flag6 } <br> <hr> <c:if test="${score >1 }"> <h2>值大于1</h2> </c:if> <c:if test="${score <= 1 }"> <h2>值小于等于1</h2> </c:if> <!-- 使用JSTL的if标签 --> <c:if test="${score < 60 }"> <h2>你个渣渣!</h2> </c:if> <c:if test="${score == 60 }"> <h2>分不在高,及格就行!</h2> </c:if> <!-- 页面需要从作用域中将数据获取 --> <% Integer score = (Integer)request.getAttribute("score"); // 判断分数 if (score < 60) { %> <h2>你个渣渣!</h2> <% } else if (score == 60) { %> <h2>分不在高,及格就行!</h2> <% } %>
2)choose、when、otherwise标签
choose 和 when 标签的作用与 Java 中的 switch 和 case 关键字相似。
注意点:
1、choose、otherwise标签没有属性,但是when标签必须要有test属性
2、choose标签中只能嵌套otherwise和when标签,otherwise和when标签中可以嵌套其他标签 Illegal “c:if” after “c:otherwise” tag in “c:choose” tag.
3、choose标签中至少有一个when标签,可以没有otherwise标签
Illegal “choose” without child “when” tag
4、otherwise标签必须放在最后一个when标签之后
Illegal “c:when” after “c:otherwise” tag in “c:choose” tag.
5、otherwise标签会在所有的when标签不执行时,执行<% // 后台将数据存到request作用域中 request.setAttribute("score", 60); %> <c:choose> <c:when test="${score < 60 }"> <h2>你个渣渣!</h2> </c:when> <c:when test="${score >= 60 && score < 80 }"> <h2>哎哟不错哦!</h2> </c:when> <c:otherwise> <h2>你很棒棒哦!</h2> </c:otherwise> </c:choose>
3)forEach标签
forEach标签
迭代内容多次
<c:forEach begin=“开始数” end=“结束数” var=“限域变量名” step=“间隔数” ></c:forEach>
循环
<c:forEach items=“要遍历的对象(集合、map等)” var=“限域变量名” varStatus=“当前成员的相关信息”></c:forEach><% request.setAttribute("start", 0); request.setAttribute("end", 10); %> <!--迭代主体内容多次 --> <c:forEach var="i" begin="${start }" end="${end }" step="2"> <h4>${i }</h4> </c:forEach> <hr> <% List list = new ArrayList(); for (int i = 0; i < 10; i++) { list.add("A:" + i); } pageContext.setAttribute("li", list); %> <!-- 遍历集合 --> <c:forEach items="${li }" var="item"> ${item } <br> </c:forEach> <%---varStatus--%> <h2>forEach</h2> <table> <tr> <td>List内容</td> <td>当前下标</td> <td>成员总数</td> <td>是/否first成员</td> <td>是/否为last成员</td> </tr> <c:forEach items="${li}" var="item" begin="0" end="9" varStatus="idx"> <tr> <td><b>${item}</b></td> <td>${idx.index}</td> <td>${idx.count }</td> <td>${idx.first }</td> <td>${idx.last}<br /></td> </tr> </c:forEach> </table> <% // Map Map<String,Object> map = new HashMap<>(); map.put("uname","admin"); map.put("user",user); map.put("userList",userList); request.setAttribute("map", map); %> <!-- 迭代map --> <c:forEach items="${map }" var="item"> ${item.key } -- ${item.value } <br> </c:forEach> <%--九九乘法表--%> <table border="1" style="border-collapse: collapse;"> <c:forEach begin="1" end="9" var="i"> <tr> <c:forEach begin="1" end="${i }" var="j"> <td>${j } * ${i } = ${i*j }</td> </c:forEach> </tr> </c:forEach> </table>
3.迭代标签
forEach标签
迭代内容多次
<c:forEach begin="开始数" end="结束数" var="限域变量名" step="间隔数" ></c:forEach>
循环
<c:forEach items=“要遍历的对象(集合、map等)” var=“限域变量名” varStatus=“当前成员的相关信息”></c:forEach><% request.setAttribute("start", 0); request.setAttribute("end", 10); %> <!--迭代主体内容多次 --> <c:forEach var="i" begin="${start }" end="${end }" step="2"> <h4>${i }</h4> </c:forEach> <hr> <% List list = new ArrayList(); for (int i = 0; i < 10; i++) { list.add("A:" + i); } pageContext.setAttribute("li", list); %> <!-- 遍历集合 --> <c:forEach items="${li }" var="item"> ${item } <br> </c:forEach> <%---varStatus--%> <h2>forEach</h2> <table> <tr> <td>List内容</td> <td>当前下标</td> <td>成员总数</td> <td>是/否first成员</td> <td>是/否为last成员</td> </tr> <c:forEach items="${li}" var="item" begin="0" end="9" varStatus="idx"> <tr> <td><b>${item}</b></td> <td>${idx.index}</td> <td>${idx.count }</td> <td>${idx.first }</td> <td>${idx.last}<br /></td> </tr> </c:forEach> </table> <% // Map Map<String,Object> map = new HashMap<>(); map.put("uname","admin"); map.put("user",user); map.put("userList",userList); request.setAttribute("map", map); %> <!-- 迭代map --> <c:forEach items="${map }" var="item"> ${item.key } -- ${item.value } <br> </c:forEach> <%--九九乘法表--%> <table border="1" style="border-collapse: collapse;"> <c:forEach begin="1" end="9" var="i"> <tr> <c:forEach begin="1" end="${i }" var="j"> <td>${j } * ${i } = ${i*j }</td> </c:forEach> </tr> </c:forEach> </table>
4.格式化动作标签
1)formatNumber
将数值型的数据转换成指定格式的数值字符串
有主体内容
<fmt:formatNumber type=“类型” var=“限域变量名” >
要格式化的数据(接收表达式)
</fmt:formatNumber
无主体内容
<fmt:formatNumber type=“percent” value=“要格式化的数据(接收表达式)” />
常用属性:
type:格式化后的格式
percent 百分比类型
number 数值型
currency 货币型
var:限域变量名
用来接收格式化后的结果。如果设置了var属性,格式化后的结果不会输出,需要通过el表达式获取var属性的值2)formatDate
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TYjDvpcU-1582809367951)(C:\Users\Hello Word\AppData\Roaming\Typora\typora-user-images\1582806649877.png)]
将日期型的数据转换成指定格式的字符串
var:限域变量名
用来接收格式化后的结果。如果设置了var属性,格式化后的结果不会输出,需要通过el表达式获取var属性的值
type:日期类型
date 日期型,默认
time 时间型
both 日期+时间
dateStyle:日期型的格式
timeStyle:时间型的格式
pattern:具体的时间格式
y 年
M 月
d 日
H 时(0-24)
h 时(0-12)
m 分
s 秒3)parseNumber
将指定格式的数值字符串转换成数值型数据4)parseDate
将指定格式的字符串转换成日期型的数据<% request.setAttribute("num", 1); %> <h4>formatNumber</h4> <fmt:formatNumber type="percent" >10</fmt:formatNumber> <br> <fmt:formatNumber type="percent" var="num1" >10</fmt:formatNumber> ${num1 }<br> <fmt:formatNumber type="percent" var="num2" >${num }</fmt:formatNumber> ${num2 }<br> <fmt:formatNumber type="percent" value="${num }" /><br> <fmt:formatNumber type="currency" value="${num }" /><br> <fmt:formatNumber type="number" value="${num }" /><br> <!--设置地区 --> <fmt:setLocale value="en_US"/> <fmt:formatNumber type="currency" value="${num }" /><br> <hr> <% request.setAttribute("myDate", new Date()); %> <h4>formatDate</h4> ${myDate }<br> <fmt:formatDate value="${myDate }"/><br> <fmt:formatDate value="${myDate }" type="date"/><br> <fmt:formatDate value="${myDate }" type="time"/><br> <fmt:formatDate value="${myDate }" type="both"/><br> <fmt:formatDate value="${myDate }" dateStyle="short"/><br> <fmt:formatDate value="${myDate }" type="both" dateStyle="short" timeStyle="short"/><br> <fmt:formatDate value="${myDate }" pattern="yyyy-MM-dd HH:mm:ss"/><br> <fmt:formatDate value="${myDate }" pattern="yyyy/MM/dd HH:mm:ss"/><br> <fmt:formatDate value="${myDate }" pattern="yyyy年MM月dd日 HH:mm:ss"/><br> <h4>parseNumer</h4> <fmt:parseNumber type="number">100</fmt:parseNumber> <br> <fmt:parseNumber type="percent">100%</fmt:parseNumber> <br> <% request.setAttribute("n", "$1.00"); %> <fmt:parseNumber value="${n }" type="currency" /><br> <h4>parseDate</h4> <fmt:parseDate pattern="yyyy-MM-dd">2017-03-04</fmt:parseDate>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/121468.html