JSP全稱是Java Server Pages东臀,它和servle技術(shù)一樣超升,都是SUN公司定義的一種用于開發(fā)動(dòng)態(tài)web資源的技術(shù)涣易,jsp文件相當(dāng)于在html頁面嵌套java代碼雏亚,即方便排版又為用戶提供了動(dòng)態(tài)數(shù)據(jù)摊沉。
1. 第一個(gè)JSP頁面
如下所示厂财,我們?cè)?.WebRoot目錄下面定義firstJSP.jsp并寫下內(nèi)容芋簿,布置到tomcat服務(wù)器后我們就可以像訪問靜態(tài)html頁面一樣去訪問該頁面。
<%@ page language="java" import="java.util.*,java.text.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>第一個(gè)jsp頁面</title>
</head>
<body>
<%
//寫java代碼
//獲取當(dāng)前時(shí)間
SimpleDateFormat sdf = new SimpleDateFormat();
String curDate = sdf.format(new Date());
//輸出內(nèi)容到瀏覽器
//response.getWriter().write("");
out.write("當(dāng)前時(shí)間為:"+curDate);
%>
</body>
</html>
效果如下:
2.JSP頁面執(zhí)行過程
我們接下來看下JSP頁面是如何編繹嵌套在html里面的代碼璃饱,并向?yàn)g覽器輸出与斤。
首先,tomcat服務(wù)器在瀏覽器每一次訪問時(shí)就將jsp文件翻譯成java文件,并把java文件編繹成class字節(jié)碼文件撩穿,我們?cè)趖omcat的work對(duì)應(yīng)項(xiàng)目目錄下可以找到這兩個(gè)文件:
然后看一下firstJSP_jsp.java里面的內(nèi)容:
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/7.0.57
* Generated at: 2017-06-07 11:33:50 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.*;
import java.text.*;
public final class firstJSP_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.tomcat.InstanceManager _jsp_instancemanager;
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
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 = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\r\n");
out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
out.write("<html>\r\n");
out.write(" <head> \r\n");
out.write(" <title>第一個(gè)jsp頁面</title> \r\n");
out.write(" </head>\r\n");
out.write(" \r\n");
out.write(" <body>\r\n");
out.write(" ");
//寫java代碼
//獲取當(dāng)前時(shí)間
SimpleDateFormat sdf = new SimpleDateFormat();
String curDate = sdf.format(new Date());
//輸出內(nèi)容到瀏覽器
//response.getWriter().write("");
out.write("當(dāng)前時(shí)間為:"+curDate);
out.write("\r\n");
out.write(" </body>\r\n");
out.write("</html>\r\n");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
通過上面的源碼知道翻譯成的java文件是一個(gè)HttpJspBase類磷支,查看API可知該類繼承于HttpServlet,到此為止我們基本上可以下一個(gè)結(jié)論:Jsp就是一個(gè)servlet程序
當(dāng)我們每次訪問JSP頁面時(shí)就會(huì)執(zhí)行類里面的_jspService方法食寡,可以看到這個(gè)方法包含了JSP頁面的所有內(nèi)容齐唆。并且放在一個(gè)try代碼塊里面。
同Servlet的生命周期類似冻河,該類的構(gòu)造方法和_jspInit()方法只在每一次訪問時(shí)執(zhí)行箍邮,在tomcat服務(wù)器重新布署時(shí)執(zhí)行_jspDestroy()方法。
將JSP頁面的執(zhí)行過程用流程圖的形式總結(jié)如下:
3.JSP語法
3.1 Jsp模板
jsp頁面中的html代碼就是jsp的模板
3.2 Jsp表達(dá)式
語法:<%=變量或表達(dá)式%>
舉例:
作用: 向?yàn)g覽器輸出變量的值或表達(dá)式計(jì)算的結(jié)果
注意:
1)表達(dá)式的原理就是翻譯成out.print(“變量” );通過該方法向?yàn)g覽器寫出內(nèi)容
2)表達(dá)式后面不需要帶分號(hào)結(jié)束叨叙。
3.3 Jsp的腳本
語法:<%java代碼 %>
作用: 執(zhí)行java代碼
注意:
1)原理把腳本中java代碼原封不動(dòng)拷貝到_jspService方法中執(zhí)行锭弊。
3.4 Jsp的聲明
語法:<%! 變量或方法 %>
作用: 聲明jsp的變量或方法
注意:
1)變量翻譯成成員變量,方法翻譯成成員方法擂错。
3.5 Jsp的注釋
語法: <%!-- jsp注釋 --%>
注意;
1)html的注釋會(huì)被翻譯和執(zhí)行味滞。而jsp的注釋不能被翻譯和執(zhí)行。
4 Jsp的三大指令
4.1 include指令
作用: 在當(dāng)前頁面用于包含其他頁面
語法: <%@include file="common/header.jsp"%>
注意:
1)原理是把被包含的頁面(header.jsp)的內(nèi)容翻譯到包含頁面(index.jsp)中,合并成翻譯成一個(gè)java源文件钮呀,再編譯運(yùn)行=0啊!爽醋,這種包含叫靜態(tài)包含(源碼包含)
2)如果使用靜態(tài)包含蚁署,被包含頁面中不需要出現(xiàn)全局的html標(biāo)簽了!B焖摹9飧辍(如html、head遂赠、 body)
4.2 page指令
作用: 告訴tomcat服務(wù)器如何翻譯jsp文件
語法:
<%@ page
language="java" --告訴服務(wù)器使用什么動(dòng)態(tài)語言來翻譯jsp文件
import="java.util.*" --告訴服務(wù)器java文件使用什么包,導(dǎo)入包久妆,多個(gè)包之間用逗號(hào)分割
pageEncoding="utf-8" --告訴服務(wù)器使用什么編碼翻譯jsp文件(成java文件)
contentType="text/html; charset=utf-8" 服務(wù)器發(fā)送瀏覽器的數(shù)據(jù)類型和內(nèi)容編碼
注意:在開發(fā)工具中,以后只需要設(shè)置pageEncoding即可解決中文亂碼問題
errorPage: 指定當(dāng)前jsp頁面的錯(cuò)誤處理頁面跷睦。
isErorrPage: 指定當(dāng)前頁面是否為錯(cuò)誤處理頁面筷弦。false,不是錯(cuò)誤處理頁面抑诸,則不能使用 exception內(nèi)置對(duì)象烂琴;true,是錯(cuò)誤處理頁面哼鬓,可以使用exception內(nèi)置對(duì)象监右。
配置全局的錯(cuò)誤處理頁面可在web.xml添加如下內(nèi)容:
<!-- 全局錯(cuò)誤處理頁面配置 -->
<error-page>
<error-code>500</error-code>
<location>/common/500.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/common/404.html</location>
</error-page>
session: 是否開啟session功能。false异希,不能用session內(nèi)置對(duì)象;true,可以使用session內(nèi)置對(duì)象称簿。
buffer: jsp頁面的緩存區(qū)大小扣癣。
isELIgnore: 是否忽略EL表達(dá)式。
%>
4.3 taglib指令
Taglib指令用于在JSP頁面中導(dǎo)入標(biāo)簽庫,后面再看
5.JSP基本組成語法實(shí)例
header.jsp:用于測(cè)試include指令
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
頭部頁面的內(nèi)容
script.jsp:
<!-- page指令 -->
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Jsp語法</title>
</head>
<body>
<!-- include指令 -->
<%@include file="common/header.jsp"%>
<!-- jsp表達(dá)式 -->
<%
//變量
String name = "acamy";
int a = 10;
int b =20;
%>
<%=name %>
<br/>
<%=(a-b) %>
<hr/>
<!-- jsp腳本 -->
<%
//生成隨機(jī)數(shù)
Random ran = new Random();
float num = ran.nextFloat();
%>
隨機(jī)小數(shù):<%=num %>
<hr/>
<!-- 穿插html代碼 -->
<%
for(int i=1;i<=6;i++){
%>
<h<%=i %>>標(biāo)題<%=i %></h<%=i %>>
<%
}
%>
<hr/>
<!-- 練習(xí): 使用腳本和html代碼顯示99乘法表 -->
<%
for(int i=1;i<=9;i++){//行
for(int j=1;j<=i;j++){//公式
%>
<%=i %> x <%=j %>=<%=(i*j) %>
<%
}
%>
<br/>
<%
}
%>
<%
String age = "20";
/* 腳本中不能聲明方法
public String getAge(){
return age;
}
*/
%>
<!-- jsp聲明 -->
<%!
//變量
String name = "jacky";
public String getName(){
return name;
}
/*jsp聲明中不能重復(fù)定義翻譯好的一些方法
public void _jspInit(){
}
*/
%>
<!-- html注釋 -->
<%-- <jsp:forward page="/01.hello.jsp"></jsp:forward> --%>
<%-- jsp注釋 --%>
</body>
</html>
效果如下: