Jsp本身需要用<% JAVA程序 %>来书写java程序并执行
${}是一种简写格式,封装了<%%>但是本质上还是调用了java程序,所以他才能和servlet一样来使用请求对象。
$(" 标签对象")是用来获取jquery对象的
一、Jsp的执行流程与本质
jsp(java server page):java服务页面:http://localhost:8080/Servlet_jsp/index.jsp
JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。
jsp会经历两个阶段:
index.jsp----->翻译index_jsp.java---->class index_jsp extends HttpJspBase----->HttpServlet(Jsp本质:Servlet)
被tomcat解析---->创建当前类对象(index_jsp.class)---->反射的创建对象(index_jsp01)---->调用_jspservice()--->解析jsp文件中html标签代码
默认jsp的存储路径:
C:\Users\Administrator\.IntelliJIdea2019.1\system\tomcat\Unnamed_servlet+jsp+jdbc\work\Catalina\localhost\servlet_jsp_jdbc\org\apache\jsp
二、Jsp三大指令
1、page指令:
language(默认属性):只支持Java语言
contentType(默认属性):当前jsp编码是utf-8.
buffer:jsp中的html标签都需要被jap内置对象(JspWriter(字符流)out),out对象不断给浏览器写入内容,缓冲区大小默认为8kb.
errorPage:当前页面发生异常,跳转至的错误页面上
isErrorPage:当前页面是否是错误页面
isELIgnored:是否忽略jsp的el表达式,默认值false不忽略
import:导入相关的java类或者接口的包名
<%@ page contentType="text/html;charset=UTF-8" language="java"buffer="8kb"
errorPage="myfristjsp.jsp" isErrorPage="false" isELIgnored="false" %>
<%
int i =10;
//输出至控制台
System.out.println(i);
//异常跳转至errorPage页面
int b = i/0;
//输出至网页
out.write("我是程彪");
%>
<%-- jsp输出表达式 --%>
//java值输出至网页<%=变量名%>
<%=i%>
2、include指令:
网站中的共有页面:头部导航页面,可以将头部导航页面静态导入在其他页面上。
静态导入:导入的jsp文件不会被单独翻译和编译,直接就将导入jsp文件内容直接写入到当前jsp文件中,比较节省内存! (推荐)
@include指令:静态导入 file属性:加载导入的jsp文件,只是将导入的jsp文件内容写进来;
<body>
<%@include file="02_header.jsp"%>
<hr>
<%@include file="02_image.jsp"%>
</body>
3、taglib指令
1、前置部分:
1)导入两个jar包jstl-1.2 ,standard-1.1.2
2)导入核心标签库的路径 <%@taglib prefix="c" uri="核心标签库的网络路径"%>
2、taglib的三个主要标签
c:if标签:类似于Java语言中的if(条件表达式){},但是没有else标签
test:"${变量名(从域对象中获取)并且进行判断}" true,执行c:if标签的文本内容
在el表达式有关键字empty与not empty结合c:if标签使用,判断集合或者实体对象是否空
test:"${empty 变量名}" test:"${not empty 变量名}"
<%
int i=10;
request.setAttribute("i",i);
%>
<c:if test="${i==10}">
<h3>i=10,条件成立</h3>
</c:if>
<c:if test="${i!=15}">
<h3>i!=15,条件成立</h3>
</c:if>
<%
User user = null;
// User user = new User("程彪", "756039065");
request.setAttribute("user",user);
%>
<c:if test="${empty user}">
<h3>user为空</h3>
</c:if>
<c:if test="${not empty user}">
<h3>user不为空</h3>
</c:if>
c:choose:选择判断标签
c:when约等于if/else if或者case
c:otherwise约等于else或者default
<%
int week = 4;
request.setAttribute("week",week);
%>
<c:choose>
<c:when test="${week==1}">
<h4>星期一</h4>
</c:when>
<c:when test="${week==2}">
<h4>星期二</h4>
</c:when>
<c:when test="${week==3}">
<h4>星期三</h4>
</c:when>
<c:when test="${week==4}">
<h4>星期四</h4>
</c:when>
<c:when test="${week==5}">
<h4>星期五</h4>
</c:when>
<c:when test="${week==6}">
<h4>星期六</h4>
</c:when>
<c:when test="${week==7}">
<h4>星期天</h4>
</c:when>
<c:otherwise>
<h4>非法数据</h4>
</c:otherwise>
</c:choose>
c:foreach标签,类似于循环语句 c:foreach的普通用法: begin:开始的index值 默认为0 end:结束的index值 默认为结束位置 step:每次index增加大小 var:代表循环中的变量名 varStatus:循环中的状态属性: 指定属性值 "stataus" ${varStatus的属性值.index}:获取角标值:从0开始 :内置的属性index ${varStatus的属性值.count}:获取序号值 从1开始 :内置属性count c:foreach的特殊用法: var:代表循环中的变量名 items:"${域对象属性名称}"
//普通用法
<c:forEach var="i" step="1" begin="4" end="10" varStatus="status">
${i} ${status.index} ${status.count} ${status.begin}
${status.end} ${status.step} ${status.first} ${status.last}<br>
</c:forEach>
//特殊用法
<c:forEach items="${users}" var="user" varStatus="statu">
${statu.index}--->${statu.count}--->${user}
--->${user.username}--->${user.passwrod}<br>
</c:forEach>
三、Jsp九大内置对象与EL表达式:
1、jsp的9大内置对象:
四大域对象:
PageContext pageContext:当前jsp页面有效
jsp中使用el表达式:pageScope
HttpServletRequest request:在一次请求中有效
jsp中使用el表达式:requestScope
HttpSession session:在一次会话中有效
jsp中使用el表达式:sessionScope
ServletContext application:是全局对象:代表整个web应用程序
jsp中使用el表达式:applicaionScope
其他内置对象:
ServletConfig config:配置对象
JspWriter out(jspWriter extend Writer):字符输出流对象
HttpServletResponse response(响应对象):响应给浏览器内容
Object page(this):代表是当前jsp对象的地址值引用
Throwable t :代表的异常对象
<%
pageContext.setAttribute("name","我是pageContext");
request.setAttribute("name","我是request");
session.setAttribute("name","我是session");
application.setAttribute("name","我是application");
%>
<%out.write("传统方式输出<br>");%>
<%=(String)pageContext.getAttribute("name")%><br>
<%=(String)request.getAttribute("name")%><br>
<%=(String)session.getAttribute("name")%><br>
<%=(String)application.getAttribute("name")%><br>
<hr>
<%out.write("EL方式输出<br>");%>
${pageScope.name}<br>
${requestScope.name}<br>
${sessionScope.name}<br>
${applicationScope.name}<br>
//${域对象属性名称}会自动在四个域中搜索,(从小到大),有对应的内容,就直接获取并输出
${name}
2、EL表达式
就是通过${域对象属性名称.javabean的bean属性}获取内容
bean属性:访问getXxx()--->将get()去掉 X 变成小写
注意:map集合(在jsp中map的key值不能为Integer类型
<%--字符串数据--%>
<%
request.setAttribute("msg","现在是2022.05.26 0:42");
%>
<%=request.getAttribute("msg")%><br>
${msg}<hr>
<%--实体类对象--%>
<%
User user = new User("程彪","756039065");
request.setAttribute("user",user);
%>
<%=(User)request.getAttribute("user")%><br>
<%=((User)request.getAttribute("user")).getUsername()%>---><%=((User)request.getAttribute("user")).getPasswrod()%><br>
${user}<br>
${user.username}--->${user.passwrod}<hr>
<%--list集合数据--%>
<%
User user1 = new User("程彪","756039065");
User user2 = new User("小小","159299548");
ArrayList<User> users = new ArrayList<>();
users.add(user1);
users.add(user2);
request.setAttribute("users",users);
%>
<%=((ArrayList<User>)request.getAttribute("users")).get(0).getUsername()%>---><%=((ArrayList<User>)request.getAttribute("users")).get(0).getPasswrod()%><br>
<%=((ArrayList<User>)request.getAttribute("users")).get(1).getUsername()%>---><%=((ArrayList<User>)request.getAttribute("users")).get(1).getPasswrod()%><br>
${users[0].username}--->${users[0].passwrod}<br>
${users[1].username}--->${users[1].passwrod}<br>
${users[0]}<br> ${users}<hr>
<%--map集合(在jsp中map的key值不能为Integer类型)--%>
<%
Map<String,Long> map = new HashMap<>() ;
map.put("程彪",123L);
map.put("小小",456L);
request.setAttribute("map",map);
%>
<%=((Map<String,Long>)request.getAttribute("map")).get("程彪")%>---><%=((Map<String,Long>)request.getAttribute("map")).get("小小")%><br>
${map["程彪"]}--->${map["小小"]}<hr>
${map}