一、JSP介绍
JSP: Java Server Pages,简单编写页面,它允许使用特定的标签在 HTML 网页中插入 Java 代码,实现动态页面处理,所以 JSP 就是 HTML 与Java 代码的复合体。
1.原理
服务器启动,将编写的jsp文件,转译成java文件,再编译成class文件运行。
2.JSP和Servlet区别
JSP以源文件形式部署到容器中。而Servlet需要编译成class文件后部署到容器中。
JSP部署到Web项目的根目录下货目录下的其他子目录和静态同资源位于相同位置。而Servlet需要部署到WEB-INF/classes目录中。
JSP中的HTML代码会被JSP引擎放入到Servlet的out.write()方法中。而在Servlet中我们需要自己通过对字符流输出流的操作生成响应的页面。
JSP更擅长变现于页面显示,Servlet更擅长于逻辑控制。
三、JSP的使用
1.JSP三种标签
<% java代码 %>
<body>
<hr>
<hr>
<h2>java脚本1</h2>
<%
Object obj = new Object();
System.out.println(obj );
out.write(obj.toString());
%>
<hr>
<hr>
<%
out.write(obj.toString());
%>
</body>
<%=代码 %>
<%-- <%= 相当于out,直接将结果输出到浏览器 --%>
<%=new Object() %>
需求:产生10行表格
<table border="2" align="center">
<tr>
<td>ID</td>
<td>Username</td>
<td>password</td>
</tr>
<%
for (int i = 0; i < 10; i++) {
%>
<tr>
<td>ID</td>
<td>Username</td>
<td>password</td>
</tr>
<%
}
%>
2.指令标签
指令 | 描述 |
---|---|
<%@ page ... %> | 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include ... %> | 包含其他文件 |
<%@ taglib ... %> | 引入标签库的定义,可以是自定义标签 |
2.1page
page: 设置当前当前jsp的属性
语法: <%@page 属性="值" 属性="值" %>
import: 在当前jsp导入其他java包
注意:
session: true|false,默认是true,设置当前页面是否可以直接使用session对象,false,就是没有session对象,使用时编译报错。
2.2taglib
taglib: 用来给当前jsp引入jstl标签库
语法: <%@ taglib uri="" prefix="" %>
用法: 引入jstl标签库
2.3include
include: 包含,将其他内容包含至当前页面
语法: <%@ include file="路径">
作用: 将file指定路径的文件加入到当前页面,已达到复用的效果
<%@ include file="header.jsp"%>
<%-- 将其他jsp 界面包含到当前界面--%>
<%@include file="content.jsp"%>
<%@ include file="footer.jsp" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<jsp:include page="head.jsp"></jsp:include>
这个是身体
</body>
<jsp:include page="footer.jsp"></jsp:include>
</html>
3.内置对象
内置对象,就是jsp页面中可以直接使用的对象.
4.四大域
域 | 解释 | 值的范围 |
---|---|---|
pageContext | 页面域 | 只有当前页面能使用 |
request | 请求域 | 在一次请求转发中有效 |
session | 会话域 | 在一次会话中有效 |
application | 应用域 | 在整个web应用中有效 |
5.EL表达式
5.1作用
用于替换作用域对象.getAttribute("name")
5.2应用
${scope.name} 获取具体某个作用域中的数据
${name} 获取作用域中的数据,逐级查找(pageContext、request、session、application)
<%
User user1 = new User();
user1.setId(100);
user1.setUsername("xiaoming");
request.setAttribute("user",user1);
%>
<%--以下三种方式都可获取--%>
user-name:${requestScope.user.username}<br>
user-name:${user.username}<br>
user-name:${user["username"]}<br>
<h2>存入四大域值,key=el</h2>
<%
application.setAttribute("el","appValue");
pageContext.setAttribute("el","pageValue");
request.setAttribute("el","reqValue");
session.setAttribute("el","seValue");
%>
<h3>el取值结果:${el}</h3>
<h3>指定取某个域的值: ${sessionScope.el}</h3>
5.3取值
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>取值</title>
</head>
<body>
<%
//先向域中存值
request.setAttribute("str","字符串");
request.setAttribute("num",100);
User user = new User( );
user.setUsername("牛牛");
user.setPassword("123456");
request.setAttribute("user",user);
int[] array = {11,22,33};
request.setAttribute("array",array);
Map map = new HashMap();
map.put("aka","阿浩");
map.put("ak47","阿卡司机");
request.setAttribute("map",map);
%>
<h2>取字符串:${str}</h2>
<h2>取数字:${num}</h2>
<h2>取对象:${user}</h2>
<!-- 对象取值是重点 -->
<h2>取对象的属性:${user.username}</h2>
<h2>取出数组:${array[0]}</h2>
<h2>取出map:${map.get('aka')}</h2>
</body>
</html>
6.JSTL
6.1什么是JSTL
JSTL:全称Java Server Pages Standard Tag Library
JSP标准标签库(JSTL)是一个JSP标签集合。
6.2JSTL的作用
可对EL获取到的数据进行逻辑操作。
与EL合作完成数据的展示。
6.3JSTL的使用
导入两个 jar 文件:standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下
在JSP页面引入标签库<% @taglib uri="Oracle Java Technologies | Oracle" prefix="c">
6.4核心标签的使用
6.4.1条件标签if判断jstl1.jsp
语法:<c:if test ="条件"> < /c:if>
<%
request.setAttribute("num",10);
%>
<%-- 判断
test中写布尔表达式
如果判断为true,开闭标签内的内容会显示在浏览器
否则,在浏览器不显示
--%>
<c:if test="${num < 1}">
num > 1
</c:if>
6.4.2多条件choose判断
语法:<c:choose >
<c:when test="条件1">结果1< /c:when>
<c:when test="条件2">结果2< /c:when>
<c:when test="条件3">结果3< /c:when>
<c:otherwise >结果4< /c:otherwise>
< /c:choose>
<h3>条件标签:choose(等价于java中多重if)</h3>
<%-- 测试成绩等级 >90 优秀 >80 良好 >70 中等 >60及格--%>
<c:set var="score" value="80"></c:set>
<c:choose>
<c:when test="${score>=90 }">优秀</c:when>
<c:when test="${score>=80 }">良好</c:when>
<c:when test="${score>=70 }">中等</c:when>
<c:when test="${score>=60 }">及格</c:when>
<c:otherwise>不及格</c:otherwise>
</c:choose>
6.4.3迭代foreach标签
<%--
循环 var是变量
begin从哪里开始
end 到哪结束
step 步长默认为1
--%>
<c:forEach var="i" begin="1" end="10" step="2">
${i}<br>
</c:forEach>
<hr>
<%--
循环
items 就是域中的集合
var 每次循环得到的对象
--%>
<c:forEach var="user" items="${list}">
<div>${user}</div>
</c:forEach>
语法
<c:foreach
var="变量名"
items="集合"
begin="起始下标"
end="结束下标"
step="间隔长度"
varstatus="遍历状态">
< /c:foreach>
<h3>测试list集合遍历获取学生列表</h3>
<table border="1" width="80%" bordercolor="red" cellspacing="0"
align="center">
<tr>
<th>学号</th>
<th>姓名</th>
<th>成绩</th>
<th>班级</th>
<th>是否是第一个</th>
<th>是否是最后一个</th>
<th>计数count</th>
<th>索引index</th>
</tr>
<!-- varStatus:变量状态:遍历出的每一项内容的状态:
first 是否是第一行
last 是否是最后一行
count 当前行数
index 当前元素的下标
-->
<!-- var :遍历出的每一项使用变量先存储
items:集合(使用El表达式)
-->
<c:forEach var="stu" items="${students}" varStatus="vs">
<tr>
<td>${stu.id}</td>
<td>${stu.name}</td>
<td>${stu.score}</td>
<td>${stu.classes}</td>
<td>${vs.first}</td>
<td>${vs.last}</td>
<td>${vs.count}</td>
<td>${vs.index}</td>
</tr>
</c:forEach>
</table>