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>