JSP
1. JSP页⾯的基本结构
在传统的HTML页⾯中加⼊Java程序⽚和JSP标签,就构成了⼀个JSP页⾯。⼀个JSP页⾯可由5种元素组合⽽成:(1)普通的HTML标记符;(2)JSP标记,如指令标记、动作标记;(3)成员变量和⽅法;(4)Java程序⽚;(5)Java表达式。
【例2-1】
<%@ page contentType="text/html;charset=UTF-8" %>    <!--JSP指令标记-->
<%@ page import="java.util.Date" %>    <!--JSP指令标记-->
<%! Date date;    //数据声明
int sum;
public int add(int m,int n){    //⽅法声明
return m+n;
}
%>
<HTML><BODY bgcolor=cyan>    <!--HTML标记-->
<FONT size=4><P>程序⽚创建Date对象:
<% date=new Date();    //Java程序⽚
out.println("<BR>"+date);
sum=add(12,34);
%>
<BR>在下⼀⾏输出和:<BR>
<%= sum+100 %>    <!--Java表达式-->
</FONT></BODY></HTML>
2. JSP的运⾏原理
当Tomcat服务器上的⼀个JSP页⾯第⼀次被请求执⾏时,Tomcat服务器将启动⼀个线程。该线程的任务是,⾸先将JSP页⾯⽂件转移成⼀个Java⽂件,再将这个Java⽂件编译成⼀个字节码⽂件,并将该字节码⽂件加载到内存中,然后执⾏字节码⽂件响应客户的请求,该线程完成任务后,线程进⼊死亡状态。这个字节码的功能如下:
(1)把JSP页⾯中普通的HTML标记符号,交给客户的浏览器执⾏显⽰。
(2)JSP标记、数据和⽅法声明、Java程序⽚由Tomcat服务器负责执⾏,将需要显⽰的结果发送给客户的浏览器。
(3)Java表达式由Tomcat服务器负责计算,将结果转化为字符串,交给客户的浏览器负责显⽰。
被加载到内存中的字节码将常驻内存,当这个JSP页⾯再次被请求执⾏时,Tomcat服务器将再启动⼀个线程,直接执⾏常驻内存的字节码⽂件来响应客户。这也是JSP⽐ASP速度快的⼀个原因。⽽JSP页⾯的⾸次执⾏往往由服务器管理者来进⾏。
当多个客户请求⼀个JSP页⾯时,Tomcat服务器为每个客户启动⼀个线程,该线程负责执⾏常驻内存的字节码⽂件来响应相应客户的请求。这些线程由Tomcat服务器来管理,将CPU的使⽤权在各线程之
间快速切换,以保证每个线程都有机会执⾏字节码⽂件,这与传统的CGI为每个⽤户启动⼀个进程相⽐较,效率要⾼得多。
注:如果对JSP页⾯进⾏了修改、保存,那么Tomcat服务器会⽣成新的字节码。
下⾯是Tomcat服务器⽣成的example2_1.jsp的Java⽂件,我们把Tomcat服务器交给客户端浏览器显⽰的内容作了注释(&)。在Tomcat服务器下的⽬录work\Catalina\localhost\chapter2\org\apache\jsp中,可以到Tomcat服务器⽣成的JSP页⾯对应的Java⽂件和编译Java⽂件得到的字节码⽂件。
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/7.0.29
* Generated at: 2013-05-07 13:29:20 UTC
* Note: The last modified time of this file was set to
*      the last modified time of the source file after
*      generation to assist with modification tracking.
*/
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.Date;
public final class example2_005f1_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
Date date;    //数据声明
int sum;
public int add(int m,int n){    //⽅法声明
return m+n;
}
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.DefaultFactory();
private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
private javax.el.ExpressionFactory _el_expressionfactory;
private at.InstanceManager _jsp_instancemanager;
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public void _jspInit() {
_el_expressionfactory = _JspApplicationContext(getServletConfig().getServletContext()).getExpressionFactor
jsp和html哪个更好
_jsp_instancemanager = org.apache.jasper.InstanceManager(getServletConfig());
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse respon
throws java.io.IOException, javax.servlet.ServletException {
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=UTF-8");
pageContext = _PageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = ServletContext();
config = ServletConfig();
out = Out();
_jspx_out = out;
out.write("    <!--JSP指令标记-->\r\n");    (&)
out.write("    <!--JSP指令标记-->\r\n");    (&)
out.write("\r\n");    (&)
out.write("<HTML><BODY bgcolor=cyan>    <!--HTML标记-->\r\n");    (&)
out.write("<FONT size=4><P>程序⽚创建Date对象:\r\n");    (&)
date=new Date();    //Java程序⽚
out.println("<BR>"+date);
sum=add(12,34);
out.write("\r\n");    (&)
out.write("<BR>在下⼀⾏输出和:<BR>\r\n");    (&)
out.print( sum+100 );    (&)
out.write("    <!--Java表达式-->\r\n");    (&)
out.write("</FONT></BODY></HTML> ");    (&)
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && BufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);        else throw new ServletException(t);
}
} finally {
_leasePageContext(_jspx_page_context);
}
}
}
3. JSP页⾯的成员变量和⽅法
JSP页⾯可包含HTML标记、JSP指令标记、成员变量和⽅法、Java程序⽚和Java表达式。JSP页⾯在标记符“<%!”和“%>”之间声明他的成员变量和⽅法。
可以在JSP页⾯的标记符“<%!”和“%>”之间声明变量,即在“<%!”和“%>”之间放置Java的变量声明语句,变量的类型可以是Java 语⾔允许的任何数据类型。
标记符“<%!”和“%>”之间声明的变量称为JSP页⾯的成员变量。例如:
<%! Int x,y=100;
Date date;
%>
“<%!”和“%>”之间声明的变量在整个JSP页⾯内有效,因为Tomcat服务器将JSP页⾯转译成Java⽂件时,将这些变量作为类的成员变量,这些变量的内存空间直到服务器关闭才释放。当多个客户请求⼀个JSP页⾯时,Tomcat服务器为每个客户启动⼀个线程,这些⽤户线程将共享JSP页⾯的成员变量。这些⽤户线程由Tomcat服务器来管理,Tomcat服务器将CPU的使⽤权在各个线程间快速切换,以保证每个线程轮流执⾏JSP页⾯(对应的字节码),因此任何⼀个线程对JSP页⾯成员变量操作的结果,都会影响到其他线程。
【例2】利⽤成员变量被所有⽤户共享这⼀性质,实现⼀个简单的计数器。
Example2_2.jsp
<%@ page contentType="text/html;charset=UTF-8" %>
<HTML><BODY bgcolor=pink><FONT size=4>
<%! int i=0;
%>
<% i++;
%>
<P>您是第<%=i%>个访问本站的客户。
</BODY></HTML>
效果如图所⽰:
(2)声明⽅法
JSP在“<%!”和“%>”之间定义若⼲个⽅法,这些⽅法可以在Java程序⽚中被调⽤执⾏。在例3中,我们在“<%!”和“%>”之间定义了两个⽅法:add(int x,int y)和sub(int x,int y),然后在程序⽚中调⽤这两个⽅法。
【例3】
Example2_3.jsp
<%@ page contentType="text/html;Charset=UTF-8" %>
<HTML><BODY bgcolor=yellow>
<%! int add(int x,int y){
return x+y;
}
int sub(int x,int y){

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。