JavaWeb-JSP三大指令

2020-01-02  本文已影响0人  Tian_Peng

原文链接: http://www.cnblogs.com/xdp-gacl/p/3778993.html

JSP指令简介

JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。
在JSP 2.0规范中共定义了三个指令:

JSP指令的基本语法格式:<%@ 指令 属性名="值" %>
例如:<%@ page contentType="text/html;charset=gb2312"%>
如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写。
例如:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.Date"%>
也可以写作:
<%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>

Page指令

page指令用于定义JSP页面的各种属性。
无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面。
为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。例如:


JSP 2.0规范中定义的page指令的完整语法:

 <%@ page 
      [ language="java" ] 
      [ extends="package.class" ] 
      [ import="{package.class | package.*}, ..." ] 
      [ session="true | false" ] 
      [ buffer="none | 8kb | sizekb" ] 
      [ autoFlush="true | false" ] 
      [ isThreadSafe="true | false" ] 
      [ info="text" ] 
      [ errorPage="relative_url" ] 
      [ isErrorPage="true | false" ] 
      [ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ] 
      [ pageEncoding="characterSet | ISO-8859-1" ] 
      [ isELIgnored="true | false" ] 
 %>
page指令的import属性

在Jsp页面中,Jsp引擎会自动导入下面的包

可以在一条page指令的import属性中引入多个类或包,其中的每个包或类之间使用逗号(,)分隔,例如:

<%@ page import="java.util.*,java.io.*,java.sql.*"%>

上面的语句也可以改写为使用多条page指令的import属性来分别引入各个包或类:

<%@ page import="java.util.Date"%>
<%@ page import="java.io.*" %>
<%@ page import="java.sql.*" %>
page指令的errorPage属性
使用errorPage属性指明出错后跳转的错误页面

比如Test.jsp页面有如下的代码:

<%@ page language="java" import="java.util.*" errorPage="/ErrorPage/error.jsp" pageEncoding="UTF-8"%>
<html>
   <head>
      <title>测试page指令的errorPage属性</title>
   </head>
   <body>
     <%
         //这行代码肯定会出错,因为除数是0,一运行就会抛出异常
         int x = 1/0;
      %>
  </body>
</html>

在Test.jsp中,page指令的errorPage属性指明了出错后跳转到"/ErrorPage/error.jsp",error.jsp页面代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
   <head>
     <title>错误信息友好提示页面</title>
   </head>
   <body>
           对不起,出错了,请联系管理员解决!
   </body>
</html>

运行结果如下:

在web.xml中使用<error-page>标签为整个web应用设置错误处理页面

例如:使用<error-page>标签配置针对404错误的处理页面
web.xml的代码下

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
     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-app_3_0.xsd">
     <display-name></display-name>    
     <welcome-file-list>
         <welcome-file>index.jsp</welcome-file>
     </welcome-file-list>
   
     <!-- 针对404错误的处理页面 -->
     <error-page>
         <error-code>404</error-code>
         <location>/ErrorPage/404Error.jsp</location>
     </error-page>  
</web-app>

404Error.jsp代码如下:

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 <html>
   <head>
     <title>404错误友好提示页面</title>
     <!-- 3秒钟后自动跳转回首页 -->
     <meta http-equiv="refresh" content="3;url=${pageContext.request.contextPath}/index.jsp">
    </head>
    <body>
     <img alt="对不起,你要访问的页面没有找到,请联系管理员处理!" 
     src="${pageContext.request.contextPath}/img/404Error.png"/><br/>
     3秒钟后自动跳转回首页,如果没有跳转,请点击<a href="${pageContext.request.contextPath}/index.jsp">这里</a>
   </body>
 </html>

include指令

在JSP中对于包含有两种语句形式:

@include指令

@include可以包含任意的文件,当然,只是把文件的内容包含进来。
include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入

语法:<%@ include file="relativeURL"%>,其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用。

include指令细节注意问题:

include指令使用范例:
新建head.jspf页面和foot.jspf页面,分别作为jsp页面的头部和尾部,存放于WebRoot下的jspfragments文件夹中,代码如下:
head.jspf代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <h1 style="color:red;">网页头部</h1>

foot.jspf代码:

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <h1 style="color:blue;">网页尾部</h1>

在WebRoot文件夹下创建一个IncludeTagTest.jsp页面,在IncludeTagTest.jsp页面中使用@include指令引入head.jspf页面和foot.jspf页面,代码如下:

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html>
    <head>
        <title>jsp的Include指令测试</title>
    </head>
    
    <body>
       <%@include file="/jspfragments/head.jspf" %>
       <h1>网页主体内容</h1>
       <%@include file="/jspfragments/foot.jspf" %>
   </body>
 </html>

运行结果如下:

jsp:include指令

jsp:include指令为动态包含,如果被包含的页面是JSP,则先处理之后再将结果包含,而如果包含的是非*.jsp文件,则只是把文件内容静态包含进来,功能与@include类似。
写法:

<jsp:include page= "frangmentURL" />

总结:
<@inlcude file =”header.jsp”/>
此时引入的是静态的jsp文件
它将引入的jsp中的源代码原封不动地附加到当前文件中,最终编译成同一个Servlet,所以在jsp程序中使用这个指令的时候file里面的值(即要导入的文件)不能带多余的标签或是与当前jsp文件重复的东西。例如里面不要包含<html><body>这样的标签,因为是把源代码原封不动的附加过来,所以会与当前的jsp中的这样的标签重复导致出错。

<jsp:include page=”/user/test” flush=”true”/>
此时引入执行页面或生成的应答文本
jsp:include标签导入一个重用文件的时候,这个文件是经过编译的,通俗点说就是附加这个要导入文件经过编译后的效果,所以可以含有与当前jsp程序中重复的内容,因为在附加过来之前就会被解析掉。其中flush 表示在读入包含内容之前是否清空任何现有的缓冲区。

taglib指令

在JSP页面中使用第三方的标签库时,需要使用taglib指令来“导包”。
写法:
<%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
其中prefix表示标签的前缀,这个名称可以随便起。
uri是由第三方标签库定义的,所以你需要知道第三方定义的uri。
例如我们引入JSTL标签库:

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ 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" %>
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
<c:set var="ctxStatic" value="${pageContext.request.contextPath}/common"/>
<html>
<head>
    <meta charset="utf-8">
    <title>web-demo</title>
</head>
<body>
<form action="${ctx}/form" method="POST">
    名称:<input type="text" name="name">
    <br/>
    网址:<input type="text" name="url"/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>
上一篇 下一篇

猜你喜欢

热点阅读