JSP简单入门(1)

时间:2022-05-04
本文章向大家介绍JSP简单入门(1),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
JSP页面中可以包含模板元素、脚本元素、EL表达式、注释、指令、和行为元素(JSP标签)等内容。有三种类型的脚本元素:JSP脚本片断、JSP表达式和JSP声明,它们内部使用的都是Java脚本代码。

一、模板元素

JSP页面中的静态HTML内容被称之为JSP模板元素。

二、脚本元素

1、JSP表达式

将一个Java变量或表达式的计算结果输出到客户端的简化方式,代码位于<%= %>之中。

2、JSP脚本片断

嵌套在<% %>之中的一条或多条Java程序代码,在这之中可以直接使用JSP提供的隐式对象来完成Web应用程序特有的功能。

3、JSP声明

JSP页面中的脚本片断、表达式、模板元素等都将转换成Servlet的_jspService方法中的程序代码,显然,在脚本片断中声明的变量都将成_jspService方法中的局部变量。另外,在脚本片断中声明的方法也将被插入到_jspService方法中,这就会出现在方法中定义方法的语法错误。如果希望在JSP页面中为其转换成的Servlet定义成员变量和方法,就要使用JSP声明。JSP声明将Java代码封装在<%! %>之中,里面的代码都将被插进_jspService方法的外面。

所以如果有:

<code class="hljs erb" style=""><span class="xml" style=""><span class="hljs-tag" style=""><span class="xml" style=""><span class="hljs-tag" style=""><</span></span><span class="hljs-name" style=""><span class="xml" style=""><span class="hljs-tag" style=""><span class="hljs-name" style="">%</span></span></span></span></span></span><span class="ruby" style=""><span class="ruby" style="">!  
    private int globalVar = </span><span class="hljs-number" style=""><span class="ruby" style=""><span class="hljs-number" style="">0</span></span></span><span class="ruby" style="">;</span><span class="hljs-regexp" style=""><span class="ruby" style=""><span class="hljs-regexp" style="">//</span></span></span><span class="ruby" style="">成员变量  
</span></span><span class="xml" style=""><span class="hljs-tag" style=""><span class="xml" style=""><span class="hljs-tag" style="">%></span></span></span><span class="xml" style="">  
</span><span class="hljs-tag" style=""><span class="xml" style=""><span class="hljs-tag" style=""><</span></span><span class="hljs-name" style=""><span class="xml" style=""><span class="hljs-tag" style=""><span class="hljs-name" style="">%</span></span></span></span></span></span><span class="ruby" style=""><span class="ruby" style="">  
    int localVar = </span><span class="hljs-number" style=""><span class="ruby" style=""><span class="hljs-number" style="">0</span></span></span><span class="ruby" style="">;</span><span class="hljs-regexp" style=""><span class="ruby" style=""><span class="hljs-regexp" style="">//</span></span></span><span class="ruby" style="">局部变量  
</span></span><span class="xml" style=""><span class="hljs-tag" style=""><span class="xml" style=""><span class="hljs-tag" style="">%></span></span></span><span class="xml" style="">  
globalVar:</span><span class="hljs-tag" style=""><span class="xml" style=""><span class="hljs-tag" style=""><</span></span><span class="hljs-name" style=""><span class="xml" style=""><span class="hljs-tag" style=""><span class="hljs-name" style="">%=</span></span></span></span></span></span><span class="ruby" style=""> ++globalVar </span><span class="xml" style=""><span class="hljs-tag" style=""><span class="xml" style=""><span class="hljs-tag" style="">%></span></span></span><span class="xml" style="">  
localVar:</span><span class="hljs-tag" style=""><span class="xml" style=""><span class="hljs-tag" style=""><</span></span><span class="hljs-name" style=""><span class="xml" style=""><span class="hljs-tag" style=""><span class="hljs-name" style="">%=</span></span></span></span></span></span><span class="ruby" style=""> ++localVar </span><span class="xml" style=""><span class="hljs-tag" style="">%></span></span></code>  

在JSP页面没有发生修改的情况下,对应JSP页面的每次访问请求,Servlet引擎都会调用其所生成的Servlet的_jspService方法进行响应。每次调用_jspService方法时所访问的globalVar都是同一个变量,所以其值不断增长。而每次调用_jspService方法时所访问的localVar是各自独立的变量,所以其值总是1。

三、EL表达式(简述)

EL表达式的基本语法格式为”${表达式}“,它可以出现在JSP自定义标签和标准标签的属性值中,其计算结果将作为标签的属性值或属性值的一部分;EL表达式也可以出现在模板元素中,其计算结果将插入进当前的输出流中。EL表达式相比JSP脚本元素而言,具有以下优点:

