JSP是什么技术
JSP【Java Server Page】 JAVA 服务页面。
它是从 Servlet 技术规范中分离出来的一个分支,目的是把 Servlet 在视图这一层面的东西给独立出来,从而让 Servlet 只专注于控制。
它本质上是 servlet, 由 WEB CONTAINER 提供的 JSP 引擎来转换,把所有静态的容器转解成打印输出,动态的内容则 java 代码负责处理。这样一来,程序员写 jsp 时,无需写 java 代码,使用标签来代替,静态的内容就是HTML的语法,所以,学习的成本也很低。
JSP 的文件必须放到 /src/main/webapp 下,文件名必须以 .jsp 结尾,整个文件与 HTML 并无太大区别,但需要插入变量,或者动态输出的地方,使用特殊指令 <% … %>
我们来编写一个hello.jsp,内容如下:
<%@ page pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" %>
<html>
<head>
<title>Hello JSP</title>
</head>
<body>
<h2>你好,JSP</h2>
<%
out.println("Hello JSP!"); //在网页上打印输出"Hello JSP!"语句
%>
</body>
</html>
开发 JSP,基本上就是 JSP 指令、标签和HTML的综合体。
静态的部份由 HTML,CSS 负责。
动态的部份由 JSP 指令、标签负责。
JSP 的三大指令
1. page 指令
语法:
<%@ page 属性名=属性值 %>
如:
<%@ page pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" %>
2. taglib 指令
用来导入各种各样的标签库,其中最重要的标签库是 JSTL。
JSTL: Jsp Standard Tag Library [JSP标准标签库], 主要包含如下标签库:
核心标签,以 c 为前缀;
格式化标签,以fmt 为前缀;
sql 标签, 以 sql 为前缀 【已基本不使用】;
xml 标签, 以 xml 为前缀【已基本不使用】;
函数标签, 以fn 为前缀【已基本不使用】。
如:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
3. include 指令
这个指令是用来包含其它的资源进来。
语法:
<%@ include file="被包含的 jsp 路径" %>
JSP 中一早就存在的代码片断和表达式。
代码片断,故明思义,就是在 JSP 中写 Java 代码 【不可取,所以现在已经淘汰】。
语法:
<%
java代码
%>
表达式的语法:<%= java变量 %> 【不可取,所以现在已经淘汰】。
在 JSP 中不去写代码片断,那我们该如何去获取 “动态”的数据?
答案是: 使用标签和 EL 表达式。
JSP 的原理
JSP 本身就是 Servlet。
web 容器在处理 jsp 时,会利用引擎把 jsp 转换成 servlet, 在Tomcat 中,转换出来的 Servlet 存放在 work 目录。
看一看它的继承层次结构:
HttpServlet
HttpJspBase [ Tomcat 容器提供的一个抽象父类]
jsp文件名 [文件名_jsp.java, 如: index_jsp.java]
当我们去访问一个 jsp 资源时,容器会把这个 JSP 进行翻译,翻译成 Servlet 的代码,主要就是执行这个 Servlet 中的 _jspService 方法。
JSP 九大隐式对象
在这个方法,定义了9个局部变量,也就是 JSP 的 九大隐式对象,分别如下:
pageContext =》PageConext
request => HttpServletRequest
session => HttpSession
application => ServletContext
out => JspWriter,类似于 PrintWriter
config => ServletConfig
response => HttpServletResponse
page => this,代表当前的页面对象
exception => Throwable ,代表的是可抛出的对象。
以上九大 JSP 隐式对象中,pageContext 可以获取所有的其它的对象,而如何获取 pageContext 呢?
它是容器自动帮助我们创建好的,直接就可以使用。
如何在 JSP 获取在控制层绑定的对象呢?
通过 EL 表达式来获取 ;
语法:
${KEY}
说明,这个 KEY 就是在控制器绑定的KEY, 默认情况下,EL 表达式的上下文会在四大范围中从小到大
去依次搜索,找到就直接返回,如果都没有,则返回 NULL。
如是你想指定搜索范围,则通过如下四个关键字:
${pageScope.KEY} => 只在 pageContext中搜索
${requestScope.KEY} => 只在 request 中搜索
${sessionScope.KEY} => 只在 session中搜索
${applicationScope.KEY} => 只在application中搜索
在 EL 表达式中,也有一些隐式对象,如:
pageContext 同 JSP 隐式对象
param 相当于获取请求参数
paramValues 相当于获取请求参数
header 相当于获取请求头
headerValues 相当于获取请求头
cookie 相当于获取 cookie 的值
如何取对象的属性值呢?
EL对于遵守 JAVABEAN 规范方法,直接通过 . 获取属性。
如:
${USER_KEY_REQ} ==> 取出来的 User 对象
${USER_KEY_REQ.username} ==> 相当于 [取到的是 user 对象的 username 属性值 ((User)request.getAttribute("USER_KEY_REQ")).getUsername();
${pageContext.request} ==> pageContext.getRequest()
${pageContext.request.contextPath} ==> pageContext.getRequest().getContextPath();
${pageContext.session} ==> pageContext.getSession();
…
注:
${} 表达式中第一个单词只有两种可能
①. KEY 的名字
②. EL 的内置对象【不同的内置,理解是不一样的】
${param.name} ==> request.getParameter(“name”);
注:
EL 表达式中也支持各种运算,如:
, < , ==, !=, <=, >=
empty
not
…
JSTL中的核心标签库
也就是所谓的C标签它是用来处理数据的,比如:迭代、判断、分支。
注:要导入标签库,利用 <%@ taglib %> 指令。
首先,来看一下判断:
<c:if test="判断表达式">
</c:if>
迭代标签:
<c:forEach>
</c:forEach>
分支:
<c:choose>
<c:when test=""> </c:when>
<c:otherwise></c:otherwise>
<c:choose>
原文链接:https://blog.csdn.net/weixin_49770443/article/details/109337189