【Servlet】05-使用JSP

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}
相關文章
相關標籤/搜索