JSP六大标识详解

未经博主允许,请勿转载。转载请注明出处:https://blog.csdn.net/weixin_42512488/article/details/85534690
知识图谱:
在这里插入图片描述
一、JSP页面的基本构成

<!-- JSP中的指令标识 -->
<%@ page language="java" contentType="text/html; charset=gb2312" %>
<%@ page import="java.util.Date" %>
<!-- HTML标记语言 -->
<html>
  <head><title>JSP页面的基本构成</title></head>
  <body>
   <center>
<!-- 嵌入的Java代码 -->
    <% String today=new Date().toLocaleString(); %>
<!-- JSP表达式 -->
    今天是:<%=today%>
<!-- HTML标记语言 -->
   </center>
  </body>
</html>

注:这只是jsp页面的基本构成,我认为JSP页面是由HTML+六大标识构成的。


二、JSP指令标识

指令标识在客户端是不可见的, 在之前写服务器的文章中, 我就强调过, 服务器的一大功能就是执行浏览器请求的动态页面, 比如ASP页面, JSP页面。然后最终是生成HTML页面,再返回给浏览器。 所以我们可知, 像这些个标识, 最终都是被服务器解释执行的。通过指令标识可以使服务器按照指令的设置来执行动作和设置在整个JSP页面范围内有效的属性。

