JSP全名爲Java Server Pages,java服務器頁面。JSP是一種基於文本的程序,其特色就是HTML和Java代碼共同存在!html
JSP是爲了簡化Servlet的工做出現的替代品,Servlet輸出HTML很是困難,JSP就是替代Servlet輸出HTML的。java
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>簡單使用JSP</title> </head> <body> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>簡單使用JSP</title> </head> <body> <% String s = "HelloWorld"; out.println(s); %> </body> </html>
package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; import java.util.Date; public final class _1_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory(); private static java.util.List<String> _jspx_dependants; private javax.el.ExpressionFactory _el_expressionfactory; private org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.List<String> 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 HttpServletRequest request, final HttpServletResponse response) throws java.io.IOException, ServletException { final PageContext pageContext; HttpSession session = null; final ServletContext application; final ServletConfig config; JspWriter out = null; final Object page = this; JspWriter _jspx_out = null; 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("\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("<body>\r\n"); String s = "HelloWorda"; out.println(s); out.write("\r\n"); out.write("</body>\r\n"); out.write("</html>\r\n"); } catch (Throwable t) { if (!(t instanceof SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) try { out.clearBuffer(); } catch (java.io.IOException e) {} if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); } } finally { _jspxFactory.releasePageContext(_jspx_page_context); } } }
out.write("\r\n"); out.write("\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("<body>\r\n");
String s = "HelloWorda"; out.println(s);
JSP也是Servlet,運行時只有一個實例,JSP初始化和銷燬時也會調用Servlet的init()和destroy()方法。另外,JSP還有本身初始化和銷燬的方法web
public void _jspInit() { _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); } public void _jspDestroy() { }
JSP代碼能夠分爲兩部分:express
JSP的腳本就是JSP頁面中的java代碼,也叫作scriptlet。JSP的腳本必須使用<%%>括起來,否則會被當成是模板數據的!apache
JSP腳本有三種方式:瀏覽器
若是過多地使用<%%>會致使代碼混亂,JSP還提供了一種scriptlet標籤,使用此標籤和<%%>有相同的功能,只不過它更美觀了一些tomcat
<jsp:scriptlet> String s = "HelloWorld"; out.println(s); </jsp:scriptlet>
<%--這是JSP註釋--%> <%--%> //這是java的當行註釋 // /*這是java的多行註釋*/ /**/
JSP指令用來聲明JSP頁面的相關屬性,例如編碼方式、文檔類型等等服務器
JSP指令的語法:微信
<%@指令 屬性名="值" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
page指令常見屬性:session
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="relative_url"
isErrorPage="true | false"
contentType="mimeType ;charset=characterSet " | "text/html ; charset=ISO-8859-1"
pageEncoding="characterSet | ISO-8859-1"
isELIgnored="true | false"
通常地,在eclipse或idea這些高級開發工具上開發,咱們只須要在page指令中指定contentType="text/html;charset=UTF-8",就不會出現中文亂碼問題!
固然了contentType 不只僅能夠指定以text/html的方式顯示,還可使用其餘的形式顯示出來。在conf/web.xml文件中能夠查詢出來
<%@ page contentType="application/msword;charset=UTF-8" language="java" %> <html> <head> <title>簡單使用JSP</title> </head> <body> 1111 </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %> <html> <head> <title>該頁面出錯了!</title> </head> <body> <%--模擬頁面出錯了!!!--%> <% int result = 2 / 0; %> 你好呀 </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %> <html> <head> <title>友好提示頁面</title> </head> <body> 服務器正忙着呢! </body> </html>
<error-page> <error-code>404</error-code> <location>/error.jsp</location> </error-page> <error-page> <exception-type>java.lang.NullPointerException</exception-type> <location>/error.jsp</location> </error-page>
在講解request對象的時候,咱們曾經使用過request.getRequestDispatcher(String url).include(request,response)來對頁頭和頁尾面進行包含
inclue指令也是作這樣的事情,咱們來試驗一下吧!
這是頁頭
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>頁頭</title> </head> <body> 我是頁頭 <br> <br> <br> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>頁尾</title> </head> <body> 我是頁尾 </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>包含頁頭和頁尾進來</title> </head> <body> <%@include file="head.jsp" %> <%@include file="foot.jsp" %> </body> </html>
JSP行爲(JSP Actions)是一組JSP內置的標籤,只書寫少許的標記代碼就可以使用JSP提供豐富的功能,JSP行爲是對經常使用的JSP功能的抽象和封裝。
爲何我不把它直接稱爲JSP標籤呢?我把這些JSP內置的標籤稱之爲JSP行爲,可以和JSTL標籤區分開來。固然了,你也能夠把它稱之爲JSP標籤,你不要搞混就好了。我我的喜歡把這些JSP內置標籤稱之爲JSP行爲。
<jsp:include page=""/>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>包含頁頭和頁尾進來</title> </head> <body> <jsp:include page="head.jsp"/> <jsp:include page="foot.jsp"/> </body> </html>
jsp行爲包含文件就是先編譯被包含的頁面,再將頁面的結果寫入到包含的頁面中(1.jsp)
固然了,如今有靜態包含和動態包含,使用哪個更好呢?答案是:動態包含。
動態包含能夠向被包含的頁面傳遞參數(用處不大),而且是分別處理被包含頁面的(將被包含頁面編譯後得出的結果再寫進包含頁面)【若是有相同名稱的參數,使用靜態包含就會報錯!】!
模擬一下場景吧,如今個人頭頁面有個名爲s的字符串變量
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>頁頭</title> </head> <body> <% String s = "zhongfucheng"; %> 我是頁頭呀 <br> <br> <br> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>頁尾</title> </head> <body> <% String s = "zhongfucheng"; %> 我是頁尾呀 </body> </html>
<jsp:forward page=""/>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>訪問1.jsp就跳轉到head.jsp</title> </head> <body> <jsp:forward page="head.jsp"/> </body> </html>
<jsp:forward page="head.jsp"> <jsp:param name="username" value="zhongfucheng"/> </jsp:forward>
<% String ss = request.getParameter("username"); %> 獲取到的參數是: <%=ss%>
directive的中文意思就是指令。該行爲就是替代指令<%@%>的語法的
咱們來試一下能不能用的
<jsp:directive.include file="head.jsp"></jsp:directive.include> <jsp:directive.include file="foot.jsp"></jsp:directive.include>
<jsp:scriptlet>
替代<%%>是一樣一個道理<jsp:useBean id=""/>
<jsp:setProperty name="" property=""/>
<jsp:getProperty name="" property=""/>
若是文章有錯的地方歡迎指正,你們互相交流。習慣在微信看技術文章的同窗,能夠關注微信公衆號:Java3y