1、使用EL表达式可以非常方便地访问JSP页面相关的数据,例如要访问名称为user的请求参数,JSP表达式为:<%= request.getParameter("user") %>,而相应的EL表达式为:${param.user}。在EL表达式中还可以直接使用${cookie.user}来访问名称为user的Cookie信息。在JSP表达式中却无法实现这样的功能。

2、如果表达式的计算结果为null,将输出“null”的字符文本。而EL表达式会将它强制转换为空字符串""后再输出,而不是显示“null”。

3、在EL表达式中还可以使用empty操作符来判断一个参数是否为null,某个集合或字符串中的内容是否为空。

4、EL表达式还具有js等脚本语言的优点,能够对字符串、数字等各种类型的数据进行自动转换。

四、JSP注释

JSP自己的注释方式:<%-- --%>,不会在网页源代码中显示。

<!-- -->是HTML的注释,可以在网页源代码中查看。

1、特殊字符序列的转义处理:

EL表达式内的转义:任何字符序列都不需要进行转义处理,其中“${”和“}”与普通字符序列的处理方式完全相同。例如,${'${' }和${"${" }都可以直接输出${。

JSP脚本元素内的转义:在<% %>中,可以直接使用字符序列<%表达其字面意义,但为了不把%>当成结束分隔符处理,要表达字面意义的%>,必须用%>进行转义。同时,如果要表达%>,则用%\>。

JSP模板元素内的转义:在HTML代码中,为了不把<%当作脚本元素的开始,必须用<%进行转义。因为在模板元素JSP引擎没有遇到脚本元素的开始分界符,所以可以使用%>来表达字面意义。

2、JSP页面中的错误一般可归纳为以下三类:

JSP页面中的JSP语法格式有问题,导致其不能被翻译成Servlet源文件,JSP引擎将提示这类错误发生在JSP页面中的位置(行和列)及相关信息;

JSP页面中JSP格式没问题,但被翻译成Servlet源文件中出现了Java语法问题,导致不能通过编译。JSP引擎也将提示这类错误发生在JSP页面中的位置(行和列)及相关信息;

JSP页面翻译成Servlet程序在运行时出现异常,这与普通Java程序的运行错误完全一样,Java虚拟机将提示错误发生在Servlet源文件中的位置(行和列)以及相关信息。

五、JSP指令

JSP指令必须嵌套在<%@ %>之中,其基本语法格式为如下:

<code class="hljs erb" style=""><span class="xml" style=""><span class="hljs-tag" style=""><span class="xml" style=""><span class="hljs-tag" style=""><</span></span><span class="hljs-name" style=""><span class="xml" style=""><span class="hljs-tag" style=""><span class="hljs-name" style="">%</span></span></span></span></span></span><span class="ruby" style=""><span class="ruby" style="">@ 指令 属性名=</span><span class="hljs-string" style=""><span class="ruby" style=""><span class="hljs-string" style="">"值"</span></span></span><span class="ruby" style=""> </span></span><span class="xml" style=""><span class="hljs-tag" style="">%></span></span></code>  

其中,属性名是大小写敏感。在JSP2.0中,定义了page、include、taglib三种指令,每种指令又都定义了一些各自的属性。

如果要在一个JSP页面中设置同一条指令的多个属性,可以使用多条指令语句单独设置每个属性,也可以使用同一条指令语句设置该指令的多个属性,例子,

第一种方式:

<code class="hljs erb" style=""><span class="xml" style=""><span class="hljs-tag" style=""><span class="xml" style=""><span class="hljs-tag" style=""><</span></span><span class="hljs-name" style=""><span class="xml" style=""><span class="hljs-tag" style=""><span class="hljs-name" style="">%</span></span></span></span></span></span><span class="ruby" style=""><span class="ruby" style="">@ page contentType=</span><span class="hljs-string" style=""><span class="ruby" style=""><span class="hljs-string" style="">"text/html"</span></span></span><span class="ruby" style="">;charset=</span><span class="hljs-string" style=""><span class="ruby" style=""><span class="hljs-string" style="">"GB2312"</span></span></span></span><span class="xml" style=""><span class="hljs-tag" style=""><span class="xml" style=""><span class="hljs-tag" style="">%></span></span></span><span class="xml" style="">  
</span><span class="hljs-tag" style=""><span class="xml" style=""><span class="hljs-tag" style=""><</span></span><span class="hljs-name" style=""><span class="xml" style=""><span class="hljs-tag" style=""><span class="hljs-name" style="">%</span></span></span></span></span></span><span class="ruby" style=""><span class="ruby" style="">@ page import=</span><span class="hljs-string" style=""><span class="ruby" style=""><span class="hljs-string" style="">"java.util.Date"</span></span></span></span><span class="xml" style=""><span class="hljs-tag" style="">%></span></span></code>  

第二种方式:

<code class="hljs erb" style=""><span class="xml" style=""><span class="hljs-tag" style=""><span class="xml" style=""><span class="hljs-tag" style=""><</span></span><span class="hljs-name" style=""><span class="xml" style=""><span class="hljs-tag" style=""><span class="hljs-name" style="">%</span></span></span></span></span></span><span class="ruby" style=""><span class="ruby" style="">@ page contentType=</span><span class="hljs-string" style=""><span class="ruby" style=""><span class="hljs-string" style="">"text/html"</span></span></span><span class="ruby" style="">;charset=</span><span class="hljs-string" style=""><span class="ruby" style=""><span class="hljs-string" style="">"GB2312"</span></span></span><span class="ruby" style=""> import=</span><span class="hljs-string" style=""><span class="ruby" style=""><span class="hljs-string" style="">"java.util.Date"</span></span></span></span><span class="xml" style=""><span class="hljs-tag" style="">%></span></span></code>  

1、page指令

<%@page language="java"|

extends="className"| --翻译成的Servlet要继承的父类,一般不要设置

import="importList"| --导入包或类(重要)

buffer="none|kb size"| --指定out隐式对象的缓冲区大小,none:不缓冲,默认8k

session=“true|false”| --是否可以使用session,默认true

autoFlush="true|false" --设置out隐式对象的缓冲区已满时,是将其中内容刷新到客户端还是抛出溢出的异常,默认true

isThreadSafe="true|false"| --用于设置JSP页面是否是线程安全,默认true

info="infoText"| --定义Servlet的描述信息,可通过Servlet.getServletInfo方法获得该文本串,可以是任何字符

errorPage="errorPageUrl"| --设置另外一个JSP页面处理当前JSP页面发生的异常。设置值必须使用相对路径

isErrorPage="true|false"| --设置当前页面是否是专门用于处理其他未捕获的异常JSP页面,默认值false

contentType="contentTyepInfo"| --设置响应正文的MIME类型,即指定Content-Type响应头字段的值和说明JSP文件中的文本内容的字符集编码。默认MIME类型为text/html,默认字符集编码为ISO8859-1

pageEncoding="characterSet"| --指定JSP源文件中的字符所使用的字符集编码。设置了该值,contentType属性不再具有说明JSP源文件的字符集编码的作用。如果在JSP页面中没有设置page指令的contentType属性,那么该属性还具有指定响应正文的字符集编码的作用,默认ISO8859-1

isELIgnored="true|false" --当前JSP页面是否支持EL表达式,默认true

%>

问:为什么要说明JSP源文件的字符集编码?

答:因为JSP引擎将JSP源文件翻译成的Servlet源文件默认采用UTF-8编码,而JSP开发人员可以采用各种字符集编码来编写JSP源文件,因此,JSP引擎将JSP源文件翻译成Servlet源文件时,JSP引擎必须要知道JSP源文件所使用的字符集编码,才能将源文件中的字符文本转换成其正确的UTF-8字符集编码。

2、include指令

include指令用于通知JSP引擎,在翻译当前JSP页面时,将其他文件中的内容合并进当前JSP页面转换成的Servlet源文件中,这种方式称为静态引入。简单理解是:翻译当前JSP页面时,遇到这条语句,则把语句中引入的文件翻译后Servlet代码包含在当前JSP页面翻译成的Servlet里。语法如下:

<code class="hljs erb" style=""><span class="xml" style=""><span class="hljs-tag" style=""><span class="xml" style=""><span class="hljs-tag" style=""><</span></span><span class="hljs-name" style=""><span class="xml" style=""><span class="hljs-tag" style=""><span class="hljs-name" style="">%</span></span></span></span></span></span><span class="ruby" style=""><span class="ruby" style="">@ </span><span class="hljs-keyword" style=""><span class="ruby" style=""><span class="hljs-keyword" style="">include</span></span></span><span class="ruby" style=""> file=</span><span class="hljs-string" style=""><span class="ruby" style=""><span class="hljs-string" style="">"relativeURL"</span></span></span></span><span class="xml" style=""><span class="hljs-tag" style="">%></span></span></code>  

其中file属性用于指定被引入文件的相对路径(设置值是相对于引入文件本身在硬盘的路径,而不是浏览器地址栏URL上的路径)。如果以“/”开头,表示相对于Web应用程序的根目录,否则表示相对于当前文件

被引入的文件必须遵循JSP语法

被引入的文件可以使用任意扩展名,JSP规范建议使用.jspf作为静态引入文件的扩展名

除了import和pageEncoding属性之外,page指令的其他属性不能在这两个页面中有不同的设置值。注意utf-8和UTF-8被当成不同值。

插入include指令的位置与当前JSP页面中的位置保持一致

引入文件与被引入文件是在被JSP引擎翻译成Servlet过程中进行合并的,而不是先合并源文件后再对合并的结果进行翻译