java后端开发每天遇到的jsp,了解一下
點(diǎn)擊上方“好好學(xué)java”,選擇“置頂公眾號(hào)”
優(yōu)秀學(xué)習(xí)資源、干貨第一時(shí)間送達(dá)!
?精彩內(nèi)容?
java實(shí)戰(zhàn)練習(xí)項(xiàng)目教程
2018微服務(wù)資源springboot、springcloud、docker、dubbo實(shí)戰(zhàn)等傾心分享
2018年java架構(gòu)師全套學(xué)習(xí)教程
最新大數(shù)據(jù)培訓(xùn)完整視頻教程
2018年java最新全套培訓(xùn)學(xué)習(xí)教程
一、JSP基礎(chǔ)語法
1、JSP模板元素
JSP頁面中的HTML內(nèi)容稱之為JSP模版元素。
JSP模版元素定義了網(wǎng)頁的基本骨架,即定義了頁面的結(jié)構(gòu)和外觀。
2、JSP腳本片段
JSP腳本片斷(scriptlet)用于在JSP頁面中編寫多行Java代碼(在<%%>不能定義方法)。語法:<%多行java代碼 %>
例如:
<%int?num?=?0;num?=?++num;out.println("num:"?+?num); %>image
注意:
1、JSP腳本片斷中只能出現(xiàn)java代碼,不能出現(xiàn)其它模板元素, JSP引擎在翻譯JSP頁面中,會(huì)將JSP腳本片斷中的Java代碼將被原封不動(dòng)地放到Servlet的_jspService方法中。
2、JSP腳本片斷中的Java代碼必須嚴(yán)格遵循Java語法,例如,每執(zhí)行語句后面必須用分號(hào)(;)結(jié)束。
3、在一個(gè)JSP頁面中可以有多個(gè)腳本片斷,在兩個(gè)或多個(gè)腳本片斷之間可以嵌入文本、HTML標(biāo)記和其他JSP元素。
4、多個(gè)腳本片斷中的代碼可以相互訪問
3、JSP表達(dá)式
JSP腳本表達(dá)式(expression)用于將程序數(shù)據(jù)輸出到客戶端,語法:<%=變量或表達(dá)式 %>
例如:
<%="123"?%>image
4、JSP聲明
JSP頁面中編寫的所有代碼,默認(rèn)會(huì)翻譯到servlet的service方法中, 而Jsp聲明中的java代碼被翻譯到_jspService方法的外面。語法:<%!java代碼 %>
JSP聲明可用于定義JSP頁面轉(zhuǎn)換成的Servlet程序的靜態(tài)代碼塊、成員變量和方法。
例如:
<%! static?{?System.out.println("靜態(tài)代碼塊");? }private?String?name?=?"Zender";public?void?TestFun(){System.out.println("成員方法!"); } %> <%TestFun();out.println("name:"?+?name); %>控制臺(tái):
image頁面:
image5、JSP注釋
在JSP中,注釋有顯式注釋, 隱式注釋,JSP自己的注釋:
| 隱式注釋 | 直接使用JAVA的注釋://、/……/ |
| JSP自己的注釋 | <%- - 注釋內(nèi)容- -%> |
區(qū)別:
HTML的注釋在瀏覽器中查看源文件的時(shí)候是可以看得到的,而JAVA注釋和JSP注釋在瀏覽器中查看源文件時(shí)是看不到注釋的內(nèi)容的。
二、JSP原理
1、Web服務(wù)器是如何調(diào)用并執(zhí)行一個(gè)jsp頁面的?
瀏覽器向服務(wù)器發(fā)請(qǐng)求,不管訪問的是什么資源,其實(shí)都是在訪問Servlet,所以當(dāng)訪問一個(gè)jsp頁面時(shí),其實(shí)也是在訪問一個(gè)Servlet,服務(wù)器在執(zhí)行jsp的時(shí)候,首先把jsp翻譯成一個(gè)Servlet,所以我們?cè)L問jsp時(shí),其實(shí)不是在訪問jsp,而是在訪問jsp翻譯過后的那個(gè)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("靜態(tài)代碼塊");?}private?String?name?=?"Zender";public?void?TestFun(){System.out.println("成員方法!");}%><%TestFun();out.println("name:"?+?name);%> </body> </html>當(dāng)我們通過瀏覽器訪問index.jsp時(shí),服務(wù)器首先將index.jsp翻譯成一個(gè)index_jsp.class,在Tomcat服務(wù)器的work\Catalina\localhost\項(xiàng)目名\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("靜態(tài)代碼塊");?}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這個(gè)類是繼承org.apache.jasper.runtime.HttpJspBase這個(gè)類的,通過查看HttpJspBase源代碼,可以知道HttpJspBase類是繼承HttpServlet的,所以HttpJspBase類是一個(gè)Servlet,而index_jsp又是繼承HttpJspBase類的,所以index_jsp類也是一個(gè)Servlet,所以當(dāng)瀏覽器訪問服務(wù)器上的index.jsp頁面時(shí),其實(shí)就是在訪問index_jsp這個(gè)Servlet,index_jsp這個(gè)Servlet使用_jspService這個(gè)方法處理請(qǐng)求。
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排版標(biāo)簽是如何被發(fā)送到客戶端的?
瀏覽器接收到的這些數(shù)據(jù),都是在_jspService方法中使用如下的代碼輸出給瀏覽器的。
問題2:Jsp頁面中的java代碼服務(wù)器是如何執(zhí)行的?
在jsp中編寫的java代碼會(huì)被翻譯到_jspService方法中去,當(dāng)執(zhí)行_jspService方法處理請(qǐng)求時(shí),就會(huì)執(zhí)行在jsp編寫的java代碼了,所以Jsp頁面中的java代碼服務(wù)器是通過調(diào)用_jspService方法處理請(qǐng)求時(shí)執(zhí)行的。
3、jsp在服務(wù)器的執(zhí)行流程
第一次執(zhí)行:
客戶端通過電腦連接服務(wù)器,因?yàn)槭钦?qǐng)求是動(dòng)態(tài)的,所以所有的請(qǐng)求交給WEB容器來處理
在容器中找到需要執(zhí)行的*.jsp文件
之后.jsp`文件通過轉(zhuǎn)換變?yōu)?#96;.java文件
.java`文件經(jīng)過編譯后,形成`.class文件
最終服務(wù)器要執(zhí)行形成的*.class文件
第二次執(zhí)行:
因?yàn)橐呀?jīng)存在了*.class文件,所以不在需要轉(zhuǎn)換和編譯的過程
修改后執(zhí)行:
源文件已經(jīng)被修改過了,所以需要重新轉(zhuǎn)換,重新編譯。
三、JSP指令
JSP指令(directive)是為JSP引擎而設(shè)計(jì)的,它們并不直接產(chǎn)生任何可見輸出,而只是告訴引擎如何處理JSP頁面中的其余部分。
1、Page指令
page指令用于定義JSP頁面的各種屬性,無論page指令出現(xiàn)在JSP頁面中的什么地方,它作用的都是整個(gè)JSP頁面,為了保持程序的可讀性和遵循良好的編程習(xí)慣,page指令最好是放在整個(gè)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屬性中引入多個(gè)類或包,其中的每個(gè)包或類之間使用逗號(hào)(,)分隔
<%@?page?import="java.util.*,java.io.*,java.sql.*"%>備注:
在Jsp頁面中,Jsp引擎會(huì)自動(dòng)導(dǎo)入下面的包
java.lang.*javax.servlet.*javax.servlet.jsp.*javax.servlet.http.*errorPage屬性
使用errorPage屬性指明出錯(cuò)后跳轉(zhuǎn)的錯(cuò)誤頁面,errorPage屬性的設(shè)置值必須使用相對(duì)路徑,如果以"/"開頭,表示相對(duì)于當(dāng)前Web應(yīng)用程序的根目錄,否則,表示相對(duì)于當(dāng)前頁面。
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><%//錯(cuò)誤代碼int?x?=?1/0;%></body></html>在index.jsp中,page指令的errorPage屬性指明了出錯(cuò)后跳轉(zhuǎn)到"/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>對(duì)不起,出錯(cuò)了,請(qǐng)聯(lián)系網(wǎng)站管理員解決!</h1> </body> </html>運(yùn)行結(jié)果如下:
image我們也可以在在web.xml中使用標(biāo)簽為整個(gè)web應(yīng)用設(shè)置錯(cuò)誤處理頁面,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錯(cuò)誤的處理頁面?--><error-page><error-code>404</error-code><location>/error.jsp</location></error-page> </web-app>error.jsp頁面代碼同上
當(dāng)訪問一個(gè)不存在的web資源時(shí),就會(huì)跳轉(zhuǎn)到在web.xml中配置的404錯(cuò)誤處理頁面error.jsp,如下圖所示:
image一個(gè)jsp頁面是作為系統(tǒng)的錯(cuò)誤處理頁面,那么建議將page指令的isErrorPage屬性(默認(rèn)為false)設(shè)置為"true"來顯式聲明這個(gè)Jsp頁面是一個(gè)錯(cuò)誤處理頁面。
<%@?page?language="java"?contentType="text/html;?charset=UTF-8" pageEncoding="UTF-8"?isErrorPage="true"%>將error.jsp頁面顯式聲明為錯(cuò)誤處理頁面后,Jsp引擎在將jsp頁面翻譯成Servlet的時(shí)候,在Servlet的 _jspService方法中會(huì)聲明一個(gè)exception對(duì)象,然后將運(yùn)行jsp出錯(cuò)的異常信息存儲(chǔ)到exception對(duì)象中,由于Servlet的_jspService方法中聲明了exception對(duì)象,那么就可以在error.jsp頁面中使用exception對(duì)象。源碼如下:
image2、include指令
在JSP中對(duì)于包含有兩種語句形式:
@include指令
include指令用于引入其它JSP頁面,如果使用include指令引入了其它JSP頁面,那么JSP引擎將把這兩個(gè)JSP翻譯成一個(gè)servlet。所以include指令引入通常也稱之為靜態(tài)引入。
語法:<%@ include file="relativeURL"%>
file屬性用于指定被引入文件的路徑。路徑以"/"開頭,表示代表當(dāng)前web應(yīng)用。
注意細(xì)節(jié):
被引入的文件必須遵循JSP語法。
被引入的文件可以使用任意的擴(kuò)展名,即使其擴(kuò)展名是html,JSP引擎也會(huì)按照處理jsp頁面的方式處理它里面的內(nèi)容,為了見明知意,JSP規(guī)范建議使用.jspf(JSP fragments(片段))作為靜態(tài)引入文件的擴(kuò)展名。
由于使用include指令將會(huì)涉及到2個(gè)JSP頁面,并會(huì)把2個(gè)JSP翻譯成一個(gè)servlet,所以這2個(gè)JSP頁面的指令不能沖突(除了pageEncoding和導(dǎo)包除外)。
標(biāo)簽
標(biāo)簽用于把另外一個(gè)資源的輸出內(nèi)容插入進(jìn)當(dāng)前JSP頁面的輸出內(nèi)容之中,這種在JSP頁面執(zhí)行時(shí)的引入方式稱之為動(dòng)態(tài)引入。
語法:<jsp:include page="relativeURL | <%=expression%>" flush="true|false" />
page屬性:用于指定被引入資源的相對(duì)路徑,它也可以通過執(zhí)行一個(gè)表達(dá)式來獲得。
flush屬性:指定在插入其他資源的輸出內(nèi)容時(shí),是否先將當(dāng)前JSP頁面的已輸出的內(nèi)容刷新到客戶端。
標(biāo)簽與include指令的區(qū)別
標(biāo)簽是動(dòng)態(tài)引入,標(biāo)簽涉及到的2個(gè)JSP頁面會(huì)被翻譯成2個(gè)servlet,這2個(gè)servlet的內(nèi)容在執(zhí)行時(shí)進(jìn)行合并。 而include指令是靜態(tài)引入,涉及到的2個(gè)JSP頁面會(huì)被翻譯成一個(gè)servlet,其內(nèi)容是在源文件級(jí)別進(jìn)行合并。
四、JSP中的九個(gè)內(nèi)置對(duì)象
| out | javax.servlet.jsp.JspWriter | 用于頁面輸出 |
| request | javax.servlet.http.HttpServletRequest | 得到用戶請(qǐng)求信息, |
| response | javax.servlet.http.HttpServletResponse | 服務(wù)器向客戶端的回應(yīng)信息 |
| config | javax.servlet.ServletConfig | 服務(wù)器配置,可以取得初始化參數(shù) |
| session | javax.servlet.http.HttpSession | 用來保存用戶的信息 |
| application | javax.servlet.ServletContext | 所有用戶的共享信息 |
| page | java.lang.Object | 指當(dāng)前頁面轉(zhuǎn)換后的Servlet類的實(shí)例 |
| pageContext | javax.servlet.jsp.PageContext | JSP的頁面容器 |
| exception | java.lang.Throwable | 表示JSP頁面所發(fā)生的異常,在錯(cuò)誤頁中才起作用 |
1、page
page對(duì)象表示當(dāng)前一個(gè)JSP頁面,可以理解為一個(gè)對(duì)象本身
2、out
out對(duì)象用于向客戶端發(fā)送文本數(shù)據(jù)。
3、pageContext
pageContext對(duì)象是JSP技術(shù)中最重要的一個(gè)對(duì)象,它代表JSP頁面的運(yùn)行環(huán)境,這個(gè)對(duì)象不僅封裝了對(duì)其它8大隱式對(duì)象的引用,它自身還是一個(gè)域?qū)ο?容器),可以用來保存數(shù)據(jù)。并且,這個(gè)對(duì)象還封裝了web開發(fā)中經(jīng)常涉及到的一些常用操作,例如引入和跳轉(zhuǎn)其它資源、檢索其它域?qū)ο笾械膶傩缘取?/p>
通過pageContext獲得其他對(duì)象:
| getPage方法 | 返回page隱式對(duì)象 |
| getRequest方法 | 返回request隱式對(duì)象 |
| getResponse方法 | 返回response隱式對(duì)象 |
| getServletConfig方法 | 返回config隱式對(duì)象 |
| getServletContext方法 | 返回application隱式對(duì)象 |
| getSession方法 | 返回session隱式對(duì)象 |
| getOut方法 | 返回out隱式對(duì)象 |
pageContext作為域?qū)ο?/strong>
pageContext對(duì)象可以作為容器來使用,因此可以將一些數(shù)據(jù)存儲(chǔ)在pageContext對(duì)象中。
pageContext對(duì)象的常用方法:
| getAttribute(String name) | 獲取名稱為name的屬性 |
| removeAttribute(String name) | 移除名稱為name的屬性 |
| findAttribute(String name) | 根據(jù)name查找各個(gè)域中的屬性 |
當(dāng)使用findAttribute查找某個(gè)屬性時(shí),findAttribute方法按照查找順序"page→request→session→application"在這四個(gè)對(duì)象中去查找,只要找到了就返回屬性值,如果四個(gè)對(duì)象都沒有找到要查找的屬性,則返回一個(gè)null。
五、JSP屬性范圍
JSP中提供了四種屬性范圍,如下:
當(dāng)前頁(pageContext):一個(gè)屬性只能在一個(gè)頁面中取得,跳轉(zhuǎn)到其他頁面無法取得
一次服務(wù)器請(qǐng)求(request):一個(gè)頁面中設(shè)置的屬性,只要經(jīng)過了服務(wù)器跳轉(zhuǎn),則跳轉(zhuǎn)之后的頁面可以繼續(xù)取得。
一次會(huì)話(session):一個(gè)用戶設(shè)置的內(nèi)容,只要是與此用戶相關(guān)的頁面都可以訪問(一個(gè)會(huì)話表示一個(gè)人,這個(gè)人設(shè)置的東西只要這個(gè)人不走,就依然有效)
上下文中(application):在整個(gè)服務(wù)器上設(shè)置的屬性,所有人都可以訪問
1、page屬性范圍(pageContext)
在一個(gè)頁面設(shè)置的屬性,跳轉(zhuǎn)到其他頁面就無法訪問了。但是在使用page屬性范圍的時(shí)候必須注意的是,雖然習(xí)慣上將頁面范圍的屬性稱為page范圍,但是實(shí)際上操作的時(shí)候是使用pageContext內(nèi)置對(duì)象完成的。
例如:
<%@?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>運(yùn)行結(jié)果如下:
image使用<jsp:forward page="/index2.jsp" />標(biāo)簽進(jìn)行服務(wù)器跳轉(zhuǎn)到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標(biāo)簽進(jìn)行服務(wù)器端跳轉(zhuǎn)--%><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>運(yùn)行結(jié)果如下:
image使用了服務(wù)器端跳轉(zhuǎn),但是發(fā)現(xiàn)內(nèi)容并不能取得,證明page范圍的屬性只能在本頁中取得,跳轉(zhuǎn)到其他頁面之中不能取得。
2、request屬性范圍
request屬性范圍表示在一次服務(wù)器跳轉(zhuǎn)中有效,只要是服務(wù)器跳轉(zhuǎn),則設(shè)置的request屬性可以一直傳遞下去。
例如:
Index.jsp
<%request.setAttribute("name","Zender"); %> <%--使用jsp:forward標(biāo)簽進(jìn)行服務(wù)器端跳轉(zhuǎn)--%> <jsp:forward?page="/index2.jsp"?/>Index2.jsp
<%String?name?=?(String)request.getAttribute("name"); %>name:<%=name?%>運(yùn)行結(jié)果如下:
image修改Index2.jsp代碼如下:
<%String?name?=?(String)request.getAttribute("name"); %>name:<%=name?%> <a?href="/JSP/index3.jsp">鏈接跳轉(zhuǎn)</a>Index3.jsp代碼如下:
<%String?name?=?(String)request.getAttribute("name"); %>name:<%=name?%>使用了超鏈接的方式傳遞的話,則屬性是無法向下繼續(xù)傳遞的,一旦跳轉(zhuǎn)之后,地址欄改變,所以此種跳轉(zhuǎn)也可以稱為客戶端跳轉(zhuǎn)。點(diǎn)擊鏈接跳轉(zhuǎn)結(jié)果如下:
image3、Session屬性范圍
session設(shè)置的屬性不管如何跳轉(zhuǎn),都可以取得的(session只針對(duì)一個(gè)用戶)。
例如:
Index.jsp
<% session.setAttribute("name","Zender"); %> <%--使用jsp:forward標(biāo)簽進(jìn)行服務(wù)器端跳轉(zhuǎn)--%> <jsp:forward?page="/index2.jsp"?/>Index2.jsp
<%String?name?=?(String)session.getAttribute("name"); %>name:<%=name?%> <%--使用超鏈接這種客戶端跳轉(zhuǎn)--%> <a?href="/JSP/index3.jsp">鏈接跳轉(zhuǎn)</a>Index3.jsp
<%String?name?=?(String)session.getAttribute("name"); %>name:<%=name?%>訪問Index.jsp(服務(wù)器端跳轉(zhuǎn)到index2.jsp):
image點(diǎn)擊鏈接跳轉(zhuǎn)(客戶端跳轉(zhuǎn)到index3.jsp):
image4、application屬性范圍
application屬性范圍是在服務(wù)器上設(shè)置的一個(gè)屬性,所以一旦設(shè)置之后任何用戶都可以瀏覽到此屬性(服務(wù)器上設(shè)置了過多的application屬性,則會(huì)影響到服務(wù)器的性能)。
例如:
Index.jsp
<% application.setAttribute("name","Zender"); %> <%--使用jsp:forward標(biāo)簽進(jìn)行服務(wù)器端跳轉(zhuǎn)--%> <jsp:forward?page="/index2.jsp"?/>Index2.jsp
<%String?name?=?(String)application.getAttribute("name"); %>name:<%=name?%> <%--使用超鏈接這種客戶端跳轉(zhuǎn)--%> <a?href="/JSP/index3.jsp">鏈接跳轉(zhuǎn)</a>Index3.jsp
<%String?name?=?(String)application.getAttribute("name"); %>name:<%=name?%>訪問Index.jsp(服務(wù)器端跳轉(zhuǎn)到index2.jsp):
image點(diǎn)擊鏈接跳轉(zhuǎn)(客戶端跳轉(zhuǎn)到index3.jsp):
image重啟web服務(wù)器后訪問index2.jsp或者index3.jsp:
imageimage六、JSP標(biāo)簽
JSP標(biāo)簽也稱之為Jsp Action(JSP動(dòng)作)元素,它用于在Jsp頁面中提供業(yè)務(wù)邏輯功能,避免在JSP頁面中直接編寫java代碼,造成jsp頁面難以維護(hù)。
常用標(biāo)簽有以下三個(gè):
1、標(biāo)簽
標(biāo)簽用于把另外一個(gè)資源的輸出內(nèi)容插入進(jìn)當(dāng)前JSP頁面的輸出內(nèi)容之中,這種在JSP頁面執(zhí)行時(shí)的引入方式稱之為動(dòng)態(tài)引入。
語法:<jsp:include page="relativeURL | <%=expression%>" flush="true|false" />
| flush | 指定在插入其他資源的輸出內(nèi)容時(shí),是否先將當(dāng)前JSP頁面的已輸出的內(nèi)容刷新到客戶端。 |
標(biāo)簽與include指令的區(qū)別:
標(biāo)簽是動(dòng)態(tài)引入,標(biāo)簽涉及到的2個(gè)JSP頁面會(huì)被翻譯成2個(gè)servlet,這2個(gè)servlet的內(nèi)容在執(zhí)行時(shí)進(jìn)行合并。 而include指令是靜態(tài)引入,涉及到的2個(gè)JSP頁面會(huì)被翻譯成一個(gè)servlet,其內(nèi)容是在源文件級(jí)別進(jìn)行合并。
2、標(biāo)簽
標(biāo)簽用于把請(qǐng)求轉(zhuǎn)發(fā)給另外一個(gè)資源(服務(wù)器跳轉(zhuǎn),地址不變)。
語法:<jsp:forward page="relativeURL | <%=expression%>" />
3、
在使用和標(biāo)簽引入或?qū)⒄?qǐng)求轉(zhuǎn)發(fā)給其它資源時(shí),可以使用
語法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 | 指定參數(shù)值 |
例如:
index.jsp
<%--使用jsp:forward標(biāo)簽進(jìn)行服務(wù)器端跳轉(zhuǎn),--%> <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")?%>運(yùn)行結(jié)果如下:
image作者:Zender 鏈接:https://www.cnblogs.com/Zender/p/7799225.html????覺得有用就轉(zhuǎn)發(fā)分享一下吧
推薦閱讀
1.?一文讀懂HttpServletRequest
2.?一文讀懂HttpServletResponse
3.?servlet就是這么簡單
4.?tomcat基本使用,就是這么簡單
附上熱門QQ群,存放資源和歷史資料,2000容量(低門檻付費(fèi)群),長按二維碼入群
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的java后端开发每天遇到的jsp,了解一下的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开发中经常碰到的问题cookie和ses
- 下一篇: HttpServletRequest看这