JSP实际上是JSP定义的一些标记和Java程序段,以及HTML标签的混合体.
对比Servlet和JSP的代码实现,对于Servlet,如果HTML页面需要变动,则Servlet变动会很大,而且编程和界面美工不能分开工作。
对于JSP,页面的一部分由静态HTML构成(模板文本),一部分由动态代码<% code %>组成.
JSP运行后编译器会将其编译成Servlet.
JSP页面基本组成部分:
编译指令标识:<%@...%>。常用指令类型:page指令,include指令,taglib指令。
JSP表达式:<%=...%>。
声明标识:<%!...%> 。
代码片段:<%..(Java代码或脚本代码)..%>。
注释:<!-- HTML注释 -->; <%-- 隐藏注释 -->,<% //JSP注释 %>, <% /* JSP注释 */ %> 。
动作标识:<jsp:useBean>,<jsp:setProperty>,<jsp:getProperty>,<jsp:include>,<jsp:forward>。
标签:<table>,<input>。
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@ page import="java.util.Date"%> <%@ page import="java.text.SimpleDateFormat"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>一个简单的JSP页面——显示系统时间</title> </head> <body> <% Date date = new Date(); //获取日期对象 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置日期时间格式 String today = df.format(date); //获取当前系统日期 %> 当前时间:<%=today%> <!-- 输出系统时间 --> </body> </html>
1.JSP指令标识:
<%@ 指令名 属性名="属性值" …%>。
常用指令名:page指令,include指令,taglib指令。
页面指令page:
定义与整个JSP页面相关的属性,当这些属性被服务器解析成Servlet时会转换成相应的Java程序代码。
page指令可以放在JSP页面的任意位置,但习惯上放在文件的开头,方便阅读。
page指令的属性有:
<%@ page [ language="java" ] [ extends="package.class" ] [ import="{package.class | package.*}, ..." ] [ session="true | false" ] [ buffer="none | 8kb | sizekb" ] [ autoFlush="true | false" ] [ isThreadSafe="true | false" ] [ info="text" ] [ errorPage="relativeURL" ] [ contentType="mimeType [ ;charset=characterSet ]"| "text/html ; charset=ISO-8859-1" ] [ isErrorPage="true | false" ] %>
page指令可以定义如下属性: import,contentType,pageEncoding,session,isELIgnored,buffer,autoFlush, info,errorPage,isErrorPage,isThreadSafe,language,extends。 ------------------------------------------- 1.import属性 import指定Jsp页面转换成servlet应该导入的包。 【注意】 import是page的属性中唯一可以在同一文档中出现多次的属性。 默认情况下,servlet自动导入 java.lang.* javax.servlet.* javax.servlet.http.* javax.servlet,jsp.* 【语法】 <%@ page import="java.util.*" %> ------------------------------------------- 2.contentType属性 contentType属性设置Content-Type响应报头,标明即将发送到客户程序的文档的MIME类型。 【注意】 servlet的默认MIME是text/plain,Jsp的默认MIME是text/html(默认字符集是ISO-8859-1) 【语法】 <%@ page contentType="text/html" %> 或 <%@ page contentType="text/html;charset=gb2312" %> 和下面的scriptlet所起到的作用基本相同 <%response.setContentType("text/html")%> 第一点不同之处是,response.setContentType使用明确Java代码,而page指令只用到Jsp语法。 第二点不同之处是,page指令被特殊处理,它们不是在出现的位置直接转换为_jspService代码。 这意味着response.setContentType能够有条件地调用,而page指令不能。 ------------------------------------------- 3.session属性 session属性控制页面是否参与HTTP会话。 【注意】 true值表示,如果存在已有会话,则预定义变量session应该绑定到现有的会话; 否则,则创建新的会话并将其绑定到session。 false值表示不自动创建会话,在Jsp页面转换成servlet时,对变量session的访问会导致错误。 对于高流量的网站,使用session="false"可以节省大量的服务器内存。 但是要注意session="false"并不禁用会话跟踪--它只是【阻止】Jsp页面为那些尚不拥有会话的用户创建新的会话。 【语法】 <%@ page session="true" %><%--默认为true--%> 或 <%@ page session="false" %> ------------------------------------------- 4.isELIgnored属性 isELIgnored表示是忽略(true)JSP2.0表达式语言(EL),还是进行正常的求值(false)。 【注意】 JSP2.0引入一种简洁的表达式语言,在Jsp页面中可以用它来访问请求参数、cookie、HTTP报头、bean属性和Collection的元素。 表达式的形式为${exdivssion} 【语法】 <%@ page isELIgnored="true" %> 或 <%@ page isELIgnored="false" %> ------------------------------------------- 5.buffer属性 buffer属性指定out变量使用的缓冲区的大小。 【注意】 服务器实际使用的缓冲区可能比指定的更大,但不会小于指定的大小。 例如<%@ page buffer="32kb" %> 表示应该对文档的内容进行缓冲, 除非累计至至少为32KB或页面完成或调用response.flushBuffer(明确地对输出执行晴空), 否则不将文档发送给客户。 默认的缓冲区大小和服务器有关,但至少8KB。 如果将缓冲区功能关闭,应该十分小心,这样做要求设置报头或状态代码的Jsp元素都要出现在文件的顶部,位于任何HTML内容之前。 【语法】 <%@ page buffer="sizekb" %> 或 <%@ page buffer="none" %> ------------------------------------------- 6.autoFlush属性 autoFlush属性控制当缓冲区充满之后,是应该自动清空缓冲区(默认),还是在缓冲区溢出后抛出一个异常。 【注意】 当buffer="none"的时候,autoFlush="false"是不合法的。 因为当buffer="none"则表示将缓冲区功能关闭,那么autoFlush="false"没有任何意义。 【语法】 <%@ page autoFlush="true" %><%--默认--%> 或 <%@ page autoFlush="false" %> ------------------------------------------- 7.info属性 info属性定义一个可以在servlet中通过getServletInfo方法获取的字符串。 【语法】 <%@ page info="some message" %> ------------------------------------------- 8.errorPage errorPage属性用来指定一个Jsp页面,该页面用来处理当前页面中抛出但未被捕获的任何异常。 指定的页面可以通过exception变量访问抛出的异常。 【注意】 errorPage属性指定页面专用的错误页面。 如果要为整个web应用之多逆光错误页面或者为应用中不同类型的错误指定错误处理页面, 则需要使用web.xml中的error-page。 【语法】 <%@ page errorPage="someurl.jsp" %> 【示例】 //some.jsp <html> <body> <%@ page errorPage="/WEB-INF/myErrors.jsp" %> <% String num1 = request.getParameter("num1"); String num2 = request.getParameter("num2"); int result = Integer.parseInt(num1)/Integer.parseInt(num2);//如果num2=0则会抛出异常 %> <%= result %> </body> </html> ///WEB-INF/myErrors.jsp <html> <body> <%@ page isErrorPage="true" %> <%= exception %> <%@ page import="java.io.*"%> <% exception.printStackTrace(new PrintWriter(out)); %> </body> </html> ------------------------------------------- 9.isErrorPage属性 isErrorPage指定当前页是否可以作为其他Jsp页面的错误页面。 【语法】 <%@ page isErrorPage="true" %> 或 <%@ page isErrorPage="false" %> <%--默认--%> ------------------------------------------- 10.isThreadSafe属性(不要使用该属性,应该使用显示的同步措施) isThreadSafe属性控制由Jsp页面生成的servlet是允许并行访问(默认), 还是同一时间不允许多个请求访问单个servlet实例(isThreadSafe="false")。 【注意】 因为SingleThreadModel的设计很差,使得它基本上毫无用处。因而,应该避免使用isThreadSafe,采用显示的同步措施取而代之。 放弃吧!忘掉SingleThreadModel和isThreadSafe="false"。 ------------------------------------------- 11.extends属性 extends属性指定Jsp页面所生成的servlet的超类。 【注意】 一般人应该避免使用该属性,除非引用由服务器提供商专为这种目的提供的类。 【语法】 <%@ page extends="package.class" %> ------------------------------------------- 12.language属性 language属性指定页面使用的脚本语言。 【注意】 就现在来说,由于java既是默认选择,也是唯一合法的选择,所有没有必要再去关心这个属性。 【语法】 <%@ page language="java" %>
1,import属性:page指令中唯一容许在同一文档出现多次的属性。属性的值可以以逗号隔开。
指定jsp页面转换成servlet应该输入的包。对于没有明确指定包的类,将根据jsp页面所在的包(生成的servlet的目录)决定类的包的位置。
这意味着,将在jsp页面所在的包来寻找该类。
一定要将实用工具类和bean包放在指定的包中。不要依赖于自动导入。
2,language属性:
用于指定在脚本元素中使用的脚本语言,默认java。在jsp2.0规范中,只能是java。
3,contentType和pageEncodeing属性:
contentType属性设置发送到客户端文档的响应报头的MIME类型和字符编码。多个使用;号分开。
pageEncodeing属性只用于更改字符编码。
servlet默认MIME是text/plain,jsp默认MIME是text/html。
4,session属性:控制页面是否参与会话
默认true。如果存在已有会话,则预定义session变量,绑定到已有会话中。否则创建新会话将其绑定到session。
对于高流量网站,设置false可以节省大量服务器内存。
设置false表示不自动创建新会话,在jsp页面转换为servlet时,这时对变量session的访问导致错误。
设置为false并不是禁用会话跟踪,它只是阻止jsp页面为不拥有会话的用户创建新会话。
* 对于不需要会话跟踪的页面那就设置为false;当设置为false时session对象是不可访问的。
5,isELlgnored属性:
定义在jsp页面中是否执行或忽略EL表达式。true表示忽略,false表示执行。
默认值依赖于web.xml的版本。servlet2.3之前默认true,servlet2.4默认false。
用于JSP版本不一致造成使用EL表达式出现的问题。使用:isELlgnored="true";
6,buffer和autoFlush属性:
buffer属性指定out对象(JspWriter)使用的缓冲区大小,以kb为单位,默认8kb。
none表示不使用缓冲区。这样要求设置报头或状态代码的jsp元素要出现在文件的顶部,任何HTML内容之前。
autoFlush属性控制当缓冲区满了后,是自动清空输出缓冲区(默认true),还是在缓冲区溢出后抛出异常(false)。
在buffer=none的时候,autoFlush=false是错误的。
7,info属性:
定义一个可以在servlet中通过getServletInfo方法获取的字符串。
jsp容器做的是在servlet中生成getServletInfo方法返回info属性指定的String。
8,errorPage和isErrorPage属性:指定页面专用的错误页面。
errorPage属性用来指定一个jsp页面,由该页面来处理当前页面中抛出但没有捕获的任何异常。指定的页面可以通过exception变量访问异常信息。
isErrorPage属性表示当前页是否可以作为其他jsp页面的错误页面。true或false。
错误页面应该放在WEB-INF目录下面,只让服务器访问,也不会生成转发的调用,客户端只能看到最初的请求页面URL,看不到错误页面的URL。
如果为整个web应用程序指定错误页面,或为应用中不同类型的错误指定错误处理页面,使用web.xml中的error-page元素。
如果一个页面通过该属性定义了专有的错误页面,那么在web.XML文件中定义的任何错误页面不会被使用。
只能够在错误处理页面中使用错误对象exception。
9,isThreadSafe属性:采用显式的同步来代替该方法。
控制由jsp页面生成的servlet是否允许并发访问(默认true允许)。
这种阻止并发访问的实现是基于SingleThreadModel接口。所以,避免使用isThreadSafe属性。
10,extends属性:避免使用。这是服务器提供商该做的事情。父类必须是对HttJspPage接口的实现类。而HttJspPage是应用于HTTP协议的请求和响应的JspPage扩展接口。
指定JSP页面生成的servlet的超类。
文件包含指令include:
该指令在一个JSP页面中静态包含另一个JSP页面,被包含文件中所有内容会被原样包含到该JSP页面中。
使用include指令,最终生成一个文件。
在被包含和包含的文件中,不能有相同名称的变量。
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>使用文件包含include指令</title> </head> <body style="margin:0px;"> <%@ include file="top.jsp"%> <table width="781" height="279" border="0" cellpadding="0" cellspacing="0" background="images/center.JPG"> <tr> <td> </td> </tr> </table> <%@ include file="copyright.jsp"%> </body> </html> //top.jsp <%@ page pageEncoding="GB18030"%> <img src="images/banner.JPG"> //copyright.jsp <%@ page pageEncoding="GB18030"%> <% String copyright=" All Copyright © 2009 吉林省明日科技有限公司"; %> <table width="778" height="61" border="0" cellpadding="0" cellspacing="0" background="images/copyright.JPG"> <tr> <td> <%= copyright %></td> </tr> </table>
引用标签库指令taglib:……。
2.JSP脚本标识
JSP表达式:<%= 表达式 %>。
声明标识:<%! 声明变量或方法 %> :
服务器执行JSP页面时会将JSP页面转换成Servlet类,在该类中会把JSP声明标识的变量和方法转换成类的成员变量和方法。
代码片段:<%..(Java代码或脚本代码)..%>。
通过声明标识创建的变量和方法生命周期一直到服务器关闭,而代码片段创建的变量和方法只在当前JSP页面中有效,页面关闭后就会销毁。
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title></title> </head> <body> <% String str = ""; //声明保存九九乘法表的字符串变量 //连接生成九九乘法表的字符串 for (int i = 1; i <= 9; i++) { // 外循环 for (int j = 1; j <= i; j++) { // 内循环 str += j + "×" + i + "=" + j * i; str += " "; //加入空格符 } str += "<br>"; // 加入换行符 } %> <table width="440" height="85" border="1" cellpadding="0" cellspacing="0" style="font:9pt;" bordercolordark="#666666" bordercolorlight="#FFFFFF" bordercolor="#FFFFFF"> <tr> <td height="30" align="center">九九乘法表</td> </tr> <tr> <td style="padding:3pt"><%=str %><!-- 输出九九乘法表 --></td> </tr> </table> </body> </html>
3.注释
注释:<!-- HTML注释 -->; <%-- 隐藏注释 -->,<% //注释 %>, <% /* 注释 */ %> , <% /** 注释 */ %>。
HTML注释在客户端不可见,但通过查看HTML源代码是可以看见此注释的。
注意即使一个代码片段用HTML注释起来,该代码片段仍然有被执行。
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>HTML注释的应用</title> </head> <body> <!-- 显示用户信息 --> <!-- 时间:<%=new java.util.Date().toLocaleString()%> --> 用户名:mr<br> 部 门:Java Web部门 <br> 权 限:系统管理员 </body> </html>
隐藏注释在浏览器中看不到,在HTML源代码中同样看不到。
JSP编译时会忽略掉隐藏注释,即隐藏注释是不会被执行的。
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>隐藏注释的应用</title> </head> <body> <%-- 显示用户信息开始 --%> 用户名:无语<br> 部 门:Java Web部门 <br> 权 限:系统管理员 <%-- 显示用户信息结束 --%> </body> </html>
4.JSP动作标识
是在请求处理阶段按照在页面中出现的顺序被执行的,用于实现某些用途的标识。
<jsp:标识名 属性名="值">
操作JavaBean的动作标识:
(JavaBean是用Java代码编写的一个类)
<jsp:useBean id="实例名" scope="生命周期范围" class="完整类名" …>:实例化JavaBean对象。
<jsp:setProperty name="JavaBean实例名" property=“属性名" value="值" param="请求参数">。
package com.wgh; public class UserInfo { private String name = "";// 用户名 private String pwd = "";// 密码 // name属性对应的set方法 public void setName(String name) { this.name = name; } // name属性对应的get方法 public String getName() { return name; } // pwd属性对应的set方法 public void setPwd(String pwd) { this.pwd = pwd; } // pwd属性对应的get方法 public String getPwd() { return pwd; } }
//index.jsp <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>用户登录</title> </head> <body style="font: 9pt;"> <form name="form1" method="post" action="deal.jsp"> 用户名: <input name="name" type="text" id="name" style="width: 120px">(请输入英文的用户名) <br> 密 码: <input name="pwd" type="password" id="pwd" style="width: 120px"> <br> <br> <input type="submit" name="Submit" value="提交"> </form> </body> </html> //deal.jsp <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <jsp:useBean id="user" scope="page" class="com.wgh.UserInfo" type="com.wgh.UserInfo"> <jsp:setProperty name="user" property="name" param="name" /> <jsp:setProperty name="user" property="pwd" param="pwd" /> </jsp:useBean> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>显示用户登录信息</title> </head> <body> 用户名:<%=user.getName() %><br> 密码:<%=user.getPwd() %> </body> </html>
<jsp:getProperty name="JavaBean实例名" property=“属性名" >:该标识会根据page,request,session,Application的顺序查找该JavaBean对象。
//将上例deal.jsp中部分修改: 用户名:<jsp:getProperty name="user" property="name"/><br> 密码:<jsp:getProperty name="user" property="pwd"/>
包含外部文件的动作标识:
<jsp:include page="url" flush="true|false"/>。
jsp:include标识可以是动态包含和静态包含,如果是动态包含,则JSP编译器会先编译执行被包含文件,生成静态文件后添加到包含文件中去,再编译执行包含文件。
jsp:include标识包含文件时,由于每个文件单独编译,所以包含文件和被包含文件的变量和方法名可以重名。
jsp:include标识不用于include指令。
执行请求转发的动作标识:
<jsp:forward page="url"/>
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>中转页</title> </head> <body> <jsp:forward page="login.jsp"/> </body> </html>
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>用户登录</title> </head> <body> <form name="form1" method="post" action=""> 用户名: <input name="name" type="text" id="name" style="width: 120px"><br> 密 码: <input name="pwd" type="password" id="pwd" style="width: 120px"> <br> <br> <input type="submit" name="Submit" value="提交"> </form> </body> </html>
子动作标识设置参数:
<jsp:param name="参数名" value="值"/>
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>中转页</title> </head> <body> <jsp:forward page="login.jsp"/> <jsp:param name="name" value="mao" /> </body> </html>
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>用户登录</title> </head> <body> <form name="form1" method="post" action=""> 用户名: <input name="name" type="text" id="name" style="width: 120px" value="<%= request.getParameter %>"><br> 密 码: <input name="pwd" type="password" id="pwd" style="width: 120px"> <br> <br> <input type="submit" name="Submit" value="提交"> </form> </body> </html>