JavaEE 中的 JSP
JSP 页面是动态页面,html 页面是静态页面。
因为 servlet不方便展示信息,所以后来就有了 jsp,即:在html中添加java代码。其本质就是servlet。
JSP 书写规范
声明标签 <%!变量或者⽅法声明%>
<%! %> 会定义到 server() 方法之外,其中定义的方法通常要被<% %>调用
程序代码标签 <%java代码%>
<% %>中的代码会被嵌入到 JSP 的 server() 方法中,会在page渲染时候执行
表达式标签 <%= 表达式%>
JSP 中的注释
Jsp 文件中的注释有两种: 第一种是html注释:<!-- 注释信息 -->
;第二种是jsp界面的注释:<%-- 注释信息 --%>
;
JSP的内置对象
jsp的内置对象有9个:request, response, session, application, pageContext, out, config, page, exception
jsp的内置对象 | 注释 |
---|---|
page | JSP界面本身,约等于this |
request | 一次请求 |
response | 对于请求的响应 |
pageContext | 同一个页面 |
session | 多次对话 (比如:换个浏览器就超出范围了) |
application | 与服务器同寿(可以说是全局变量了) |
out | 输出 <% out.print("<script>alert('success');</script>") %> |
config | 获取初始化参数 <% config.getInitParameter("x") %> |
exception | 异常 exception=<%=exception.getMessage() %> |
正常情况下,JSP无法识别 exception。 需要在设置 page 的位置添加一条属性 isErrorPage="true"
<%@ page pageEncoding="UTF-8" language="java"
isErrorPage="true"
import="java.util.*" %>
jsp的作⽤域:
pageContext -> request -> session -> application
JSP的指令
- page
定义JSP网页的依赖属性,如脚本语言、缓存需求、error界面等
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
- include
包含其他文件
<%@ include file="/hello.jsp" %>
- taglib
引入标签库定义
// 常用的
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %>
<%@ taglib prefix="logic" uri="http://struts.apache.org/tags-logic" %>
<%@ taglib prefix="ec" uri="http://www.extremecomponents.org" %>
// 自定义
<%@ taglib uri="/WEB-INF/myTags.tld" prefix="myTag" %>
如果是自定义的 taglib,使用时还需要另外在 web.xml 中定义一下映射为路径否则uri中的路径标红,找不到路径。完整添加方法如下:
自定义 tag 方法:
package tags;
public class TagHandler extends TagSupport {
@Override
public int doStartTag() throws JspException {
JspWriter out = pageContext.getOut();
try {
out.println(Calendar.getInstance().getTime());
} catch (IOException e) {
e.printStackTrace();
}
return SKIP_BODY;
}
}
在 web 下的 WEB-INF 文件中添加 myTag.tld 文件, 下面一段代码加在</taglib>
之前
<tag>
<name>currentDate</name>
<tag-class>tools.TagHandler</tag-class>
<body-content>scriptless</body-content>
</tag>
此时,在intellij 编写,我直接在JSP中直接去添加 tag 标签,uri中填写的路径找不到的。查了一些资料后我发现还需要再 web.xml中加一条配置语句
<jsp-config>
<taglib>
<taglib-uri>tags.TagHandler</taglib-uri>
<taglib-location>/WEB-INF/myTags.tld</taglib-location>
</taglib>
</jsp-config>
这时候在jsp中就可以使用了
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="myTag" uri="/WEB-INF/myTags.tld"%>
<html>
<head>
<title>tagPage</title>
</head>
<body>
JSP page.jsp
<br>
<myTag:currentDate/>
</body>
</html>
现在运行 tomcat 就能看到结果了。
EL表达式
EL 全称为 Expression Language
${}
注意:
如果 想要在 ${}
中获取变量值,那么这个变量需要设置在作用域中
<%
pageContext.setAttribute("test", "value in pageContext");
request.setAttribute("test", "value in request");
session.setAttribute("test", "value in session");
application.setAttribute("test", "value in application");
%>
如果存在同名变量在不同作用域下都有定义,那么作用域小的会有限被选择。
此时不妨结合tag一起使用
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="myTag" uri="/WEB-INF/myTags.tld"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>JSPPage</title>
</head>
<body>
JSP page.jsp
<br>
<myTag:currentDate/>
<br>
<% pageContext.setAttribute("currentDate", new Date()); %>
<fmt:formatDate value="${currentDate}" pattern="dd-MMM-yyyy" var="today"/>
${today}
<br>
<%
List<String> list = new ArrayList<>();
list.add("abc");
list.add("123");
list.add("haha");
pageContext.setAttribute("list", list);
%>
<br>
<c:forEach items="${list}" var="element" varStatus="sta">
<%-- <c:out value="${element}"></c:out><br>--%>
line number: ${sta.count} / index: ${sta.index} -> ${element} <br>
</c:forEach>
<br>
<c:choose>
<c:when test='${"abc1" == list.get(0)}'>
list.get(0) = abc
</c:when>
<c:otherwise>
list.get(0) != abc1
</c:otherwise>
</c:choose>
</body>
</html>
输出结果