Servlet作為服務(wù)器的小程序,為我們解決了業(yè)務(wù)問(wèn)題(作為控制器)。但是,我們想要寫出更接近“前端”的代碼,需要我們了解jsp相關(guān)技術(shù)。
在JSP中,我們要了解:
JSP代碼組成 模板腳本元素(指令、動(dòng)作、聲明、scriptlet和表達(dá)式)標(biāo)準(zhǔn)動(dòng)作和定制動(dòng)作使用指令寫JSP代碼 page includetablib JSP標(biāo)準(zhǔn)動(dòng)作 include(運(yùn)行時(shí)調(diào)用-單獨(dú)的.class文件)forward(跳轉(zhuǎn)JSP、Servlet)JSP內(nèi)置對(duì)象 request responseoutsessionconfigapplicationpagepageContextexceptionJSP的生命周期 頁(yè)面轉(zhuǎn)換:JSP->ServletJSP頁(yè)面編譯加載類創(chuàng)建實(shí)例jspinit使用_jspService一個(gè)JSP示例:
<%@ page language="java" pageEncoding="utf-8"%><%@ page import="com.web.po.*"%><%-- 這是一個(gè)JSP注釋 --%><% int number = 0;%><%= number++1 %>首先,我們要考慮的是,容器對(duì)我們的JSP頁(yè)面做了什么,如何讓JSP轉(zhuǎn)換成Servlet的:
小腳本里的代碼會(huì)放在通用服務(wù)方法,變量為局部變量使用JSP聲明的變量,會(huì)成為Servlet的類變量容器,實(shí)際上,按照如下的步驟生成Servlet
查看指令,轉(zhuǎn)換相應(yīng)的方法創(chuàng)建一個(gè)HttpServlet的子類檢查聲明,把變量寫入類創(chuàng)建服務(wù)方法把HTML轉(zhuǎn)換成流輸出的方式好了,該看一下JSP的生命周期了:
JSP文件被部署到Web容器里第一個(gè)請(qǐng)求到來(lái),JSP文件被轉(zhuǎn)換成.javaJava文件被編譯成.class文件容器加載Servlet類實(shí)例化Servlet,調(diào)用servlet的jspInit()初始化和Servlet一樣,我們的JSP也是可以配置初始化參數(shù)的,我們需要在DD文件里這樣寫:
<servlet> <jsp-file>somefile</jsp-file> <init-param> <param-name></param-name> <param-value></param-value> </init-param></servlet>或者,自己在JSP文件中寫聲明:
<%! public void jspInit(){ // 在這里寫初始化的邏輯代碼 }%>然后,我們的JSP中也是有作用域(PageContext中的枚舉值):
APPLICATION_SCOPEPAGE_SCOPEREQUEST_SCOPESESSION_SCOPE好了,終于可以聊聊JSP的指令,動(dòng)作和內(nèi)置對(duì)象了: 指令列表:
page(屬性如下) importisThreadSafecontentTypeisErrorPageerrorPagepageEncoding。。。。。。taglibinclude其實(shí),這些指令已經(jīng)允許我們?cè)贘SP頁(yè)面中書寫Java代碼,但是,為了后期維護(hù),我們不應(yīng)該寫scriptlet。這就需要我們?cè)贒D中禁用小腳本
<web-app> <jsp-config> <jsp-PRoperty-group> <!-- 下面的配置對(duì)所有的JSP文件,都禁用Java小腳本 --> <url-pattern>*.jsp</url-pattern> <scripting-invalid>true</scripting-invalid> <jsp-property-group> </jsp-config><web-app>不過(guò),當(dāng)我們寫了太多的腳本,我們開始尋求無(wú)腳本頁(yè)面,于是,JSP標(biāo)準(zhǔn)動(dòng)作可以來(lái)幫忙:
JavaBean相關(guān)
jsp:useBeanjsp:setPropertyjsp:getPropertyjsp:param<%-- 帶體的useBean --%><jsp:useBean id="beanId" class="someClass" scope="someScope"> <jsp:setProperty name="propertyName" value="propertyValue"/></jsp:useBean><%-- 使用多態(tài)的useBean --%><jsp:useBean id="xx" class="someClass" type="superClassName"></jsp:useBean><%-- 使用param設(shè)置bean的屬性 --%><jsp:useBean id="xx" class="xx" scope="someScope"> <jsp:setProperty name="propertyName" param="propertyName"/></jsp:useBean><%-- 如果bean的屬性和表單屬性名一致,可以使用如下代碼 --%><jsp:useBean id="xx" class="xx" scope="someScope"> <jsp:setProperty name="propertyName" property="*"/></jsp:useBean>如果某個(gè)JavaBean的屬性還是一個(gè)對(duì)象,我們就得寫EL咯!
<%-- dot-Operator --%>${requestScope.name}<%-- []-operator --%>${requstScope.someList["0"]}EL中有一些隱式對(duì)象,下面是其一覽表:
作用域 pageScoperequsetScopesessionScopeapplicationScope請(qǐng)求參數(shù) paramparamValue請(qǐng)求首部 headerheaderValuescookieinitParampageContext<%-- 下面是一個(gè)表單 --%><form action="result.jsp" method="post"> 用戶名:<input type="text" name="username"> 食物1:<input type="text" name="food"> 食物2:<input type="text" name="food"></form><%-- 下面是result.jsp --%>${param.username}<%-- 使用paramValues獲取多值參數(shù) --%>${paramValues.food[0]}<%-- 獲取頭部信息 --%>${header.host}新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注