JSP #
JSP(全称JavaServer Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。
JSP里面既可以写Java代码,也可以写HTML标签,JSP = Java + HTML
技术特点 #
JSP 和 Servlet 是本质相同的技术。当一个 JSP 文件第一次被请求时,JSP 引擎会将该 JSP编译成一个 Servlet,并执行这个 Servlet。
如果 JSP 文件被修改了,那么 JSP 引擎会重新编译这个 JSP。
JSP 引擎对 JSP 编译时会生成两个文件分别是.java的源文件以及编译后的.class文件,并放到Tomcat/work/Catalina下对应的虚拟主机目录(例如localhost)中的 org/apache/jsp目录中。两个文件的名称会使用 JSP 的名称加_jsp表示。如:index_jsp.java、index_jsp.class。
JSP和Servlet的关系 #
- JSP以源文件的形式部署到容器中,而Servlet需要编译成
.class字节码文件部署到容器中 - JSP部署到Web项目的根目录或根目录下的其他子目录,和静态资源位于相同的位置;而Servlet需要部署到
WEB-INF/classes目录中 - JSP中的HTML代码会被JSP引擎放入Servlet的
out.write()方法中;而在Servlet中我们需要自己通过对字符流、输出流的操作生成响应的页面 - JSP更擅长页面显示、Servlet更擅长逻辑控制
JSP的脚本 #
一下三个标签中间都可以写java代码,只是当JSP编译为.java文件后,代码存在的位置不同
<%! 代码 %>(声明标签):声明成员变量和成员方法,中间的内容会出现在编译后的Servlet的Class的{}中<% 代码 %>(脚本标签):会出现在service方法体的内部。<%= 代码 %>(赋值标签):标签中的内容会出现在out.printf()方法的参数中,会输出到页面上。
JSP的常用的指令 #
- 作用
- 对jsp进行配置、导入一些资源
- 格式
<%@指令名称 属性名1=属性值1 属性名2=属性值2 %>
- 常见指令名称
page:主要是用来对jsp进行配置contentType:是jsp翻译成servlet之后,所设置响应头,该响应头是指服务器告诉浏览器相应数据的类型和编码是什么。pageEncoding:是指jsp翻译sevlet的时候,所使用的编码import:导入包errorPage:如果该jsp页面出现了错误,会跳转到指定的错误页面isErrorPage:默认值为false,如果为false,那该jsp翻译成的servlet里面就没有exception对象;如果为true,那该jsp翻译成的servlet里面就会自动生成一个exception对象。include:可以用来包含其他的页面- 静态包含:
<%@include file="其他的页面"%>,会将两个页面合并成一个,生成servlet - 动态包含:
<jsp:include page="demo4.jsp"/>,每一个页面都会生成各自的servlet - 推荐使用静态包含
- 静态包含:
JSP的注释 #
- 原生HTML的注释
<!-- abc -->- 在JSP翻译成的servlet中是存在的
- JSP特有的注释**(推荐)**
<%-- abc --%>- 在jsp翻译成的servlet中是不存在的
JSP的九大内置对象 #
内置对象:不能自己创建,直接在JSP页面中使用实例名称调用即可
| 实例的名称 | Java类型 | 作用 |
|---|---|---|
| pageContext | PageContext | 四大域对象之一,代表的范围是当前jsp页面,可以实现数据的共享 |
| session | HttpSession | 四大域对象之一,代表的范围是一次会话,可以实现数据的共享 |
| request | HttpServletRequest | 四大域对象之一,代表的范围是一次请求,可以实现数据的共享 |
| application | ServletContext | 四大域对象之一,代表的范围是整个项目,可以实现数据的共享 |
| response | HttpServletResponse | 响应对象,可以用来设置响应头,响应状态码,可以实现重定向 |
| config | ServletConfig | servlet的配置对象,可以配置一些信息 |
| out | JspWriter | 输出流,向页面写东西。和PrintWrite的功能类似 |
| page | Object | 是指jsp编译成servlet的servlet对象 |
| exception | Throwable | 异常对象,可以打印一些异常信息 |
EL表达式 #
**EL(Expression Language)**表达式语言。 目的:为了替换Java代码,使JSP写起来更加简单,简化取值过程
El表达式的格式:${表达式}
注意,如果使用Tomcat作为部署容器,Tomcat已经集成了EL,而JSP在构建阶段(mvn clean package)是不会被编译的,所以使用Tomcat作为部署容器时,不需要加入EL表达式的依赖
运算符 #
格式:${运算符}
算术运算符:+、-、*、/
逻辑运算符:&&(and)、||(or)、!(not)
比较运算符:>、<、>=、<=、==
空运算符:empty
判断数组、字符串、集合的内容,是否为空,是否为null,长度为是否0
//判断是否为空
${empty xxx}
//判断是否不为空
${!empty xxx}
注意:如果我们想要在页面上显示的内容就是${1+1}
- 方案一:
\${1+1} - 方案二:在page指令中写一个属性:
isELIgnored="true"忽略该页面中的所有的EL表达式
获取值 #
注意:想要使用el表达式获取数据的话,只能从域对象中获取数据
格式一 #
${域名称.键名}
域名:
- pageContext:pageScope
- request:requestScope
- session:sessionScope
- application:applicationScope
<%
String name = "jack";
request.setAttribute("name", name);
%>
${requestScope.name}
格式二 #
${键名}
- 根据域的范围大小,由小到大进行查找,直到每一个域中都不存在,就不会展示,如果找到了就直接展
- pageScope < requestScope < sessionScope < applicationScope
<%
String name = "jack";
request.setAttribute("name", name);
%>
${name}
获取对象中的数据 #
普通对象 #
${对象名.对象属性名}
例如
<%
User user = new User();
user.setName("tom");
user.setAge(18);
request.setAttribute("user", user);
%>
${user.name}
${user.age }
集合对象 #
单列集合 #
${键名[索引]}
例子:List类
<%
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
pageContext.setAttribute("list", list);
%>
${list[0] }
${list[1] }
${list[2] }
双列集合 #
方法一:${域中的键名.map中键名}
方法二:${键名['map中键名']}
例子:Map类
<%
Map map = new HashMap();
map.put("name", "jerry");
map.put("age", 18);
application.setAttribute("map", map);
%>
${map.name }
${map.age }
${map['name'] }
${map['age'] }
获取当前项目的虚拟目录 #
el表达式里面有很多隐式对象,但是我们只需要知道一个即可:pageContext
pageContext隐式对象可以获取到其他的8个内置对象
格式:${pageContext.request.contextPath}
JSTL标签库 #
JSTL(Java server pages standarded tag library,即JSP标准标签库)是由JCP(Java community Proces)所制定的标准规范,它主要提供给Java Web开发人员一个标准通用的标签库,并由Apache的Jakarta小组来维护。开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度
优点 #
1、提供一组标准标签
2、可用于编写动态JSP页面
引入JSTL标签库 #
引入JSTL依赖
<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
在JSP页面添加taglib指令
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
常用标签 #
if:判断 #
格式:
<c:if test=""></c:if>
1、test为判断部分,需要写成el表达式
choose-when-otherwise #
格式:
<c:choose>
<c:when test="情况一">
情况一处理
</c:when>
<c:when test="情况二">
情况二处理
</c:when>
<c:otherwise>
其他情况处理
</c:otherwise>
</c:choose>
foreach:循环 #
格式:
<c:forEach
begin="1"
end="5"
step="1"
var="a"
varStatus="s"
items="">
${a }...${s.index }...${s.count }
</c:forEach>
1. begin:起始索引
2. end:结束索引
3. step:步数(每次循环索引加几)
4. items:要遍历的容器对象
5. var:容器中的元素
6. varStatus:容器中的元素对象对应的状态,该状态有两个参数,index:索引;count:是第几个