JSP语法的学习


要学习JSP,就必须要学习它的语法,JSP的语法分为以下几部份:
1. JSP模版元素
2. JSP脚本表达式
3. JSP脚本片断
4. JSP声明
5. JSP注释
6. JSP指令
7. JSP标签
8. JSP内置对象
最后,我们还要学习如何在JSP页面查找错误。


------------------------------------------------


第一、JSP模版元素
JSP页面中的HTML内容称之为JSP模版元素。
JSP模版元素定义了网页的基本架构,即定义了页面的结构和外观。




------------------------------------------------


第二、JSP脚本表达式
JSP表达式(expression)用于将程序数据输出客户端。
语法:<%= 变量或表达式 %>
举例:当前时间:<%= new java.util.Date() %>


------------------------------------------------


第三、JSP脚本片断
JSP脚本片断(scriptlet)用于在JSP页面中编写多行java代码。
语法:
<% 多行java代码 %>
例如:

<% 

   java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

   out.write(format.format(new java.util.Date())); 

 %>


JSP脚本片断中只能出现java代码,不能出现其它模版元素,JSP引擎在翻译JSP页面中,会将JSP脚本片断中的java代码原封不动的放到Servlet的_jspService方法中。
JSP脚本片断中的java代码必须严格遵守java语法。


在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。
例如:

<% 

 

int x = 10; 

 

out.println(x); 



 %><p>这是JSP页面文本</p> 



 <% 

 

int y = 20; 

 

out.println(y);



%>
多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况。如:out.println(x);


单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句。
例如:

<% 

 

for (int i=1; i<5; i++)  

 

{ 



 %> 



 

 <H1>www.itcast.cn</H1> 





 <% 

 

}



%> 
演示之后看jsp源码。
------------------------------------------------


第四、JSP声明
刚才我们学习了“JSP脚本表达式”和“JSP脚本片断”,它们都是放在Servlet的_jspService方法中的。
思考一下,我们能不能使用“JSP脚本表达式”来声明一个方法?
如:

<% 

public void method() { 

System.out.println("method()"); 

} 

%>


很显然是不行的,但有时候我们需要通过JSP来声明一些属于自已的方法怎么办?这时候我们可以使用“JSP声明”。


JSP声明的语法格式是:<%! java代码 %>
JSP声明的代码最终会翻译到_jspService方法的外面,也就是作为Servlet类的成员(变量和方法都可以)。
所以,JSP声明可用于定义JSP页面转换成Servlet程序的静态代码块、成员变量或成员方法。
演示:

<%! 

public void method() { 

System.out.println("method()"); 

} 

%> 

<%! 

static { 

System.out.println("staic "); 

} 

%> 

 

<%! 

int a = 9; 

%> 

<%! 

static int b = 99

;
%>
多个静态代码块、变量和方法可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明中。
JSP隐式对象的作用范围仅限于Servlet的_jspService方法中,所以在JSP声明中不能使用这些隐式对象。


------------------------------------------------


第五、JSP注释
我们可以为JSP添加注释,格式如下:
<%-- JSP注释 --%>
JSP注释的区域不会在翻译后的Servlet代码里显示,JSP注释专门用来注释java代码的。


思考:jsp和html注释有什么区别?
<%-- JSP注释--%>
<!-- html注释 -->
答:html注释是用户可见的,比如你现在点击右键,查看源代码,源文件什么的,是可以看得到html注释的。
而jsp注释是不可见的,也就是说你查看源代码是没法查看这个jsp注释的。
总得来说,html注释,是(可能是,因为很少人蛋疼地去查看源文件以获得帮助)服务于用户的。而jsp注释是服务于程序员的。


------------------------------------------------


第六、JSP指令


如何修改MyEclipse里的JSP模版?


JSP引擎是什么?我们写的JSP代码最终会被翻译成Servlet代码,而这个翻译的过程必定是由某个程序来执行的,这个程序就称为“JSP引擎”。
简单把“JSP引擎”想像成是Tomcat就行了。


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


1. page指令


2. Include指令


3. taglib指令





1. page指令 

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

 举例:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 

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

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

 JSP2.0规范中定义的page指令的完整语法: 

 <% page 

[ language="java" ] 

[ import="{package.class | package.*}"] 

JSP引擎自动导入下面的包: 

java.lang.* 

javax.servlet.* 

javax.servlet.jsp.* 

javax.servlet.http.* 

 

使用import指令可以在一条page指令中引入多个类或包,其中的每个包或类之间使用逗号分隔。 

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

上面语句也可以使用多条page指令来写: 

<%@ page import="java.util.Date" %> 

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

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



[ session="true | false" ] 

控制JSP页面里的java脚本是否允许直接使用session。 

假设设置为true,我们在翻译后的JSP代码可以看到: 

     
HttpSession session = null; 

         session = pageContext.getSession(); 

假设设置为false,那就没有session被创建。 

因为在IE6.0后每个用户对应一个session,如果用户多的话session会相应的增多,服务器的压力就会加大,所以JSP提供了session可开可关的设置。 

这里要注意一点,如果没有任何配置的情况下,session在关闭浏览器30分钟后才会消失。 



[ isThreadSafe="true | false" ] 

实现SingleThreadModel接口,这个不推荐配置。 



[ errorPage="relative_url" ] 

errorPage属性用来指定当前JSP页面抛出异常后的跳转的JSP页面位置。 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" errorPage="/error.jsp" %> 

<% 

int a = 10 / 0; // 此代码报错后将自动跳转到error.jsp页面 

%> 

errorPage="/..." 这里的/表示Web工程的根目录。建议养成习惯,写errorPage的时候先写/ 



可以在web.xml文件中使用<error-page>元素为整个web应用程序设置错误处理页面,其中的<exception-type>子元素指定异常类的完全限定名,<location>元素指定以“/”开头的错误处理页面路径。 

如果1.jsp 2.jsp 3.jsp...页面里都有异常,那为每个JSP页面都配置errorPage是很麻烦的,现在提供一种方式,在web.xml文件里面配置“全局异常”,这样就不需要在每个JSP页面里都配置了。 

web.xml 

<error-page> 

<exception-type>java.lang.Exception</exception-type> 

<location>/error.jsp</location> 

</error-page> 



[ isErrorPage="true | false" ] 

设置此jsp网页是否为错误处理页面。默认值为”false”。当设置为”true”时,jsp页面将可存取隐含的exception对象,并通过该对象取得从发生错误之网页所传出的错误信息。取得错误信息的语法如下:<% =exception.getMessage()%> 



[ contentType ] 

设置jsp网页输出时数据时,所使用的字符压缩方式,以及所使用的字符集,当编写中文网页时,设置如下: 

<%@page contentType=”text/html;charset=Gb2312”%> 

此属性的默认值为”text/html;charset=ISO-8859-1”。 

[ buffer ] 

设置jsp网页的缓冲区大小,默认为”8k”,如果设置为”none”,则表示不使用缓冲,所有的响应输出都将被PrintWriter直接写到ServletResponse中。 





 下面讲一个重点内容:使用page指令解决JSP中文乱码问题 

 <%@ page language="java" import="java.util.*" pageEncoding="utf-8" contentType="text/html;charset=utf-8"%> 

 pageEncoding与contentType属性的设置问题





------------------------------------------------