4、JSP

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.javaindex_jsp.class

JSP和Servlet的关系

JSP的脚本

一下三个标签中间都可以写java代码,只是当JSP编译为.java文件后,代码存在的位置不同

JSP的常用的指令

JSP的注释

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}

获取值

注意:想要使用el表达式获取数据的话,只能从域对象中获取数据

格式一

${域名称.键名}

域名:

<%
    String name = "jack";
    request.setAttribute("name", name);
%>

${requestScope.name}

格式二

${键名}

<%
  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:是第几个