JSP 是什么

全称: java server page , java 服务器的页面。

  • 本质上还是一个 servlet。这里就看看他的原理部分,是怎么运作的:

    浏览器请求一个 .jsp 的页面时,

    服务器这边,会将 .jsp 文件,编译成 .java 文件和 .class 文件。

    然后就可以 .class 文件被虚拟机加载就可以用了。

    比如:

    在 idea 里实验 out 文件夹找不到输入文件,

    在 tomcat 的安装目录试就行了,webapps 目录下,一个文件夹,就是一个新项目,

    然后去 work 文件夹里找工作产生的文件

  • 那些网页显示的静态画面,就是通过 out 对象,输出出来。

JSP 的书写格式

<%--  声明标签      <%!变量或者方法声明%>                                       --%>
<%--  表达式标签    <%= 表达式%>       在页面上显示的效果                        --%>
<%--  程序代码标签  <%java代码%>       页面上动态展示内容                        --%>

  <%! String str = "test 中文";%>
  str = <%= str + " appendStr"%>

  <%
	request.setAttribute("request-key", "req-value");
  %>

<!-- 可写 html 的注释,查看源码时可见 -->
<%-- 可写 jsp 的注释, 查看源码时不可见 --%>

9 大内置对象

jsp 里不需要导包,直接拿来就可以用的对象。

request、resposne、session、application、pageContext、page、config、out、exception

  • 看个图,看看他们都是怎么赋值的:

  • 常用的也就那么几个,注意他们的作用域范围:

    request : 只针对单个请求有效。

    session : 为每个用户创建一个 session, 针对用户有效。

    application : 保存在 服务器端 的信息。 可以做有多少访客这个功能。

    pageContext : 对当前页面有效。

  • 理解下 page、exception 对象,虽然不怎么用。。

    page 就是指当前的 jsp, 类似于 java 里的 this 指针。

    exception : 需要和 @page 指令里的 isErrorPage = “true”, errorPage=“xxx.jsp” 结合使用。

    比如:

    index.jsp 里的 @page 指令内容:

    <%@ page pageEncoding="utf-8" 
        errorPage="error.jsp" 
        contentType="text/html;charset=UTF-8" l
        anguage="java" %>
    

    在 error.jsp 里的 @page 指令内容:

    <%@ page language="java" 
        isErrorPage="true" 
        import="java.util.*" 
        pageEncoding="UTF-8"%>
    

    然后就可以在 error.jsp 使用 exception 对象了。。。 但也没什么用,一般就 getMessage() 一下。。。

3 大指令

  • page 指令。

    定义一些关于页面的属性。

    比如:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ page import="java.util.ArrayList" %>
    
  • include 指令

    主要就是在 jsp 页面,引入另外的页面来用。

    比如:

    <%@ include file="bottom.jsp" %>  <!-- 写在  body 里面的 -->
    
  • taglib 指令。

    主要配和 jstl (需要用相应的 2 个 jar 包)来使用,配置一些相关定义。

    比如:

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    <%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
    

EL 表达式

全称: expression language , 表达式语言。

之前在 jstl 中, 在 JSP2.0 中, 从 jstl 抽取出来了,放在 JSP 的规范里。

主要式用来显示动态数据的。 格式 : ${ 要显示的变量名 } , 这样比 使用 <%= %> 简洁、方便很多。

注意: EL 是用来获取数据的,前提是要有数据。 没有数据可以先在相应的作用域 setAttribute( ) 存储下。

如果作用域里有相同的 key 名时,

比如:

<%
    request.setAttribute("key", "req-value");
    session.setAttribute("key", "session-value");
    application.setAttribute("key", "application-value");
    pageContext.setAttribute("key", "pageContext-value");
%>

${key}

这样在获取 key 的值时, 查找的顺序是: page、request、session、application。

JSTL

全称:Java server pages standarded tag library, jsp 的标准标签库。

一般比较常用的就是 核心标签 : <%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core”%>, 这里 prefix 前缀取得名字可以随便写,之后的代码里也相应的变一下就好了,但一般都是取 c 这个前缀。

core 核心标签,主要有:

  • 表达式操作 out、set、remove、catch
  • 流程控制 if、choose、when、otherwise
  • 迭代操作 forEach、forTokens
  • URL操作 import、param、url、redirect
  • Set标签 <c:set> 主要用来将变量存储至JSP范围中 或是JavaBean的属性或Map对象中

示例: 常用的还是 if、forEach 标签。。。

<body>

<h1>before delete ...</h1>
<c:set value="c-set-value" var="str" scope="request"></c:set>
str --> ${str} <br>
str -->  <c:out value="${str}"></c:out>

<c:remove var="str" scope="request"></c:remove>
<h1>after delete ...</h1>
str --> ${str} <br>
str --> <c:out value="${str}"></c:out>

<hr>
<h1>if...</h1>
<c:set var="age" value="23" scope="request"></c:set>
<c:if test="${age>18 && age <30}">
    青年。。。
</c:if>

<h1>choose...</h1>
<c:choose>
    <c:when test="${age<18}">
        未成年。。。
    </c:when>
    <c:when test="${age<30}">
        青年人。。。
    </c:when>
    <c:otherwise>
        其他情况。。。
    </c:otherwise>
</c:choose>


<hr>

<h1>list</h1>

<%
    ArrayList arrayList = new ArrayList();
    arrayList.add("this is a list...");
    arrayList.add(100);
    arrayList.add(new Object());
    request.setAttribute("list", arrayList);
%>

<c:forEach items="${list}" var="element" varStatus="sta">
    varStatus -- >  ${sta}<br>
    varStatus.count -- >  ${sta.count}<br>
    varStatus.index -- >  ${sta.index}<br>
    element -- >  ${element}<br>
</c:forEach>


</body>