JSP程序设计【二】

一、JSP页面的基本结构


1、Java成员变量和方法

声明标记符<%! %>

例如:

1
2
3
4
5
6
7
8
<%!
Date date;
int sum;
public int getFactorSum(int n) {
for(int i=1;i<n;i++) { if (n%i==0) sum=sum+i; }
return sum;
}
%>
  • 在“<%!”和“%>”之间声明的变量和方法属于成员级的,它们在整个JSP页面中都有效。原因在JSP文件转化为Java文件时的原理中
  • 变量声明必须以“;”结尾,因为就是写的Java程序内容

2、Java程序片

声明标记符<% %>

例如:

1
2
3
4
5
6
<%
int s=0;
for (int i=1; i<=100; i++) {
s+=i;
}
%>
  • 程序片中声明的变量属于JSP页面的局部变量。
  • 多个客户请求一个JSP页面时 , Java程序片将被执行多次,分别在不同的线程中执行。
  • 标记符<%! %>与<% %>声明的变量具有很大差别,<%! %>相当于一个”全局变量“,<% %>是局部变量,<%! %>声明的成员变量第一次在服务器上编译后就不会重新赋值了,<% %>每次都会重新赋值,原因在JSP文件转化为Java文件时的原理中

3、Java表达式

声明标记符<%= %>,将某个结果作为字符串在网页上输出

例如:

1
2
3
4
5
6
7
8
9
<%@ page contentType="text/html;charset=GBK" %>
<html>
<body bgcolor=cyan>
<font size=4>
<% int n = 1234; %>
<p><%= n %>的平方根是:<%= Math.sqrt(n) %>。</p>
</font>
</body>
</html>
  • 注意使用Java程序片和Java表达式分别表达输出,是不同的
    • <% System.out.println() %>将会显示在控制台
    • <%= i %>浏览器页面显示

4、JSP中的注释

HTML注释格式:<!-- 注释内容 -->

JSP中的注释:<%-- 注释内容 --%>

Java程序片中添加Java注释<%//内容%>或者<%/*内容*/%>

  • HTML注释会在浏览器原码中出现,并且可以在其中填写JSP表达式,内容会输出到浏览器原码中,使用相关类如Date效果也会显现
  • JSP注释不会在浏览器原码中出现
  • Java程序片中添加Java注释和JSP效果相同注释不会在浏览器原码中出现

二、JSP到Java的转换


  • import java.util.Date忘了在图中标示
  • <%! %>内容作为类内成员变量和成员函数
  • <% %>内容作为_jspService函数的局部变量和内容
  • <%= %>会被作为_jspService函数中的out.print()的内容
  • <%-- --%>不会被读取
  • html标记内容会通过out.write()原封不动输出给浏览器

三、JSP的标记和动作指令


1、JSP指令标记

描述JSP文件转换成JSP服务器所能执行的Java代码的控制信息,用于指定整个JSP页面的相关信息,并设置JSP页面的相关属性

(1)page指令

  • page指令用来设置JSP页面的某些属性和属性值。
  • page指令对整个JSP页面有效,与书写位置无关。(通常把page指令写在页面的最前面。)
  • 在使用多个page指令时,其中的属性除import属性外只能使用一次。

语法格式:

1
2
3
4
5
6
属性可写在一个指令中:
<%@ 指令 属性1="值1" 属性2="值2" …… %>

也可以分开写:
<%@ 指令 属性1="值1" %>
<%@ 指令 属性2="值2" %>

