JSP指令
JSP页面中的指令是JSP页面通知引擎如何处理自己的信息
语法格式:
<%@ directive attribute = "value" %>
指令可以有很多个属性,它们以键值对的形式存在,并用逗号隔开
JSP三大指令:
指令 |
描述 |
<%@ page ... %> |
定义网页的依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include ... %> |
包含其他文件,可以调用其他文件 |
<%@ taglib ... %> |
引入标签库的定义,用来定义标签 |
Page指令:
一个JSP页面可以包含多个page指令。
<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false" pageEncoding="utf-8" import="java.util.*,java.io.*" language="java" %>
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ page language="java" %>
<%@ page import="java.util.*,java.io.*"%>
<%@ page import="java.jdbc.*"%>
Page指令相关属性(来源于网络):
属性 |
描述 |
buffer |
指定out对象使用缓冲区的大小 |
autoFlush |
控制out对象的 缓存区 |
contentType |
指定当前JSP页面的MIME类型和字符编码 |
errorPage |
指定当JSP页面发生异常时需要转向的错误处理页面 |
isErrorPage |
指定当前页面是否可以作为另一个JSP页面的错误处理页面 |
extends |
指定servlet从哪一个类继承 |
import |
导入要使用的Java类 |
info |
定义JSP页面的描述信息 |
isThreadSafe |
指定对JSP页面的访问是否为线程安全 |
language |
定义JSP页面所用的脚本语言,默认是Java |
session |
指定JSP页面是否使用session |
isELIgnored |
指定是否执行EL表达式 |
isScriptingEnabled |
确定脚本元素能否被使用 |
include指令
主要用于静态包含其它jsp页面,通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。
两种写法:
<%@ include file="relative url" %>
<jsp:directive.include file="relative url" />
现在,我们对上面这两个指令进行一个综合的案例,进行综合的运用
首先,我们建立三个简单jsp文件,在通过一个jsp文件运用include进行调用
main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>全民制作人</title>
</head>
<body>
个人练习生
</body>
</html>
header.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>偶像练习生</title>
</head>
<body>
蔡徐坤
</body>
</html>
footer.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
鸡你太美!!!
</body>
</html>
上面的这三个示例中,page指令起到了配置属性的作用,具体的各个属性大家看上面的属性表,接下来我们创建一个include指令的对象,看看它具体怎么运作
incExample.jsp
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" language="java" %>
<html>
<head>
<title>鸡你太美!!</title>
</head>
<body>
<%@include file="main.jsp"%>
<%@include file="header.jsp"%>
<%@include file="footer.jsp"%>
</body>
</html>
include对象将上面的jsp文件导入进来,这就有点类似于HTML里的href属性
接下来我们了解一下taglib指令
taglib指令
首先JSP是允许用户自定义标签,一个自定义标签库就是自定义标签的集合。Taglib指令可以引入一个自定义标签集合的定义,包括库路径、自定义标签。
比如,我们现在来定义一个属于自己的标签,需要对这个标签进行配置属性,来完成自己想要的功能
<aaa></aaa>
实现功能的类,我们用java来定义
mytag.java(碰到起始标签显示表格的处理类)
重写四个事件处理方法
doStartTag() 当碰到配置的起始标签时执行
doEndTag() 当碰到配置的结束标签时执行
doAfterBody() 当解析完标签体时执行
package edu.xalead.tag;
import javax.servlet.ServletContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
public class mytag extends BodyTagSupport {
public String getColor() {
return color;
}
public void setColor(String color){
this.color = color;
}
private String color = "white";
@Override
public int doStartTag() throws JspException {
try {
//先要拿到ServletContext
ServletContext servletContext = pageContext.getRequest().getServletContext();
//先取出离线集
ArrayList<ArrayList<String>> table = (ArrayList<ArrayList<String>>)servletContext.getAttribute("table");
//渲染成表格输出
//取输出字符流
JspWriter pw = pageContext.getOut();
pw.println("<table border='1' bgcolor='" + color + "'>");
pw.println("<th>");
pw.println("empno");
pw.println("</th>");
pw.println("<th>");
pw.println("ename");
pw.println("</th>");
pw.println("<th>");
pw.println("job");
pw.println("</th>");
pw.println("<th>");
pw.println("mgr");
pw.println("</th>");
pw.println("<th>");
pw.println("hiredate");
pw.println("</th>");
pw.println("<th>");
pw.println("salary");
pw.println("</th>");
pw.println("<th>");
pw.println("comm");
pw.println("</th>");
pw.println("<th>");
pw.println("deptno");
pw.println("</th>");
for(int i=0;i<table.size();i++){
pw.println("<tr>");
ArrayList<String> row = table.get(i);
for(int j = 0 ; j < row.size() ; j++){
pw.println("<td>");
pw.println(row.get(j));
pw.println("</td>");
}
pw.println("</tr>");
}
pw.println("</table>");
} catch (IOException e) {
e.printStackTrace();
}
return BodyTagSupport.SKIP_BODY;
}
@Override
public int doEndTag() throws JspException {
return super.doEndTag();
}
@Override
public int doAfterBody() throws JspException {
return super.doAfterBody();
}
}
编写标签库描述文件(my.tld)
这个文件描述了什么名字的标签,由哪个处理类来处理,文件扩展名默认.tld,可以默认放到WEB-INF目录下
<?xml version="1.0" encoding="ISO-8859-1"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>my</short-name>
<uri>http://edu.xalead.tag</uri>
<tag>
<name>aaa</name>
<tag-class>edu.xalead.tag.mytag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>color</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
在应用自定义标签的页面中引用(taglib处理指令)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="my" uri="/WEB-INF/my.tld"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%-- aaaa标签在页面中显示一个context中的table属性的表格 --%>
<my:aaa color = "green">鸡你太美!!!</my:aaa>
</body>
</html>