Servlet做爲服務器的小程序,爲咱們解決了業務問題(做爲控制器)。可是,咱們想要寫出更接近「前端」的代碼,須要咱們瞭解JSP相關技術。前端
在JSP中,咱們要了解:java
JSP代碼組成web
模板小程序
腳本元素(指令、動做、聲明、scriptlet和表達式)服務器
標準動做和定製動做cookie
使用指令寫JSP代碼session
pageapp
includejsp
tablibpost
JSP標準動做
include(運行時調用-單獨的.class文件)
forward(跳轉JSP、Servlet)
JSP內置對象
request
response
out
session
config
application
page
pageContext
exception
JSP的生命週期
頁面轉換:JSP->Servlet
JSP頁面編譯
加載類
建立實例
jspinit
使用_jspService
一個JSP示例:
<%@ page language="java" pageEncoding="utf-8"%> <%@ page import="com.web.po.*"%> <%-- 這是一個JSP註釋 --%> <% int number = 0; %> <%= number++1 %>
首先,咱們要考慮的是,容器對咱們的JSP頁面作了什麼,如何讓JSP轉換成Servlet的:
小腳本里的代碼會放在通用服務方法,變量爲局部變量
使用JSP聲明的變量,會成爲Servlet的類變量
容器,實際上,按照以下的步驟生成Servlet
查看指令,轉換相應的方法
建立一個HttpServlet的子類
檢查聲明,把變量寫入類
建立服務方法
把HTML轉換成流輸出的方式
好了,該看一下JSP的生命週期了:
JSP文件被部署到Web容器裏
第一個請求到來,JSP文件被轉換成.java
Java文件被編譯成.class文件
容器加載Servlet類
實例化Servlet,調用servlet的jspInit()初始化
和Servlet同樣,咱們的JSP也是能夠配置初始化參數的,咱們須要在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_SCOPE
PAGE_SCOPE
REQUEST_SCOPE
SESSION_SCOPE
好了,終於能夠聊聊JSP的指令,動做和內置對象了:
指令列表:
page(屬性以下)
import
isThreadSafe
contentType
isErrorPage
errorPage
pageEncoding
。。。。。。
taglib
include
其實,這些指令已經容許咱們在JSP頁面中書寫Java代碼,可是,爲了後期維護,咱們不該該寫scriptlet。這就須要咱們在DD中禁用小腳本
<web-app> <jsp-config> <jsp-property-group> <!-- 下面的配置對全部的JSP文件,都禁用Java小腳本 --> <url-pattern>*.jsp</url-pattern> <scripting-invalid>true</scripting-invalid> <jsp-property-group> </jsp-config> <web-app>
不過,當咱們寫了太多的腳本,咱們開始尋求無腳本頁面,因而,JSP標準動做能夠來幫忙:
JavaBean相關
jsp:useBean
jsp:setProperty
jsp:getProperty
jsp:param
<%-- 帶體的useBean --%> <jsp:useBean id="beanId" class="someClass" scope="someScope"> <jsp:setProperty name="propertyName" value="propertyValue"/> </jsp:useBean> <%-- 使用多態的useBean --%> <jsp:useBean id="xx" class="someClass" type="superClassName"> </jsp:useBean> <%-- 使用param設置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="beanName" property="*"/> </jsp:useBean>
若是某個JavaBean的屬性仍是一個對象,咱們就得寫EL咯!
<%-- dot-operator --%> ${requestScope.name} <%-- []-operator --%> ${requstScope.someList["0"]}
EL中有一些隱式對象,下面是其一覽表:
做用域
pageScope
requsetScope
sessionScope
applicationScope
請求參數
param
paramValue
請求首部
header
headerValues
cookie
initParam
pageContext
<%-- 下面是一個表單 --%> <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獲取多值參數 --%> ${paramValues.food[0]} <%-- 獲取頭部信息 --%> ${header.host}