括号内是默认值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@page 
[ language=“scriptingLanguage” ] //处理页面使用的语言(java)
[ extends=“package.class” ] //产生的Servlet类型(HttpJspBaseHTTPServlet)
[ contentType=“mimeType[; charset=characterSet ]” ] //页面内容的类型(text/html; ISO-8859-1)
[ pageEncoding=“characterSet” ] //JSP页面的编码(ISO-8859-1)
[ import=“package.class | package.*, ...” ] //需要导入的类(lang, servlet, jsp, http)
[ session=“true | false” ] //是否使用session对象(true)
[ buffer=“none | 8kb | sizekb” ] //输出缓冲区(8kb)
[ autoFlush=“true | false” ] //缓冲区自动刷新(true)
[ isThreadSafe=“true | false” ] //是否可多线程访问(true)
[ info=“text” ] //指定一个常用信息字符串(…)
[ errorPage=“relative_url” ] //出错时转向的页面(…)
[ isErrorPage=“true | false” ] //本页面是否是一个出错页面(false)
[ isELIgnored=“true | false” ] //是否忽略EL表达式(true)
%>

一般取默认值即可,下面介绍常用三个属性

①contentType 属性

用于指定内容MIME类型和JSP页面的编码方式。对于普通JSP页面,默认的contentType属性值为”text/html;charset=ISO-8859-1”。对于JSP文档,默认的contentType属性值为”text/html;charset=ISO-8859-1 “。

②pageEncoding 属性

设置保存JSP页面文件本身使用的编码

注意:设置pageEncoding和contentType中的字符集必须一致,否则乱码

且若只设置一个或者不设置,会根据设置情况,设置两个默认字符集一致

③import属性

为JSP页面导入所需要的类

默认导入:

  • java.lang.
  • javax.servlet.
  • javax.servlet.jsp.*
  • javax.servlet.http.*

(2)include指令

将由“URL”指定的文件(该文件可以说txt、html等文本文件)包含到含有该指令标记的JSP页面中。

语法:<%@ include file= "URL" %>

静态包含(翻译阶段):该指令使用指定的文件内容,与原JSP页面一起翻译成一个Java文件。

被包含的文件在语法和逻辑上依赖于当前的JSP页面。可理解为将另外一个内容插入到该位置,之后编译执行

2、JSP动作标记

(1)include动作标记

语法:<jsp:include page="URL" />

动态包含(运行阶段):原JSP页面执行到该指令时,就会执行指定的页面,然后把执行结果包含进来,与原JSP页面的执行结果一起发送到浏览器。

被包含的文件在语法和逻辑上可以独立于当前的JSP页面。可理解为执行第一个文件的时候遇到该标记执行第二个文件结果返回给第一个文件再执行,最终将结果发送给浏览器

由此特性我们也知道,指令标记文本可以是任意的可查看文本,二动作标记需要是一个jsp文本

(2)forward动作标记

语法:<jsp:forward page="URL" />遇到该指令会转向执行由“URL”指定的页面,发送执行结果,并停止执行当前页面。但地址栏仍然是原JSP页面的访问地址。常用于不同情况下的页面跳转效果。

(3)param动作标记

语法:<jsp:param name="参数名" value="参数值" />

不能单独使用。应用到动作标记中,用于从原页面向动作页面传递参数。

1
2
3
<jsp:include page="come.jsp">//加载come.jsp
<jsp:param name="number" value="<%=i%>" />//传递参数
</jsp:include
  • 在动作页面中获取参数值的方法:String value = request.getParamter(name);

(4)问题解析

为何JSP标签这样可以使用:

但是这样写不行:

因为JSP标记也是要转录成java程序然后再编译的。在图一中,按照程序片第一个标签结束后遇到了JSP标记,于是服务器将该标记继续转录为java程序,这样就正好在控制语句的括号中。之后在接上程序片,里面的java程序再接上尾括号和分支语句。这样才形成了一个完整的表达程序,之后生成对象执行,结果发送给客户端。而第二种,只是把JSP标记作为字符发给了客户端,但是将标记转为java程序是服务器干的事情,客户端的浏览器无法解析,故而不行。

四、如何解决JSP页面中的错误


1、JSP源文件

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

2、Java源文件

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

3、运行错误

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

-----------------------本文结束 感谢阅读-----------------------
坚持原创技术分享,您的支持将鼓励我继续创作!恰饭^.^~