<%@ page
          [ language="java" ]
          [ contentType="mimeType;charset=CHARSET" ]
          [ import="{package.class|pageage.*},…" ]
          [ extends="package.class" ]
          [ session="true|false" ]
          [ buffer="none|8kb|size kb ]
          [ autoFlush="true|false" ]
          [ isThreadSafe="true|false" ]
          [ info="text" ]
          [ errorPage="relativeURL" ]
          [ isErrorPage="true|false" ]
          [ isELIgnored="true|false" ]
          [ pageEncoding="CHARSET" ]
%>

1.page指令
page指令从字面意思上,就可以知道,指的是页面属性的设置。可以定义在整个JSP页面范围内的有效属性。习惯放在文件的开始部分,但是它本身是可以放在任意行的。语法如下:

<%@ page attribute1=“value1” attribute2=“value2” … %>

page指令的重点在于它的众多属性们,下面进行一一介绍。


  • language属性:
    设置编写当前页面所使用的语言,默认是Java,也只能是Java。从此处可以看出,当年设计JSP技术的人,野心很大。他可能希望其他语言,像C、C++啊这些都能编写JSP。

    <%@ page language=“java” %>

  • contentType属性:
    在页面中正确设置当前页面响应的MIME类型

    MIME(多用途互联网邮件扩展),它是一个互联网标准,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。服务器会将它们发送的多媒体数据的类型告诉浏览器,而通知手段就是说明该多媒体数据的MIME类型,从而让浏览器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等。服务器将MIME标志符放入传送的数据中来告诉浏览器使用哪种插件读取相关文件。

    <%@ page contentType=“text/html;charset=utf-8” %> //在页面中正确设置当前页面响应的MIME类型为text/html
    <% @ page contentType=“application/msword” %> //在当前页面中设置响应的MIME类型是Microsoft Word文件

  • import属性:
    import属性类似于Java中的import语句,用来向JSP文件中导入需要用到的包。包名后千万不要加;号,不然会报错。 在JSP中默认导入了java.lang.*、javax.servlet.*、javax.servlet.jsp.*、java.servlet.http.*

    <%@ page import=“java.util."%>
    <%@ page import="java.text.
    ” %>
    或者通过逗号间隔,来导入多个包。
    <%@ page import=“java.util.*,java.text.*” %>

  • extends属性:
    extends属性用于指定将一个JSP页面转换为Servlet后继承的类。在JSP中通常不会设置该属性,JSP容器会提供继承的父类。如果设置了该属性,一些改动会影响JSP的编译能力。

  • session属性:
    该属性默认值为true,表示当前页面支持session,设为false表示不支持session

  • buffer属性:
    该属性用来设置out对象(JspWriter类对象)使用的缓冲区的大小。 若设置为none,表示不使用缓存,而直接通过PrintWriter对象进行输出;如果将该属性指定为数值,则输出缓冲区的大小不应小于该值,默认值为8KB(因不同的服务器而不同,但大多数情况下都为8KB)

  • autoFlush属性:
    该属性默认值为true,表示当缓冲区已满时,自动将其中的内容输出到客户端。
    如果设为false,则当缓冲区中的内容超出其设置的大小时,会产生“JSP Buffer overflow”溢出异常。

  • isThreadSafe属性:

    该属性默认值为true,表示当前JSP页面被转换为Servlet后,会以多线程的方式来处理来自多个用户的请求;如果设为false,则转换后的Servlet会实现SigleThreadModel接口,该Servlet将以单线程的方式来处理用户请求,即其他请求必须等待直到前一个请求处理结束
    本质是:CPU使用权切换还是后续用户排队

  • info属性:
    info属性:该属性可设置为任意字符串,如当前页面的作者或其他有关的页面信息。可通过Servlet.getServletInfo()方法来获取设置的字符串。

    <%@ page info="This is index.jsp!" %>
    <%=this.getServletInfo()%>
    

    访问页面后,将显示:This is index.jsp!
    说明:当JSP页面被转译成Java文件时,转译成的类是Servlet的一个子类,所以在JSP页面中可以使用Servlet类的方法: getServletInfo()

  • errorPage属性:
    该属性用来指定一个当前页面出现异常时所要调用的页面。如果属性值是以“/“开头的路径,则将在当前应用程序的根目录下查找文件;否则,将在当前页面的目录下查找文件

  • isErrorPage属性:
    isErrorPage属性:将该属性值设为true,此时在当前页面中可以使用exception异常对象
    若在其他页面中通过errorPage属性指定了该页面,则当前者出现异常时,会跳转到该页面,并可在该页面中通exception对象输出错误信息。相反,如果将该属性设置为false,则在当前页面中不能使用exception对象。该属性默认值为false

    案例:

    <%@ page contentType="text/html;charset=utf-8" errorPage="show.jsp"%>
    <%
    	String name ="JONCY";
    	Integer.parseInt(name);
    %>
    
    <%@ page contentType="text/html;charset=utf-8" isErrorPage="true" %>
    出现错误,错误如下:<br>
    <%=exception.getMessage()%>
    

    运行结果:
    在这里插入图片描述

  • isELIgnored属性:
    其值只能为true或false。设为true,则忽略表达式语言。

  • pageEncoding属性:
    该属性用来设置JSP页面字符的编码。默认值为ISO-8859-1


2.include指令:该指令用于在当前的JSP页面中,在当前使用该指令的位置嵌入其他的文件, 如果被包含的文件中有可执行的代码,则显示代码执行后的结果。 千万注意 被包含文件和包含文件的page指令属性要相同。因为两者最终要合成为一个文件 使用include指令引用外部文件,可以减少代码的冗余。

<%@ include file=“文件的绝对路径或相对路径” %>



3.taglib指令:在JSP页面中,可以直接使用JSP提供的一些动作元素标识来完成特定功能,如使用包含一个文件 通过使用taglib指令,开发者就可以在页面中使用这些基本标识或自定义的标识来完成特殊的功能

<%@ taglib uri=“tagURI” prefix=“tagPrefix” %>

三、JSP声明标识(Declaration)


在JSP页面中可以声明变量或方法,其声明格式为:

<%! 声明变量或方法的代码 %>

特别要注意,在“<%”与“!”之间不要有空格。声明的语法与Java语言中声明变量和方法时是一样的。相当于JAVA中的静态方法。在页面中通过声明标识声明的变量和方法,在整个页面内都有效,它们将成为JSP页面被转换为Java类后类中的属性和方法。并且它们会被多个线程即多个用户共享。也就是说,其中的任何一个线程对声明的变量或方法的修改都会改变它们原来的状态。它们的生命周期从创建到服务器关闭后结束。下面将通过一个具体实例来介绍声明标识的应用
在这里插入图片描述

实际案例:

<%@ page contentType="text/html;charset=utf-8"%> 
<%!
    int num=0; //声明一个计数变量
    synchronized void add(){//该方法实现访问次数的累加操作
        num++;
    }
%>
<% add();//该脚本程序调用实现访问次数累加的方法%>
<html>
    <body><center>您是第<%=num%>位访问该页的游客!</center></body>
</html>

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


四、JSP表达式标识(Expression)


表达式用于向页面中输出信息,其使用格式为:

<%= 变量或可以返回值的方法或Java表达式 %>

特别要注意,“<%”与“=”之间不要有空格。SP表达式在页面被转换为Servlet后,转换为了out.print()方法。所以JSP表达式与JSP页面中嵌入到小脚本程序中的out.print()方法实现的功能相同。如果通过JSP表达式输出一个对象,则该对象的toString()方法会被自动调用,表达式将输出toString()方法返回的内容。

(1)向页面输出内容,例如下面的代码:

<% String name="www.xxx.com"; %>
用户名:<%=name%>

(2)生成动态的链接地址,例如下面的代码:

<% String path="welcome.jsp"; %>
<a href="<%=path%>">链接到welcom.jsp</a>

(3)动态指定Form表单处理页面,例如下面的代码:

<% String name="logon.jsp"; %>
<form action="<%=name%>"></form>

(4)为通过循环语句生成的元素命名,例如下面的代码:

<% for(int i=1;i<3;i++){ %> 
  	file<%=i%>:
           <input type="text" name="<%="file"+i%>"><br>
<% } %>



五、JSP脚本程序标识(Scriptlet)


脚本程序是在JSP页面中使用“<%”与“%>”标记起来的一段Java代码。在脚本程序中可以定义变量、调用方法和进行各种表达式运算,且每行语句后面要加入分号。在脚本程序中定义的变量在当前的整个页面内都有效,但不会被其他的线程共享,当前用户对该变量的操作不会影响到其他的用户。当变量所在的页面关闭后就会被销毁

  • 和声明标识的区别?
    在脚本程序中定义的变量在整个页面内都有效,但不会被其他的线程共享,当前用户对该变量的操作不会影响到其他用户,这就是和声明标识的区别
<%@ page contentType="text/html;charset=utf-8"%> 
<% int able=1;%>
<html>
    <body>
        <table>
            <% if(able==1){%>
                <tr><td>欢迎登录!您的身份为“普通管理员”。 </td></tr>
            <%}
                 else if(able==2){
            %>
                 <tr><td>欢迎登录!您的身份为“系统管理员”。 </td></tr>
            <%} %>
        </table>
    </body>
</html>

运算结果:
在这里插入图片描述

<%@ page contentType="text/html;charset=utf-8" %>
<%@ page import="java.util.Date"  %>             
<%!  Date date;                                  
         public int continueSum(int start,int end){  
         int sum =0; 
         for(int i=start;i<=end;i++)  
            sum=sum+i; 
         return sum;                 }     %>
<HTML><title>example2_1.jsp</title>
 <body  background='back.jpg'>              
<font size=4><p>程序片创建Date对象:
   <% date=new Date();                            
      out.println("<BR>"+date);
      int start=1;
      int end=100;
      int sum=continueSum(start,end);      %>
<br>从   <%= start %>                                
   至   <%= end %>  的连续和是   <%= sum %> 
</font></body></HTML>

运算结果:
在这里插入图片描述

六、JSP注释标识(Expression)

1.HTML注释标识

<!-- 注释内容 -->

查看源代码会看到对应的注释

2.带有JSP表达式的注释

<!-- comment<%=expression %>–>

包含该注释语句的JSP页面被请求后,服务器能够识别注释中的JSP表达式,从而来执行该表达式,而对注释中的其他内容不做任何操作。当服务器将执行结果返回给客户端后,客户端浏览器会识别该注释语句,所以被注释的内容不会显示在浏览器中

<%@ page contentType="text/html;charset=utf-8" %>
<%@ page import="java.util.*" %>
<% String name="YXQ";%>
<!--当前用户:<%=name%> -->
<table><tr><td>欢迎登录:<%=name%></td></tr></table>

运行结果:
在这里插入图片描述
在这里插入图片描述

3.隐藏注释
在前面已经介绍了如何应用HTML中的注释,这种注释虽然在客户端浏览页面时不会看见,但它却存在于源代码中,可通过在客户端查看源代码看到被注释的内容。所以严格来说,这种注释并不安全。下面将介绍一种隐藏注释,注释格式如下:

<%-- 注释内容 --%>

4.脚本程序(Scriptlet)中的注释

  • 单行注释

// 注释内容

  • 多行注释

/*
* 注释内容1
* 注释内容2
* …
*/

  • 提示文档注释

/**
提示信息1
提示信息2

*/

七、动作标识

  1. <jsp:useBean>
    通过应用jsp:useBean动作标识可以在JSP页面中创建一个Bean实例,并且通过属性的设置可以将该实例存储到JSP中的指定范围内。如果在指定的范围内已经存在了指定的Bean实例,那么将使用这个实例,而不会重新创建。通过jsp:useBean标识创建的Bean实例可以在Scriptlet中应用。
  • id属性定义一个变量名,程序中将使用该变量名对所创建的Bean实例进行引用。
    解释:id就相当于Object obj = new Object();中的对象句柄obj。一定要记住是id。后面的表示如<get:property>是不存在该属性的,它们用的name。
  • type属性type属性用于设置由id属性指定的变量的类型。type属性可以指定要创建实例的类的本身、类的父类或者是一个接口
  • scope属性:该属性指定了所创建Bean实例的存取范围,省略该属性时的值为page。
scope属性值作用范围
page指定了所创建的Bean实例只能够在当前的JSP文件中使用当前JSP页面,包括在通过include指令静态包含的页面中有效
request指定了所创建的Bean实例可以在请求范围内进行存取。在请求被转发至的目标页面中可通过request对象的getAttribute(“id属性值”)方法获取创建的Bean实例。一次request请求,包括请求转发。请求重定向就会消失
session指定了所创建的Bean实例的有效范围为session。session是当用户访问Web应用时,服务器为用户创建的一个对象,服务器通过session的ID值来区分其他的用户。针对某一个用户而言,在该范围中的对象可被多个页面共享。网站不关闭不会消失
application该值指定了所创建的Bean实例的有效范围从服务器启动开始到服务器关闭结束。application对象是在服务器启动时创建的,它被多个用户共享。服务器不关闭不会消失
  • class属性:指定一个完整类名
<jsp:useBean id="us" class="com.Bean.UserInfo" scope="session"/>

程序首先会在session范围中来查找是否存在名为“us”的UserInfo类的实例,如果不存在,那么会通过new操作符实例化UserInfo类来获取一个实例,并以“us”为实例名称存储到session范围内。


<jsp:useBean id="us" class="com.Bean.UserInfo" type="com.Bean.UserBase" scope="session"/>

该标识被执行时,程序首先创建了一个以type属性的值为类型,以id属性值为名称的变量us,并赋值为null;然后在session范围内来查找这个名为“us”的Bean实例,如果存在,则将其转换为type属性指定的UserBase类型(类型转换必须是合法的)并赋值给变量us;如果实例不存在,那么将通过new操作符来实例化一个UserInfo类的实例并赋值给变量us,最后将us变量储在session范围内

注:这里就可以看出useBean标识实质上就是在诠释一种东西。这种东西就是new对象的三种方式,只不过,它封装成了jsp标签,用标签的形式来做。type指定的是 Object obj = new Object();中的Object,它可以是类本身,父类,接口。父类的话,对应着类型转换,即:SupperObject obj = (SupperObject )new Object()。接口的话就是再设计模式中常用的向上转型。

<jsp:useBean id="us" beanName="com.Bean.UserInfo" type="com.Bean.UserBase"/>

这里假设UserBase类为UserInfo类的父类。该标识被执行时,程序首先创建了一个以type属性的值为类型,以id属性值为名称的变量us,并赋值为null;然后在session范围内来查找这个名为“us”的Bean实例,如果存在,则将其转换为type属性指定的UserBase类型(类型转换必须是合法的)并赋值给变量us;如果实例不存在,那么将通过instantiate()方法从UserInfo类中实例化一个类并将其转换成UserBase类型后赋值给变量us,最后将变量us存储在session范围内。

  1. <jsp:setProperty>
    标识通常情况下与jsp:useBean标识一起使用,它将调用Bean中的setXxx()方法将请求中的参数赋值给由jsp:useBean标识创建的JavaBean中对应的简单属性或索引属性。
  • name属性:
    name属性用来指定一个存在JSP中某个范围中的Bean实例。jsp:setProperty标识将会按照page、request、session和application的顺序来查找这个Bean实例,直到第一个实例被找到

  • 用HTTP表单的所有参数的值设置bean相对应的属性的值

<jsp:setProperty property="*" />
  • 用HTTP表单的某个参数的值设置bean的某个属性的值
<jsp:setProperty property="propertyName"param="parameterName" />
  • 将bean属性的值设置为一个表达式的值的语法格式
<jsp:setProperty property="propertyName“ />
  • 将bean属性的值设置为一个字符串语法格式
<jsp:setProperty property="propertyName" value="值“ />
  1. <jsp:getProperty>
    jsp:getProperty属性用来从指定的Bean中读取指定的属性值,并输出到页面中。该Bean必须具有getXxx()方法。
<jsp:getProperty name="Bean实例名(id)" property="propertyName"/>
  1. <jsp:forward>
    jsp:forward动作标识用来将请求转发到另外一个JSP、HTML或相关的资源文件中。当该标识被执行后,当前的页面将不再被执行,而是去执行该标识指定的目标页面。
<jsp:forward page="文件路径 | 表示路径的表达式"/>

请求转发和请求重定向:
在这里插入图片描述
在这里插入图片描述

  1. <jsp:include>
    jsp:include动作标识用于向当前的页面中包含其他的文件,这个文件可以是动态文件也可以是静态文件。该标识的使用格式如下:

    <jsp:include page="被包含文件的路径" flush="true|false"/>
    

    jsp:include动作标识与include指令标识的区别:

    1.属性:
    include指令通过file属性来指定被包含的页面;jsp:include动作标识通过page属性来指定被包含的页面,该属性支持JSP表达式。
    2.处理方式:
    使用include指令被包含的文件,在一个JSP页面中使用include指令来包含另外一个JSP页面,最终编译后的文件只有一个。
    使用jsp:include动作标识包含文件时,当该标识被执行时,程序会将请求转发到(注意是转发,而不是请求重定向)被包含的页面,并将执行结果输出到浏览器中,然后返回包含页继续执行后面的代码。因为服务器执行的是两个文件,所以JSP编译器会分别对这两个文件进行编译
    3.包含方式
    使用include指令包含文件,最终服务器执行的是将两个文件合成后由JSP编译器编译成的一个Class文件,所以被包含文件的内容应是固定不变的,若改变了被包含的文件,则主文件的代码就发生了改变,因此服务器会重新编译主文件。include指令的这种包含过程称为静态包含
    使用jsp:include动作标识通常是来包含那些经常需要改动的文件。此时服务器执行的是两个文件,被包含文件的改动不会影响到主文件,因此服务器不会对主文件重新编译,而只需重新编译被包含的文件即可。而对被包含文件的编译是在执行时才进行的,也就是说,只有当jsp:include动作标识被执行时,使用该识包含的目标文件才会被编译,否则被包含的文件不会被编译,所以这种包含过程称为动态包含
    4.对被包含文件的约定
    使用include指令包含文件时,对被包含文件有约定。


留言板案例:

<%@ page contentType="text/html;charset=gb2312" %>
<HTML><body bgcolor=cyan>
 <form action="example3_18_pane.jsp" method="post" name="form">
   输入名字:<input  type="text" name="peopleName">
   <br>留言标题:<input  type="text"  name="title">
   <br>留言:<br> <textArea name="messages" rows="10" cols=36 
                   wrap="physical"></textArea>
   <br><input type="submit" value="提交" name="submit">
 </form>
 <a href="example3_18_show.jsp">查看留言板</a>
</body></HTML>

<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*" %>
<HTML><body>
     <%! Vector v=new Vector();
         int i=0; 
         ServletContext  application;
         synchronized void leaveWord(String s) { //留言方法
            application=getServletContext();;
            i++;
            v.add("No."+i+","+s);
            application.setAttribute("Mess",v); 
         }
     %> 
     <% String name=request.getParameter("peopleName");
        String title=request.getParameter("title");
        String messages=request.getParameter("messages");
           if(name==null)
              name="guest"+(int)(Math.random()*10000);
           if(title==null)
              title="无标题";
           if(messages==null)
              messages="无信息";
           String s=name+"#"+title+"#"+messages; 
           leaveWord(s);
           out.print("您的信息已经提交!");
     %>
  <a href="example3_18_input.jsp" >返回留言页面 
</body></HTML>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*" %>
<%! public String handleStr(String s) {
       try {  byte [] bb= s.getBytes("iso-8859-1");
              s = new String(bb);
       }
       catch(Exception exp){}
       return s;
    }
%>
<HTML><body>
  <% Vector v=(Vector)application.getAttribute("Mess");
     for(int i=0;i<v.size();i++) {
        String message=(String)v.elementAt(i);
        String []a =message.split("#");
        out.print("留言人:"+handleStr(a[0])+","+"<br>");
        out.print("标题:"+handleStr(a[1])+"<br>");
        out.print("留言内容:<br>"+handleStr(a[2]));
        out.print("<br>--------------<br>");
     } 
  %>
</body></HTML>

运行结果:
在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值