java后端开发每天遇到的jsp,了解一下
點擊上方“好好學java”,選擇“置頂公眾號”
優秀學習資源、干貨第一時間送達!
?精彩內容?
java實戰練習項目教程
2018微服務資源springboot、springcloud、docker、dubbo實戰等傾心分享
2018年java架構師全套學習教程
最新大數據培訓完整視頻教程
2018年java最新全套培訓學習教程
一、JSP基礎語法
1、JSP模板元素
JSP頁面中的HTML內容稱之為JSP模版元素。
JSP模版元素定義了網頁的基本骨架,即定義了頁面的結構和外觀。
2、JSP腳本片段
JSP腳本片斷(scriptlet)用于在JSP頁面中編寫多行Java代碼(在<%%>不能定義方法)。語法:<%多行java代碼 %>
例如:
<%int?num?=?0;num?=?++num;out.println("num:"?+?num); %>image
注意:
1、JSP腳本片斷中只能出現java代碼,不能出現其它模板元素, JSP引擎在翻譯JSP頁面中,會將JSP腳本片斷中的Java代碼將被原封不動地放到Servlet的_jspService方法中。
2、JSP腳本片斷中的Java代碼必須嚴格遵循Java語法,例如,每執行語句后面必須用分號(;)結束。
3、在一個JSP頁面中可以有多個腳本片斷,在兩個或多個腳本片斷之間可以嵌入文本、HTML標記和其他JSP元素。
4、多個腳本片斷中的代碼可以相互訪問
3、JSP表達式
JSP腳本表達式(expression)用于將程序數據輸出到客戶端,語法:<%=變量或表達式 %>
例如:
<%="123"?%>image
4、JSP聲明
JSP頁面中編寫的所有代碼,默認會翻譯到servlet的service方法中, 而Jsp聲明中的java代碼被翻譯到_jspService方法的外面。語法:<%!java代碼 %>
JSP聲明可用于定義JSP頁面轉換成的Servlet程序的靜態代碼塊、成員變量和方法。
例如:
<%! static?{?System.out.println("靜態代碼塊");? }private?String?name?=?"Zender";public?void?TestFun(){System.out.println("成員方法!"); } %> <%TestFun();out.println("name:"?+?name); %>控制臺:
image頁面:
image5、JSP注釋
在JSP中,注釋有顯式注釋, 隱式注釋,JSP自己的注釋:
| 隱式注釋 | 直接使用JAVA的注釋://、/……/ |
| JSP自己的注釋 | <%- - 注釋內容- -%> |
區別:
HTML的注釋在瀏覽器中查看源文件的時候是可以看得到的,而JAVA注釋和JSP注釋在瀏覽器中查看源文件時是看不到注釋的內容的。
二、JSP原理
1、Web服務器是如何調用并執行一個jsp頁面的?
瀏覽器向服務器發請求,不管訪問的是什么資源,其實都是在訪問Servlet,所以當訪問一個jsp頁面時,其實也是在訪問一個Servlet,服務器在執行jsp的時候,首先把jsp翻譯成一個Servlet,所以我們訪問jsp時,其實不是在訪問jsp,而是在訪問jsp翻譯過后的那個Servlet。
例如下面的代碼:
<%@?page?language="java"?contentType="text/html;?charset=UTF-8"pageEncoding="UTF-8"%> <%String?path?=?request.getContextPath();String?basePath?=?request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE?html?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"?"http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <base?href="<%=basePath%>"> <meta?http-equiv="Content-Type"?content="text/html;?charset=UTF-8"> <title>Insert?title?here</title> </head> <body><%!static?{?System.out.println("靜態代碼塊");?}private?String?name?=?"Zender";public?void?TestFun(){System.out.println("成員方法!");}%><%TestFun();out.println("name:"?+?name);%> </body> </html>當我們通過瀏覽器訪問index.jsp時,服務器首先將index.jsp翻譯成一個index_jsp.class,在Tomcat服務器的work\Catalina\localhost\項目名\org\apache\jsp目錄下可以看到index_jsp.class的源代碼文件index_jsp.java
imageindex_jsp.java的代碼如下:
package?org.apache.jsp;import?javax.servlet.*; import?javax.servlet.http.*; import?javax.servlet.jsp.*;public?final?class?index_jsp?extends?org.apache.jasper.runtime.HttpJspBaseimplements?org.apache.jasper.runtime.JspSourceDependent?{static?{?System.out.println("靜態代碼塊");?}private?String?name?=?"Zender";public?void?TestFun(){System.out.println("成員方法!");}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?volatile?javax.el.ExpressionFactory?_el_expressionfactory;private?volatile?org.apache.tomcat.InstanceManager?_jsp_instancemanager;public?java.util.Map<java.lang.String,java.lang.Long>?getDependants()?{return?_jspx_dependants;}public?javax.el.ExpressionFactory?_jsp_getExpressionFactory()?{if?(_el_expressionfactory?==?null)?{synchronized?(this)?{if?(_el_expressionfactory?==?null)?{_el_expressionfactory?=?_jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();}}}return?_el_expressionfactory;}public?org.apache.tomcat.InstanceManager?_jsp_getInstanceManager()?{if?(_jsp_instancemanager?==?null)?{synchronized?(this)?{if?(_jsp_instancemanager?==?null)?{_jsp_instancemanager?=?org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());}}}return?_jsp_instancemanager;}public?void?_jspInit()?{}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\"?\"http://www.w3.org/TR/html4/loose.dtd\">\r\n");out.write("<html>\r\n");out.write("<head>\r\n");out.write("<meta?http-equiv=\"Content-Type\"?content=\"text/html;?charset=UTF-8\">\r\n");out.write("<title>Insert?title?here</title>\r\n");out.write("</head>\r\n");out.write("<body>\r\n");out.write("\t");out.write('\r');out.write('\n');out.write('???');TestFun();out.println("name:"?+?name);out.write("\r\n");out.write("</body>\r\n");out.write("</html>");}?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);}} }index_jsp這個類是繼承org.apache.jasper.runtime.HttpJspBase這個類的,通過查看HttpJspBase源代碼,可以知道HttpJspBase類是繼承HttpServlet的,所以HttpJspBase類是一個Servlet,而index_jsp又是繼承HttpJspBase類的,所以index_jsp類也是一個Servlet,所以當瀏覽器訪問服務器上的index.jsp頁面時,其實就是在訪問index_jsp這個Servlet,index_jsp這個Servlet使用_jspService這個方法處理請求。
HttpJspBase源碼如下:
import?java.io.IOException;import?javax.servlet.ServletConfig; import?javax.servlet.ServletException; import?javax.servlet.http.HttpServlet; import?javax.servlet.http.HttpServletRequest; import?javax.servlet.http.HttpServletResponse; import?javax.servlet.jsp.HttpJspPage; import?javax.servlet.jsp.JspFactory;import?org.apache.jasper.compiler.Localizer;public?abstract?class?HttpJspBase?extends?HttpServlet?implements?HttpJspPage{protected?HttpJspBase()?{}public?final?void?init(ServletConfig?config)?throws?ServletException?{super.init(config);jspInit();_jspInit();}public?String?getServletInfo()?{return?Localizer.getMessage("jsp.engine.info");}public?final?void?destroy()?{jspDestroy();_jspDestroy();}/***?Entry?point?into?service.*/public?final?void?service(HttpServletRequest?request,?HttpServletResponse?response)?throws?ServletException,?IOException?{_jspService(request,?response);}public?void?jspInit()?{}public?void?_jspInit()?{}public?void?jspDestroy()?{}protected?void?_jspDestroy()?{}public?abstract?void?_jspService(HttpServletRequest?request,?HttpServletResponse?response)?throws?ServletException,?IOException; }2、_jspService方法
問題1:Jsp頁面中的html排版標簽是如何被發送到客戶端的?
瀏覽器接收到的這些數據,都是在_jspService方法中使用如下的代碼輸出給瀏覽器的。
問題2:Jsp頁面中的java代碼服務器是如何執行的?
在jsp中編寫的java代碼會被翻譯到_jspService方法中去,當執行_jspService方法處理請求時,就會執行在jsp編寫的java代碼了,所以Jsp頁面中的java代碼服務器是通過調用_jspService方法處理請求時執行的。
3、jsp在服務器的執行流程
第一次執行:
客戶端通過電腦連接服務器,因為是請求是動態的,所以所有的請求交給WEB容器來處理
在容器中找到需要執行的*.jsp文件
之后.jsp`文件通過轉換變為`.java文件
.java`文件經過編譯后,形成`.class文件
最終服務器要執行形成的*.class文件
第二次執行:
因為已經存在了*.class文件,所以不在需要轉換和編譯的過程
修改后執行:
源文件已經被修改過了,所以需要重新轉換,重新編譯。
三、JSP指令
JSP指令(directive)是為JSP引擎而設計的,它們并不直接產生任何可見輸出,而只是告訴引擎如何處理JSP頁面中的其余部分。
1、Page指令
page指令用于定義JSP頁面的各種屬性,無論page指令出現在JSP頁面中的什么地方,它作用的都是整個JSP頁面,為了保持程序的可讀性和遵循良好的編程習慣,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="relative_url"?]?[?isErrorPage="true?|?false"?]?[?contentType="mimeType?[?;charset=characterSet?]"?|?"text/html?;?charset=ISO-8859-1"?]?[?pageEncoding="characterSet?|?ISO-8859-1"?]?[?isELIgnored="true?|?false"?]? %>import屬性
可以在一條page指令的import屬性中引入多個類或包,其中的每個包或類之間使用逗號(,)分隔
<%@?page?import="java.util.*,java.io.*,java.sql.*"%>備注:
在Jsp頁面中,Jsp引擎會自動導入下面的包
java.lang.*javax.servlet.*javax.servlet.jsp.*javax.servlet.http.*errorPage屬性
使用errorPage屬性指明出錯后跳轉的錯誤頁面,errorPage屬性的設置值必須使用相對路徑,如果以"/"開頭,表示相對于當前Web應用程序的根目錄,否則,表示相對于當前頁面。
image比如index.jsp頁面有如下的代碼:
<%@?page?language="java"?errorPage="/error.jsp"?contentType="text/html;?charset=UTF-8"pageEncoding="UTF-8"%><%String?path?=?request.getContextPath();String?basePath?=?request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE?html?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"?"http://www.w3.org/TR/html4/loose.dtd"><html><head><base?href="<%=basePath%>"><meta?http-equiv="Content-Type"?content="text/html;?charset=UTF-8"><title>Insert?title?here</title></head><body><%//錯誤代碼int?x?=?1/0;%></body></html>在index.jsp中,page指令的errorPage屬性指明了出錯后跳轉到"/error.jsp",error.jsp頁面代碼如下:
<%@?page?language="java"?contentType="text/html;?charset=UTF-8"pageEncoding="UTF-8"%> <%String?path?=?request.getContextPath();String?basePath?=?request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE?html?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"?"http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <base?href="<%=basePath%>"> <meta?http-equiv="Content-Type"?content="text/html;?charset=UTF-8"> <title>error?jsp</title> </head> <body><h1>對不起,出錯了,請聯系網站管理員解決!</h1> </body> </html>運行結果如下:
image我們也可以在在web.xml中使用標簽為整個web應用設置錯誤處理頁面,web.xml的代碼下:
<?xml?version="1.0"?encoding="UTF-8"?> <web-app?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?xmlns="http://java.sun.com/xml/ns/javaee"?xsi:schemaLocation="http://java.sun.com/xml/ns/javaee?http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"?id="WebApp_ID"?version="3.0"><display-name>JSP</display-name><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><!--?404錯誤的處理頁面?--><error-page><error-code>404</error-code><location>/error.jsp</location></error-page> </web-app>error.jsp頁面代碼同上
當訪問一個不存在的web資源時,就會跳轉到在web.xml中配置的404錯誤處理頁面error.jsp,如下圖所示:
image一個jsp頁面是作為系統的錯誤處理頁面,那么建議將page指令的isErrorPage屬性(默認為false)設置為"true"來顯式聲明這個Jsp頁面是一個錯誤處理頁面。
<%@?page?language="java"?contentType="text/html;?charset=UTF-8" pageEncoding="UTF-8"?isErrorPage="true"%>將error.jsp頁面顯式聲明為錯誤處理頁面后,Jsp引擎在將jsp頁面翻譯成Servlet的時候,在Servlet的 _jspService方法中會聲明一個exception對象,然后將運行jsp出錯的異常信息存儲到exception對象中,由于Servlet的_jspService方法中聲明了exception對象,那么就可以在error.jsp頁面中使用exception對象。源碼如下:
image2、include指令
在JSP中對于包含有兩種語句形式:
@include指令
include指令用于引入其它JSP頁面,如果使用include指令引入了其它JSP頁面,那么JSP引擎將把這兩個JSP翻譯成一個servlet。所以include指令引入通常也稱之為靜態引入。
語法:<%@ include file="relativeURL"%>
file屬性用于指定被引入文件的路徑。路徑以"/"開頭,表示代表當前web應用。
注意細節:
被引入的文件必須遵循JSP語法。
被引入的文件可以使用任意的擴展名,即使其擴展名是html,JSP引擎也會按照處理jsp頁面的方式處理它里面的內容,為了見明知意,JSP規范建議使用.jspf(JSP fragments(片段))作為靜態引入文件的擴展名。
由于使用include指令將會涉及到2個JSP頁面,并會把2個JSP翻譯成一個servlet,所以這2個JSP頁面的指令不能沖突(除了pageEncoding和導包除外)。
標簽
標簽用于把另外一個資源的輸出內容插入進當前JSP頁面的輸出內容之中,這種在JSP頁面執行時的引入方式稱之為動態引入。
語法:<jsp:include page="relativeURL | <%=expression%>" flush="true|false" />
page屬性:用于指定被引入資源的相對路徑,它也可以通過執行一個表達式來獲得。
flush屬性:指定在插入其他資源的輸出內容時,是否先將當前JSP頁面的已輸出的內容刷新到客戶端。
標簽與include指令的區別
標簽是動態引入,標簽涉及到的2個JSP頁面會被翻譯成2個servlet,這2個servlet的內容在執行時進行合并。 而include指令是靜態引入,涉及到的2個JSP頁面會被翻譯成一個servlet,其內容是在源文件級別進行合并。
四、JSP中的九個內置對象
| out | javax.servlet.jsp.JspWriter | 用于頁面輸出 |
| request | javax.servlet.http.HttpServletRequest | 得到用戶請求信息, |
| response | javax.servlet.http.HttpServletResponse | 服務器向客戶端的回應信息 |
| config | javax.servlet.ServletConfig | 服務器配置,可以取得初始化參數 |
| session | javax.servlet.http.HttpSession | 用來保存用戶的信息 |
| application | javax.servlet.ServletContext | 所有用戶的共享信息 |
| page | java.lang.Object | 指當前頁面轉換后的Servlet類的實例 |
| pageContext | javax.servlet.jsp.PageContext | JSP的頁面容器 |
| exception | java.lang.Throwable | 表示JSP頁面所發生的異常,在錯誤頁中才起作用 |
1、page
page對象表示當前一個JSP頁面,可以理解為一個對象本身
2、out
out對象用于向客戶端發送文本數據。
3、pageContext
pageContext對象是JSP技術中最重要的一個對象,它代表JSP頁面的運行環境,這個對象不僅封裝了對其它8大隱式對象的引用,它自身還是一個域對象(容器),可以用來保存數據。并且,這個對象還封裝了web開發中經常涉及到的一些常用操作,例如引入和跳轉其它資源、檢索其它域對象中的屬性等。
通過pageContext獲得其他對象:
| getPage方法 | 返回page隱式對象 |
| getRequest方法 | 返回request隱式對象 |
| getResponse方法 | 返回response隱式對象 |
| getServletConfig方法 | 返回config隱式對象 |
| getServletContext方法 | 返回application隱式對象 |
| getSession方法 | 返回session隱式對象 |
| getOut方法 | 返回out隱式對象 |
pageContext作為域對象
pageContext對象可以作為容器來使用,因此可以將一些數據存儲在pageContext對象中。
pageContext對象的常用方法:
| getAttribute(String name) | 獲取名稱為name的屬性 |
| removeAttribute(String name) | 移除名稱為name的屬性 |
| findAttribute(String name) | 根據name查找各個域中的屬性 |
當使用findAttribute查找某個屬性時,findAttribute方法按照查找順序"page→request→session→application"在這四個對象中去查找,只要找到了就返回屬性值,如果四個對象都沒有找到要查找的屬性,則返回一個null。
五、JSP屬性范圍
JSP中提供了四種屬性范圍,如下:
當前頁(pageContext):一個屬性只能在一個頁面中取得,跳轉到其他頁面無法取得
一次服務器請求(request):一個頁面中設置的屬性,只要經過了服務器跳轉,則跳轉之后的頁面可以繼續取得。
一次會話(session):一個用戶設置的內容,只要是與此用戶相關的頁面都可以訪問(一個會話表示一個人,這個人設置的東西只要這個人不走,就依然有效)
上下文中(application):在整個服務器上設置的屬性,所有人都可以訪問
1、page屬性范圍(pageContext)
在一個頁面設置的屬性,跳轉到其他頁面就無法訪問了。但是在使用page屬性范圍的時候必須注意的是,雖然習慣上將頁面范圍的屬性稱為page范圍,但是實際上操作的時候是使用pageContext內置對象完成的。
例如:
<%@?page?language="java"?errorPage="/error.jsp"?contentType="text/html;?charset=UTF-8"pageEncoding="UTF-8"%> <%String?path?=?request.getContextPath();String?basePath?=?request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE?html?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"?"http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <base?href="<%=basePath%>"> <meta?http-equiv="Content-Type"?content="text/html;?charset=UTF-8"> <title>Insert?title?here</title> </head> <body><%pageContext.setAttribute("name","Zender");String?name?=?(String)pageContext.getAttribute("name");%>name:<%=name?%> </body> </html>運行結果如下:
image使用<jsp:forward page="/index2.jsp" />標簽進行服務器跳轉到index2.jsp
Index.jsp
<%@?page?language="java"?errorPage="/error.jsp"?contentType="text/html;?charset=UTF-8"pageEncoding="UTF-8"%> <%String?path?=?request.getContextPath();String?basePath?=?request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE?html?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"?"http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <base?href="<%=basePath%>"> <meta?http-equiv="Content-Type"?content="text/html;?charset=UTF-8"> <title>Insert?title?here</title> </head> <body><%pageContext.setAttribute("name","Zender");%><%--使用jsp:forward標簽進行服務器端跳轉--%><jsp:forward?page="/index2.jsp"?/> </body> </html>Index2.jsp
<%@?page?language="java"?errorPage="/error.jsp"?contentType="text/html;?charset=UTF-8"pageEncoding="UTF-8"%> <%String?path?=?request.getContextPath();String?basePath?=?request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE?html?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"?"http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <base?href="<%=basePath%>"> <meta?http-equiv="Content-Type"?content="text/html;?charset=UTF-8"> <title>Insert?title?here</title> </head> <body><%String?name?=?(String)pageContext.getAttribute("name");%>name:<%=name?%> </body> </html>運行結果如下:
image使用了服務器端跳轉,但是發現內容并不能取得,證明page范圍的屬性只能在本頁中取得,跳轉到其他頁面之中不能取得。
2、request屬性范圍
request屬性范圍表示在一次服務器跳轉中有效,只要是服務器跳轉,則設置的request屬性可以一直傳遞下去。
例如:
Index.jsp
<%request.setAttribute("name","Zender"); %> <%--使用jsp:forward標簽進行服務器端跳轉--%> <jsp:forward?page="/index2.jsp"?/>Index2.jsp
<%String?name?=?(String)request.getAttribute("name"); %>name:<%=name?%>運行結果如下:
image修改Index2.jsp代碼如下:
<%String?name?=?(String)request.getAttribute("name"); %>name:<%=name?%> <a?href="/JSP/index3.jsp">鏈接跳轉</a>Index3.jsp代碼如下:
<%String?name?=?(String)request.getAttribute("name"); %>name:<%=name?%>使用了超鏈接的方式傳遞的話,則屬性是無法向下繼續傳遞的,一旦跳轉之后,地址欄改變,所以此種跳轉也可以稱為客戶端跳轉。點擊鏈接跳轉結果如下:
image3、Session屬性范圍
session設置的屬性不管如何跳轉,都可以取得的(session只針對一個用戶)。
例如:
Index.jsp
<% session.setAttribute("name","Zender"); %> <%--使用jsp:forward標簽進行服務器端跳轉--%> <jsp:forward?page="/index2.jsp"?/>Index2.jsp
<%String?name?=?(String)session.getAttribute("name"); %>name:<%=name?%> <%--使用超鏈接這種客戶端跳轉--%> <a?href="/JSP/index3.jsp">鏈接跳轉</a>Index3.jsp
<%String?name?=?(String)session.getAttribute("name"); %>name:<%=name?%>訪問Index.jsp(服務器端跳轉到index2.jsp):
image點擊鏈接跳轉(客戶端跳轉到index3.jsp):
image4、application屬性范圍
application屬性范圍是在服務器上設置的一個屬性,所以一旦設置之后任何用戶都可以瀏覽到此屬性(服務器上設置了過多的application屬性,則會影響到服務器的性能)。
例如:
Index.jsp
<% application.setAttribute("name","Zender"); %> <%--使用jsp:forward標簽進行服務器端跳轉--%> <jsp:forward?page="/index2.jsp"?/>Index2.jsp
<%String?name?=?(String)application.getAttribute("name"); %>name:<%=name?%> <%--使用超鏈接這種客戶端跳轉--%> <a?href="/JSP/index3.jsp">鏈接跳轉</a>Index3.jsp
<%String?name?=?(String)application.getAttribute("name"); %>name:<%=name?%>訪問Index.jsp(服務器端跳轉到index2.jsp):
image點擊鏈接跳轉(客戶端跳轉到index3.jsp):
image重啟web服務器后訪問index2.jsp或者index3.jsp:
imageimage六、JSP標簽
JSP標簽也稱之為Jsp Action(JSP動作)元素,它用于在Jsp頁面中提供業務邏輯功能,避免在JSP頁面中直接編寫java代碼,造成jsp頁面難以維護。
常用標簽有以下三個:
1、標簽
標簽用于把另外一個資源的輸出內容插入進當前JSP頁面的輸出內容之中,這種在JSP頁面執行時的引入方式稱之為動態引入。
語法:<jsp:include page="relativeURL | <%=expression%>" flush="true|false" />
| flush | 指定在插入其他資源的輸出內容時,是否先將當前JSP頁面的已輸出的內容刷新到客戶端。 |
標簽與include指令的區別:
標簽是動態引入,標簽涉及到的2個JSP頁面會被翻譯成2個servlet,這2個servlet的內容在執行時進行合并。 而include指令是靜態引入,涉及到的2個JSP頁面會被翻譯成一個servlet,其內容是在源文件級別進行合并。
2、標簽
標簽用于把請求轉發給另外一個資源(服務器跳轉,地址不變)。
語法:<jsp:forward page="relativeURL | <%=expression%>" />
3、
在使用和標簽引入或將請求轉發給其它資源時,可以使用
語法1:
<jsp:include?page="relativeURL?|?<%=expression%>"><jsp:param?name="parameterName"?value="parameterValue|<%=?expression?%>"?/></jsp:include>語法2:
<jsp:forward?page="relativeURL?|?<%=expression%>"><jsp:param?name="parameterName"?value="parameterValue|<%=?expression?%>"?/></jsp:forward>| value | 指定參數值 |
例如:
index.jsp
<%--使用jsp:forward標簽進行服務器端跳轉,--%> <jsp:forward?page="/index2.jsp"?><jsp:param?value="10086"?name="num"/><jsp:param?value="10010"?name="num2"/> </jsp:forward>Index2.jsp
num:<%=request.getParameter("num")?%> <br/> num2:<%=request.getParameter("num2")?%>運行結果如下:
image作者:Zender 鏈接:https://www.cnblogs.com/Zender/p/7799225.html????覺得有用就轉發分享一下吧
推薦閱讀
1.?一文讀懂HttpServletRequest
2.?一文讀懂HttpServletResponse
3.?servlet就是這么簡單
4.?tomcat基本使用,就是這么簡單
附上熱門QQ群,存放資源和歷史資料,2000容量(低門檻付費群),長按二維碼入群
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的java后端开发每天遇到的jsp,了解一下的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开发中经常碰到的问题cookie和ses
- 下一篇: 轻松看懂java设计模式简单工厂模式