JSP全稱是Java Server Pages,它和servle技術一樣,都是SUN公司定義的一種用于開發動態web資源的技術,jsp文件相當于在html頁面嵌套java代碼,即方便排版又為用戶提供了動態數據。
1. 第一個JSP頁面
如下所示,我們在..WebRoot目錄下面定義firstJSP.jsp并寫下內容,布置到tomcat服務器后我們就可以像訪問靜態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>第一個jsp頁面</title>
</head>
<body>
<%
//寫java代碼
//獲取當前時間
SimpleDateFormat sdf = new SimpleDateFormat();
String curDate = sdf.format(new Date());
//輸出內容到瀏覽器
//response.getWriter().write("");
out.write("當前時間為:"+curDate);
%>
</body>
</html>
效果如下:
2.JSP頁面執行過程
我們接下來看下JSP頁面是如何編繹嵌套在html里面的代碼,并向瀏覽器輸出。
首先,tomcat服務器在瀏覽器每一次訪問時就將jsp文件翻譯成java文件,并把java文件編繹成class字節碼文件,我們在tomcat的work對應項目目錄下可以找到這兩個文件:
然后看一下firstJSP_jsp.java里面的內容:
/*
* 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>第一個jsp頁面</title> \r\n");
out.write(" </head>\r\n");
out.write(" \r\n");
out.write(" <body>\r\n");
out.write(" ");
//寫java代碼
//獲取當前時間
SimpleDateFormat sdf = new SimpleDateFormat();
String curDate = sdf.format(new Date());
//輸出內容到瀏覽器
//response.getWriter().write("");
out.write("當前時間為:"+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文件是一個HttpJspBase類,查看API可知該類繼承于HttpServlet,到此為止我們基本上可以下一個結論:Jsp就是一個servlet程序
當我們每次訪問JSP頁面時就會執行類里面的_jspService方法,可以看到這個方法包含了JSP頁面的所有內容。并且放在一個try代碼塊里面。
同Servlet的生命周期類似,該類的構造方法和_jspInit()方法只在每一次訪問時執行,在tomcat服務器重新布署時執行_jspDestroy()方法。
將JSP頁面的執行過程用流程圖的形式總結如下:
3.JSP語法
3.1 Jsp模板
jsp頁面中的html代碼就是jsp的模板
3.2 Jsp表達式
語法:<%=變量或表達式%>
舉例:
作用: 向瀏覽器輸出變量的值或表達式計算的結果
注意:
1)表達式的原理就是翻譯成out.print(“變量” );通過該方法向瀏覽器寫出內容
2)表達式后面不需要帶分號結束。
3.3 Jsp的腳本
語法:<%java代碼 %>
作用: 執行java代碼
注意:
1)原理把腳本中java代碼原封不動拷貝到_jspService方法中執行。
3.4 Jsp的聲明
語法:<%! 變量或方法 %>
作用: 聲明jsp的變量或方法
注意:
1)變量翻譯成成員變量,方法翻譯成成員方法。
3.5 Jsp的注釋
語法: <%!-- jsp注釋 --%>
注意;
1)html的注釋會被翻譯和執行。而jsp的注釋不能被翻譯和執行。
4 Jsp的三大指令
4.1 include指令
作用: 在當前頁面用于包含其他頁面
語法: <%@include file="common/header.jsp"%>
注意:
1)原理是把被包含的頁面(header.jsp)的內容翻譯到包含頁面(index.jsp)中,合并成翻譯成一個java源文件,再編譯運行!!,這種包含叫靜態包含(源碼包含)
2)如果使用靜態包含,被包含頁面中不需要出現全局的html標簽了!?。。ㄈ鏷tml、head、 body)
4.2 page指令
作用: 告訴tomcat服務器如何翻譯jsp文件
語法:
<%@ page
language="java" --告訴服務器使用什么動態語言來翻譯jsp文件
import="java.util.*" --告訴服務器java文件使用什么包,導入包,多個包之間用逗號分割
pageEncoding="utf-8" --告訴服務器使用什么編碼翻譯jsp文件(成java文件)
contentType="text/html; charset=utf-8" 服務器發送瀏覽器的數據類型和內容編碼
注意:在開發工具中,以后只需要設置pageEncoding即可解決中文亂碼問題
errorPage: 指定當前jsp頁面的錯誤處理頁面。
isErorrPage: 指定當前頁面是否為錯誤處理頁面。false,不是錯誤處理頁面,則不能使用 exception內置對象;true,是錯誤處理頁面,可以使用exception內置對象。
配置全局的錯誤處理頁面可在web.xml添加如下內容:
<!-- 全局錯誤處理頁面配置 -->
<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內置對象;true,可以使用session內置對象。
buffer: jsp頁面的緩存區大小。
isELIgnore: 是否忽略EL表達式。
%>
4.3 taglib指令
Taglib指令用于在JSP頁面中導入標簽庫,后面再看
5.JSP基本組成語法實例
header.jsp:用于測試include指令
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
頭部頁面的內容
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表達式 -->
<%
//變量
String name = "acamy";
int a = 10;
int b =20;
%>
<%=name %>
<br/>
<%=(a-b) %>
<hr/>
<!-- jsp腳本 -->
<%
//生成隨機數
Random ran = new Random();
float num = ran.nextFloat();
%>
隨機小數:<%=num %>
<hr/>
<!-- 穿插html代碼 -->
<%
for(int i=1;i<=6;i++){
%>
<h<%=i %>>標題<%=i %></h<%=i %>>
<%
}
%>
<hr/>
<!-- 練習: 使用腳本和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聲明中不能重復定義翻譯好的一些方法
public void _jspInit(){
}
*/
%>
<!-- html注釋 -->
<%-- <jsp:forward page="/01.hello.jsp"></jsp:forward> --%>
<%-- jsp注釋 --%>
</body>
</html>
效果如下: