JavaWeb之JSP
JSP学习
文章目录
1,JSP定义
JSP(全称JavaServer Pages)是由Sun公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。
2,JSP原理
JSP原理:本质是JavaServlet代码
在代码层面上:
打包后仍然是一个index.jsp文件
而在tomcat服务器中,会被转化成一个Java文件,这里以我的路径为例
C:\Users\MACHENIKE.IntelliJIdea2019.3\system\tomcat\Unnamed_JavaWebStudy_2\work\Catalina\localhost\ServletConfig_war\org\apache\jsp
打开Java文件可以发现中含有一个index_jsp类,他继承了HttpJspBase,本质是一个Servlet文件
整体过程分析:
3,JSP语法
3.1,默认产生得JSP代码
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<title>Title</title>
</head>
<body>
</body>
</html>
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
设置为HTML 中文 JAVA语言编码
3.2,脚本片段
<%
out.println("Your IP address is " + request.getRemoteAddr());
%>
我们通常在<% %>中写入java代码,实现脚本片段功能
与其等价得xml代码
<jsp:scriptlet>
代码片段
</jsp:scriptlet>
3.3,JSP声明
<%! declaration; [ declaration; ]+ ... %>
一个声明语句可以声明一个或多个变量、方法,供后面的Java代码使用。在JSP文件中,您必须先声明这些变量和方法然后才能使用它们。
等价XML代码:
<jsp:declaration>
代码片段
</jsp:declaration>
3.4,JSP表达式
<%= 表达式 %>
<p>
今天的日期是: <%= (new java.util.Date()).toLocaleString()%>
</p>
表达式的值会被转化为String,可以被放在HTML标签中
3.5,JSP注释
<%-- 注释 --%>
JSP注释,注释内容不会被发送至浏览器甚至不会被编译
HTML注释,通过浏览器查看网页源代码时可以看见注释内容
3.6,JSP指令
JSP指令用来设置与整个JSP页面相关的属性。
<%@ directive attribute="value" %>
<%@ page ... %>
定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include ... %>
包含其他文件
<%@ taglib ... %>
引入标签库的定义,可以是自定义标签
应用1:定制ErrorPage ,这里相当于自定义了当前JSP的500错误画面
<%@page errorPage="MyFirstJSP.jsp" %>
当然我们也可以在WEB.xml中进行错误页面的配置
error-code:错误代码
location:错误页面位置
<error-page>
<error-code>404</error-code>
<location></location>
</error-page>
应用2:实现多JSP页面的拼接,可以多页面中部分元素的复用
<%@ include file="head.jsp"%>
<p>BODY</p>
<%@include file="foot.jsp"%>
通过发现源代码,我们可以发现,这种方式的本质是把两个页面完全合二为一了
当然我们也可以通过另一种方法实现JSP标签
<jsp:include page="head.jsp"/>
<p>BODY</p>
<jsp:include page="foot.jsp"/>
实现效果是相同的,但是本质却不一样
合并后本质仍然是三个页面,三个页面的变量互不影响
3.7,JSP行为
JSP行为标签使用XML语法结构来控制servlet引擎。它能够动态插入一个文件,重用JavaBean组件,引导用户去另一个页面,为Java插件产生相关的HTML等等。
JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,set和get方法获取。
JSP行为标签与JavaBean的使用:
jsp:useBean 寻找和初始化一个JavaBean组件
jsp:setProperty 设置JavaBean的值
jsp:getProperty 将 JavaBean组件的值插入到 output中
这种实现方式相当于对一个实体类进行get/set操作
JSP行为标签实现页面转发:
jsp:forward:从一个JSP文件向另一个文件传递一个包含用户请求的request对象
3.8,JSP隐藏对象
request:HttpServletRequest类的实例
response:HttpServletResponse类的实例
out: PrintWriter类的实例,用于把结果输出至网页上
session:HttpSession类的实例
application:ServletContext类的实例,与应用上下文有关
config:ServletConfig类的实例
pageContext:PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问
page:类似于Java类中的this关键字
Exception:Exception类的对象,代表发生错误的JSP页面中对应的异常对象
3.9,控制与判断
基本在<%%>中的写法是和Java代码相同,但可以和HTML标签组合,变得灵活(例如在两个<%%>中插入HTML标签,从而实现标签的循环显示等等)
4,WEB作用域(scope)详解
5,JSTL
5.1,EL表达式
5.1.1,导入Maven依赖
dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
5.1.2,EL基本
${表达式}
- JSP EL允许您指定一个表达式来表示属性值。
- JSP EL 计算这个表达式,并且产生一个替代品来代替表达式的值。
5.1.3,EL通用操作符
.
和[]
这两个操作符允许您通过内嵌的JSP对象访问各种各样的JavaBean属性。
EL中的基础运算符支持Java中绝大多数运算符
5.1.4,EL函数
JSP EL允许您在表达式中使用函数。这些函数必须被定义在自定义标签库中。函数的使用语法如下:
${ns:func(param1, param2, ...)}
ns指的是命名空间(namespace),func指的是函数的名称,param1指的是第一个参数,param2指的是第二个参数
这一块主要搭配JSTL使用
5.1.5,EL隐含对象
这一点和JSP相同,EL具有11个隐藏对象,可以方便我们实现很多功能
pageScope: page 作用域
requestScope: request 作用域
sessionScope: session 作用域
applicationScope: application 作用域
这四个主要用于获取不同作用域中的数据,当我们不指定作用域时,它会按在顺序不断往上找,直到找不到,返回为空
param: Request 对象的参数,字符串
paramValues : Request对象的参数,字符串集合
这两个主要用来获取,前端传来的参数
initParam: 上下文初始化参数
cookie: Cookie值
pageContext : 当前页面的pageContext,我们可以通过pageContext访问到当前页面的各个元素,相当于我们可以利用这个隐藏对象,获取JSP的各个隐藏对象
header: HTTP 信息头,字符串
headerValues: HTTP 信息头,字符串集合
5.2,JSTL标签
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL弥补HTML标签在JSP中不足
5.2.1,导包Again
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
5.2.1,核心标签举例
导入核心标签库:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
核心标签是最常用的 JSTL标签
这里举几个例子,反正用的时候直接查就行
<%--用于在JSP中显示数据,就像<%= ... >--%>
<c:out value="data"/>
<%--设置变量,执行if语句--%>
<c:set var="salary" scope="session" value="${2000*2}"/>
<c:if test="${salary > 2000}">
<p>我的工资为: <c:out value="${salary}"/><p>
</c:if>
<%--Swich case类型--%>
<c:choose>
<c:when test="<boolean>">
...
</c:when>
<c:when test="<boolean>">
...
</c:when>
...
...
<c:otherwise>
...
</c:otherwise>
</c:choose>
<%--循环迭代--%>
<c:forEach var="i" begin="1" end="5">
Item <c:out value="${i}"/><p>
</c:forEach>