JSP基本语法

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方法的外面。

所以如果有:

<%!
    private int globalVar = 0;//成员变量
%>
<%
    int localVar = 0;//局部变量
%>
globalVar:<%= ++globalVar %>
localVar:<%= ++localVar %>

在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指令必须嵌套在<%@ %>之中,其基本语法格式为如下:

<%@ 指令 属性名="值" %>

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

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

第一种方式:

<%@ page contentType="text/html";charset="GB2312"%>
<%@ page import="java.util.Date"%>

第二种方式:

<%@ page contentType="text/html";charset="GB2312" import="java.util.Date"%>

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里。语法如下:

<%@ include file="relativeURL"%>

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

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

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

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

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

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

六、行为元素(JSP标签,简述)

JSP提供了一种称之为Action的元素,在JSP页面中使用Action元素可以完成各种通用的JSP页面功能。Action元素采用XML元素的语法格式,所以,干脆将Action元素称之为JSP标签。

1、<jsp:include>标签

<jsp:include>标签用于把另外一个资源的输出内容插入进当前JSP页面的输出内容之中,这种在JSP页面执行时的引入方式称之为动态引入。简单理解是:翻译当前JSP页面时,遇到这条语句,调用一个include方法,把引入文件包含进来,并不会把引入的文件翻译后的Servlet代码包含在当前JSP页面翻译的Servlet中。其语法如下:

<jsp:include page="relativeURL | <%=表达式%>" flush="true | false" />

其中,page属性用于指定被引入资源的相对路径,也可以通过执行一个表达式来获得,flush属性指定在插入其他资源的输出内容时,是否先将当前JSP页面已输出的内容刷新到客户端,其默认值是false,表示先不刷新已输出的内容。

<jsp:include>标签与include指令的比较:

  • <jsp:include>标签的作用类似RequestDispatcher.include方法,被引入页面不能改变响应状态码,也不能设置响应头。include指令没有这方面限制。

  • <jsp:include>标签的执行效率低于include指令,但灵活性要好很多。

  • <jsp:include>标签对JSP引擎翻译JSP页面的过程没有影响,例如,引入页面的page指令不影响被引入页面的page指令。include指令则对JSP引擎翻译JSP页面的过程起作用。

详细:http://www.jb51.net/article/47606.htm

注意:<jsp:include>标签的page属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前Web应用程序的根目录,否则表示相对于当前页面的访问路径(不是相对于文件的硬盘路径)。

<jsp:include>标签的特性

included.jsp

<%@ page contentType="text/html;charset=GB2312"%>
<%Thread.sleep(5000);%>
included.jsp内的中文<br>

dynamicInclude.jsp

<%@ page contentType="text/html;charset=GB2312"%>
dynamicInclude.jsp内的中文<br>
<jsp:include page="included.jsp" flush="true" />

用浏览器访问dynamicInclude.jsp页面,浏览器首先显示出dynamicInclude.jsp页面输出的内容,等待5秒后,才又显示出included.jsp页面的输出内容。

修改dynamicInclude.jsp文件,去掉flush属性设置,用浏览器重新访问dynamicInclude.jsp页面,浏览器等待5秒以后同时显示出了dynamicInclude.jsp和included.jsp页面的内容。

总结:

RequestDispatcher.include方法:调用该方法前后,写入到缓冲区的内容可以被输出到客户端。

RequestDispatcher.forward方法(不能有内容已经被输出到客户端):调用该方法前,写入到缓冲区的内容被清空,调用该方法后,写入操作被忽略。所以在调用者程序中写入到缓冲区的内容都不会被输出到客户端。

Request.sendRedirect方法(不能有内容已经被输出到客户端):在调用该方法前后写入到缓冲区的内容都会被清空。

2、<jsp:forward>标签

<jsp:forward>标签用于把请求转发给另外一个资源,其语法如下:

<jsp:forward page="relativeURL | <%=表达式%>" />

其中,page属性用于指定请求转发到的资源的相对路径,它也可以通过执行一个表达式来获得。

<jsp:forward>标签实际上被翻译成了调用PageContext.forward方法的语句,并在调用forward方法后使用return语句结束了service方法的执行流程,从而不再执行<jsp:forward>标签后面的语句。

3、<jsp:param>标签

当使用<jsp:include>标签和<jsp:forward>标签引入或将请求转发给的资源是一个能动态执行的程序时,还可以使用<jsp:param>标签向这个程序传递参数信息。语法如下:

<jsp:include page="relativeURL | <%=表达式%>">
    <jsp:param name="paramterName" value="paramterValue | <%=表达式%>" />
</jsp:include>

或:

<jsp:forward page="relativeURL | <%=表达式%>">
    <jsp:param name="paramterName" value="paramterValue | <%=表达式%>" />
</jsp:forward>

4、脚本元素标签

  • <% %>可替代为:<jsp:scriptlet> code </jsp:scriptlet>

  • <%! %>可替代为:<jsp:declaration> code </jsp:declaration>

  • <%= %>可替代为:<jsp:expression> expression </jsp:exprission>

4、指令标签

<jsp:directive.directiveType>标签来替代<%@ directive ... %>语句(directive是指令的意思),如:<%@ page import="java.util.*"%>可替换为:<jsp:directive.page import="java.util.*" />

5、<jsp:text>标签

可以将模板内容封装在这个标签当中。

——JSP标签很多,这里只是简单讲述。


转载于:https://my.oschina.net/u/1171518/blog/222184

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值