整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          當(dāng)Java遇見了Html-Jsp……

          方微信:動(dòng)力節(jié)點(diǎn)java學(xué)院

          官方微博:動(dòng)力節(jié)點(diǎn)

          一、什么是Jsp

          jsp是一種基于文本的程序,全名java server page,其特點(diǎn)是html和java程序共存。執(zhí)行時(shí)jsp會(huì)被運(yùn)行容器編譯,編譯后的jsp跟servlet一樣,因此jsp是另一種形式的servlet。

          二、jsp頁(yè)面組成

          jsp 頁(yè)面包括以下內(nèi)容:

          • 靜態(tài)內(nèi)容

          • 指令

          • 表達(dá)式

          • 小腳本

          • 聲明

          • 注釋

          1.指令:

          • page指令: 通常位于jsp頁(yè)面的頂端,同一個(gè)頁(yè)面可以有多個(gè)page指令。

          • include指令:將一個(gè)外部文件嵌入到j(luò)sp文件中。

          • taglib指令 :使用標(biāo)簽定義新的自定義標(biāo)簽。

          1.1其中page指令語(yǔ)法:

          <%@ page 屬性=“屬性值”>

          屬性默認(rèn)值
          languagejava
          import“”

          1.2 include 指令

          <%@ include file="url" %>

          1.3 動(dòng)作

          • include動(dòng)作

            <jsp:include page="url" flush="true"/>

            include 動(dòng)作和include指令區(qū)別

            描述 | include指令 | include 動(dòng)作

            --- | --- | ---

            語(yǔ)法 | < % @ include file=""/> | < jsp:include page="url" flush="true"/>

            發(fā)生時(shí)間 | 頁(yè)面轉(zhuǎn)換期間 | 請(qǐng)求期間

            包含內(nèi)容 | 文件實(shí)際內(nèi)容 | 頁(yè)面的輸出

            轉(zhuǎn)化servlet | 一個(gè)servlet | 2個(gè)servlet

            編譯時(shí)間 | 較慢 | 較快

            執(zhí)行時(shí)間 | 稍快 |較慢--每次資源必須被編譯

            forward動(dòng)作

            <jsp:forward page="url"/>

            ==request.getRequestDispatcher("/url").forward(res,resp);

            param動(dòng)作

            <jsp:param name="參數(shù)名" value="參數(shù)值"/>常常與<jsp:forward>一起使用

            例子:

            <jsp:forward page="user.jsp">

            <jsp:param name="email" value="1233@154.com"/></jsp:forward>

            2.jsp注釋

          • html注釋

            <!-- html注釋 -->//客戶端可見

          • jsp 注釋

            <%-- jsp注釋 --%>//客戶端不可見

          • jsp 腳本注釋 //客戶端不可見

          //單行注射

          /** 多行注釋*/

          3.jsp腳本

          在jsp頁(yè)面中執(zhí)行的java代碼,語(yǔ)法:

          <% java 代碼 %>

          4.jsp聲明

          在jsp頁(yè)面定義變量或者方法,語(yǔ)法

          <%! java 代碼 %>

          舉例:

          <%!

          String s="adele"; int add(int x,int y){ return x+y;

          }

          %>

          5.jsp表達(dá)式

          在jsp頁(yè)面執(zhí)行的表達(dá)式,語(yǔ)法:

          <% =表達(dá)式 %>// 表達(dá)式不以分號(hào)結(jié)尾

          舉例:

          <%!

          String s="adele";%><h2> hello,<%=s %> </h2>

          三、jsp生命周期

          CC36B22A-503E-4C29-98BB-3B58038C140E.png

          jspService()是用來(lái)處理客戶端請(qǐng)求的,對(duì)于每一個(gè)請(qǐng)求,服務(wù)器會(huì)創(chuàng)建一個(gè)新的線程來(lái)處理該請(qǐng)求。以多線程方式執(zhí)行大大降低對(duì)系統(tǒng)的資源需求,提高系統(tǒng)的并發(fā)量和縮短了響應(yīng)時(shí)間,servlet是常駐在服務(wù)器內(nèi)存中。

          它同servlet 一樣,jsp 實(shí)例初始化和銷毀也會(huì)調(diào)用sevlet的init() 和destroy();

          另外jsp還有自己的初始化方法_jspInit();_jspDestroy();

          <%@ page language="java" contentType="text/html";charset="utf-8">

          <%!

          public void _jspInit(){

          }public void _jspDestroy(){

          }

          %>

          四、javaben的使用

          動(dòng)作元素:

          動(dòng)作元素為請(qǐng)求處理階段提供信息。

          Paste_Image.png

          在jsp頁(yè)面使用javaben

          • 像普通的java類一樣,創(chuàng)建javabean;

          • 在jsp使用動(dòng)作標(biāo)簽來(lái)使用 javaben

          相關(guān)標(biāo)簽如下:

          <jsp:useBwan id="" class="" scope="" />

          <jsp:setProperty name="javabean 是例" property="*"/>(跟表單關(guān)聯(lián))

          <jsp:setProperty name="javabean 是例" property="javaben 屬性名"/>(跟表單關(guān)聯(lián))

          <jsp:setProperty name="javabean 是例" property="javaben 屬性名" value=""/>(手動(dòng)設(shè)置)

          <jsp:setProperty name="javabean 是例" property="javaben 屬性名" param="request對(duì)象參數(shù)"/>(跟request參數(shù)關(guān)聯(lián))

          <jsp:getProperty name="" property=""/>

          舉個(gè)例子:

          首先用戶 在login.jsp提交表單,然后用戶在dologin.jsp 根據(jù)動(dòng)作標(biāo)簽獲取參數(shù)。

          login.jsp

          <form name="loginForm" action="dologin.jsp?mypass=999999" method="post">

          <table>

          <tr>

          <td>用戶名:</td>

          <td><input type="text" name="username" value=""/></td>

          </tr>

          <tr>

          <td>密碼:</td>

          <td><input type="password" name="password" value=""/></td>

          </tr>

          <tr>

          <td colspan="2" align="center"><input type="submit" value="登錄"/></td>

          </tr>

          </table>

          </form>

          dologin.jsp

          <body>

          <jsp:useBean id="myUsers" class="com.po.Users" scope="page"/>

          <h1>setProperty動(dòng)作元素</h1>

          <hr>

          <!--根據(jù)表單自動(dòng)匹配所有的屬性 -->

          <%--

          <jsp:setProperty name="myUsers" property="*"/>

          --%>

          <!--根據(jù)表單匹配所有部分的屬性 -->

          <%--

          <jsp:setProperty name="myUsers" property="username"/>

          --%>

          <!--根表單無(wú)關(guān),通過(guò)手工賦值給屬性 -->

          <%--

          <jsp:setProperty name="myUsers" property="username" value="lisi"/>

          <jsp:setProperty name="myUsers" property="password" value="888888"/>

          --%>

          <!--通過(guò)URL傳參數(shù)給屬性賦值 -->

          <jsp:setProperty name="myUsers" property="username"/>

          <jsp:setProperty name="myUsers" property="password" param="mypass"/>

          <!-- 使用傳統(tǒng)的表達(dá)式方式來(lái)獲取用戶名和密碼 -->

          <%--

          用戶名:<%=myUsers.getUsername() %><br>

          密碼:<%=myUsers.getPassword() %><br>

          --%> <!-- 使用getProperty方式來(lái)獲取用戶名和密碼 -->

          用戶名:<jsp:getProperty name="myUsers" property="username"/> <br>

          密碼:<jsp:getProperty name="myUsers" property="password"/><br>

          <br>

          <br>

          <a href="testScope.jsp">測(cè)試javabean的四個(gè)作用域范圍</a>

          <%

          request.getRequestDispatcher("testScope.jsp").forward(request, response); %>

          </body>

          javaben 四大作用域

          • page ,僅當(dāng)前頁(yè)面有效

          • request ,通過(guò)httpRequest.getAttribute()獲取jvabean對(duì)象

          • session ,通過(guò)httpSession.getAttribute() 獲取javabean對(duì)象

          • application,通過(guò)application.getAttribute方法獲取javabean 對(duì)象。

          五、cookie

          1.概述:

          由于http協(xié)議的無(wú)狀態(tài),無(wú)法保存用戶的狀態(tài),所以需要用session和cookie.

          cookie 是web服務(wù)器保存在客戶端的一系列文本信息。它的作用時(shí)記錄一些用戶的行為,簡(jiǎn)化登陸,但是容易泄露用戶信息。

          2.jsp創(chuàng)建和使用cookie

          • 創(chuàng)建cookie

          Cookie cookie=new Cookie(String ,Object);

          • 寫入cookie

          response.addCookie(cookie);

          • 讀取 cookie

          Cookie[] cookies=request.getCookies();

          3.cookie的常用方法

          • setMaxAge();

          • setValue();

          • getName();

          • getValue();

          • getMaxAge();

          舉個(gè)列子: 使用cookie記住用戶登陸的賬號(hào)密碼;

          登陸界面:

          <body>

          <h1>用戶登錄</h1>

          <hr>

          <%

          request.setCharacterEncoding("utf-8");

          String username="";

          String password = "";

          Cookie[] cookies = request.getCookies(); if(cookies!=null&&cookies.length>0)

          { for(Cookie c:cookies)

          { if(c.getName().equals("username"))

          {

          username = URLDecoder.decode(c.getValue(),"utf-8");

          } if(c.getName().equals("password"))

          {

          password = URLDecoder.decode(c.getValue(),"utf-8");

          }

          }

          } %>

          <form name="loginForm" action="dologin.jsp" method="post">

          <table>

          <tr>

          <td>用戶名:</td>

          <td><input type="text" name="username" value="<%=username %>"/></td>

          </tr>

          <tr>

          <td>密碼:</td>

          <td><input type="password" name="password" value="<%=password %>" /></td>

          </tr>

          <tr>

          <td colspan="2"><input type="checkbox" name="isUseCookie" checked="checked"/>十天內(nèi)記住我的登錄狀態(tài)</td>

          </tr>

          <tr>

          <td colspan="2" align="center"><input type="submit" value="登錄"/><input type="reset" value="取消"/></td>

          </tr>

          </table>

          </form>

          </body>

          處理登陸邏輯的jsp

          <body>

          <h1>登錄成功</h1>

          <hr>

          <br>

          <br>

          <br>

          <%

          request.setCharacterEncoding("utf-8"); //首先判斷用戶是否選擇了記住登錄狀態(tài)

          String[] isUseCookies = request.getParameterValues("isUseCookie"); if(isUseCookies!=null&&isUseCookies.length>0)

          { //把用戶名和密碼保存在Cookie對(duì)象里面

          String username = URLEncoder.encode(request.getParameter("username"),"utf-8"); //使用URLEncoder解決無(wú)法在Cookie當(dāng)中保存中文字符串問(wèn)題

          String password = URLEncoder.encode(request.getParameter("password"),"utf-8");

          Cookie usernameCookie = new Cookie("username",username);

          Cookie passwordCookie = new Cookie("password",password);

          usernameCookie.setMaxAge(864000);

          passwordCookie.setMaxAge(864000);//設(shè)置最大生存期限為10天

          response.addCookie(usernameCookie);

          response.addCookie(passwordCookie);

          } else

          {

          Cookie[] cookies = request.getCookies(); if(cookies!=null&&cookies.length>0)

          { for(Cookie c:cookies)

          { if(c.getName().equals("username")||c.getName().equals("password"))

          {

          c.setMaxAge(0); //設(shè)置Cookie失效

          response.addCookie(c); //重新保存。

          }

          }

          }

          } %>

          <a href="users.jsp" target="_blank">查看用戶信息</a>

          </body>

          使用cookie獲取用戶信息:

          <body>

          <h1>用戶信息</h1>

          <hr>

          <%

          request.setCharacterEncoding("utf-8");

          String username="";

          String password = "";

          Cookie[] cookies = request.getCookies(); if(cookies!=null&&cookies.length>0)

          { for(Cookie c:cookies)

          { if(c.getName().equals("username"))

          {

          username = URLDecoder.decode(c.getValue(),"utf-8");

          } if(c.getName().equals("password"))

          {

          password = URLDecoder.decode(c.getValue(),"utf-8");

          }

          }

          } %>

          <BR>

          <BR>

          <BR>

          用戶名:<%=username %><br>

          密碼:<%=password %><br>

          </body>

          3.cookie和 session的區(qū)別

          sessioncookie
          在服務(wù)端保存信息在客戶端保存信息
          保存的 object類型保存的是 string 類型
          隨會(huì)話結(jié)束,銷毀數(shù)據(jù)可以長(zhǎng)期保存在客戶端中
          重要信息不重要信息

          如有問(wèn)題請(qǐng)下方留言
          來(lái)源:互聯(lián)網(wǎng)

          SP:Java Server Pages。JSP是一種網(wǎng)頁(yè)的編碼格式,不同于HTML的是JSP中是由 HTML中的標(biāo)簽指令 和 Java邏輯代碼 拼湊而成, 其中的Java代碼類似于JavaScript中的邏輯代碼, 但相對(duì)比來(lái)說(shuō)JSP中的Java代碼更方便閱讀和書寫.

          一:JSP的運(yùn)行原理

          當(dāng)JSP頁(yè)面被運(yùn)行時(shí),WEB容器會(huì)把請(qǐng)求交給JSP引擎處理,會(huì)將JSP翻譯成一個(gè)_jspServlet,然后按照Servlet的調(diào)用方式來(lái)進(jìn)行調(diào)用,

          瀏覽器向服務(wù)器發(fā)請(qǐng)求,不管訪問(wèn)的是什么資源,其實(shí)都是在訪問(wèn)Servlet,所以當(dāng)訪問(wèn)一個(gè)jsp頁(yè)面時(shí),其實(shí)也是在訪問(wèn)一個(gè)Servlet,服務(wù)器在執(zhí)行jsp的時(shí)候,首先把jsp翻譯成一個(gè)Servlet,所以我們?cè)L問(wèn)jsp時(shí),其實(shí)不是在訪問(wèn)jsp,而是在訪問(wèn)jsp翻譯過(guò)后的那個(gè)Servlet,

          二:Tomcat

          Tomcat在Web中的作用:

          Tomcat是Web中的容器,

          當(dāng)客戶在Web服務(wù)器中輸入請(qǐng)求的時(shí)候, 如果請(qǐng)求的動(dòng)態(tài)頁(yè)面, 那么Web服務(wù)器會(huì)創(chuàng)建一個(gè)Servlet來(lái)處理, Servlet就是Java代碼, 只是在服務(wù)器端的Java代碼, Servlet通過(guò)配置文件來(lái)攔截客戶所發(fā)出的請(qǐng)求, 并進(jìn)行相應(yīng)的處理, 最后反饋到客戶端.

          在這一系列的請(qǐng)求中,Web服務(wù)器是如何創(chuàng)建出Servlet來(lái)對(duì)請(qǐng)求進(jìn)行處理? 而Tomcat的作用就是幫助Web服務(wù)器來(lái)創(chuàng)建Servlet的

          Tomcat是應(yīng)用(java)服務(wù)器,它只是一個(gè)Servlet容器,是Apache的擴(kuò)展,處理動(dòng)態(tài)頁(yè)面的部分

          Tomcat各個(gè)文件夾的含義

          • bin:二進(jìn)制執(zhí)行文件。里面最常用的文件是startup.bat
          • conf:配置目錄。里面最核心的文件是server.xml。可以在里面改端口號(hào)等。默認(rèn)端口號(hào)是8080,也就是說(shuō),此端口號(hào)不能被其他應(yīng)用程序占用。
          • lib:庫(kù)文件。tomcat運(yùn)行時(shí)需要的jar包所在的目錄
          • logs:日志
          • temp:臨時(shí)產(chǎn)生的文件,即緩存
          • webapps:web的應(yīng)用程序。web應(yīng)用放置到此目錄下瀏覽器可以直接訪問(wèn)
          • work:編譯以后的class文件。

          當(dāng)我們通過(guò)瀏覽器訪問(wèn)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,

          index_jsp這個(gè)類是繼承 org.apache.jasper.runtime.HttpJspBase這個(gè)類的,通過(guò)查看Tomcat服務(wù)器的源代碼,可以知道在apache-tomcat-6.0.20-src\java\org\apache\jasper\runtime目錄下存HttpJspBase這個(gè)類的源代碼文件

          HttpJspBase 類是繼承 HttpServlet 的,所以 HttpJspBase 類是一個(gè) Servlet ,而 index_jsp 又是繼承 HttpJspBase類的,所以index_jsp類也是一個(gè)Servlet,所以當(dāng)瀏覽器訪問(wèn)服務(wù)器上的index.jsp頁(yè)面時(shí),其實(shí)就是在訪問(wèn)index_jsp這個(gè)Servlet,index_jsp這個(gè)Servlet使用_jspService這個(gè)方法處理請(qǐng)求。

          三:Jsp中的HTML代碼和Java代碼如何發(fā)送到客戶端

          1:jsp中的代碼是由 Java代碼 和 HTML 代碼組成的 但是兩種不同的代碼是如何實(shí)現(xiàn)他們的作用的?

          在客戶端發(fā)出請(qǐng)求時(shí)(請(qǐng)求的是動(dòng)態(tài)代碼) 但是客戶端卻只能看到HTML代碼, Java代碼是客戶端看不到的

          原因是: 請(qǐng)求的JSP頁(yè)面中,所有的代碼是通過(guò)了Web服務(wù)器(在Tomcat下)編譯后的Servlet代碼, 在jsp中編寫的java代碼和html代碼都會(huì)被翻譯到_jspService方法中去,在jsp中編寫的java代碼會(huì)原封不動(dòng)地翻譯成java代碼,如<%out.print("HelloJsp");%>直接翻譯成out.print("Hello Jsp");,而HTML代碼則會(huì)翻譯成使用out.write("<html標(biāo)簽>\r\n");的形式輸出到瀏覽器。在jsp頁(yè)面中編寫的html排版標(biāo)簽都是以out.write("<html標(biāo)簽>\r\n");的形式輸出到瀏覽器,瀏覽器拿到html代碼后才能夠解析執(zhí)行html代碼。

          當(dāng)執(zhí)行_jspService方法處理請(qǐng)求時(shí),就會(huì)執(zhí)行在jsp編寫的java代碼了,所以Jsp頁(yè)面中的java代碼服務(wù)器是通過(guò)調(diào)用_jspService方法處理請(qǐng)求時(shí)執(zhí)行的。(_jspService中的Java代碼是實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面的邏輯基礎(chǔ))

          JSP指令用來(lái)設(shè)置整個(gè)JSP頁(yè)面相關(guān)的屬性,如網(wǎng)頁(yè)的編碼方式和腳本語(yǔ)言。

          語(yǔ)法格式如下:

          <%@ directive attribute="value" %>

          指令可以有很多個(gè)屬性,它們以鍵值對(duì)的形式存在,并用逗號(hào)隔開。

          JSP中的三種指令標(biāo)簽:

          指令描述
          <%@ page ... %>定義網(wǎng)頁(yè)依賴屬性,比如腳本語(yǔ)言、error頁(yè)面、緩存需求等等
          <%@ include ... %>包含其他文件
          <%@ taglib ... %>引入標(biāo)簽庫(kù)的定義

          Page指令

          Page指令為容器提供當(dāng)前頁(yè)面的使用說(shuō)明。一個(gè)JSP頁(yè)面可以包含多個(gè)page指令。

          Page指令的語(yǔ)法格式:

          <%@ page attribute="value" %>

          等價(jià)的XML格式:

          <jsp:directive.page attribute="value" />

          屬性

          下表列出與Page指令相關(guān)的屬性:

          屬性描述
          buffer指定out對(duì)象使用緩沖區(qū)的大小
          autoFlush控制out對(duì)象的 緩存區(qū)
          contentType指定當(dāng)前JSP頁(yè)面的MIME類型和字符編碼
          errorPage指定當(dāng)JSP頁(yè)面發(fā)生異常時(shí)需要轉(zhuǎn)向的錯(cuò)誤處理頁(yè)面
          isErrorPage指定當(dāng)前頁(yè)面是否可以作為另一個(gè)JSP頁(yè)面的錯(cuò)誤處理頁(yè)面
          extends指定servlet從哪一個(gè)類繼承
          import導(dǎo)入要使用的Java類
          info定義JSP頁(yè)面的描述信息
          isThreadSafe指定對(duì)JSP頁(yè)面的訪問(wèn)是否為線程安全
          language定義JSP頁(yè)面所用的腳本語(yǔ)言,默認(rèn)是Java
          session指定JSP頁(yè)面是否使用session
          isELIgnored指定是否執(zhí)行EL表達(dá)式
          isScriptingEnabled確定腳本元素能否被使用

          Include指令

          JSP可以通過(guò)include指令來(lái)包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是該JSP文件的一部分,會(huì)被同時(shí)編譯執(zhí)行。

          Include指令的語(yǔ)法格式如下:

          <%@ include file="文件相對(duì) url 地址" %>

          include 指令中的文件名實(shí)際上是一個(gè)相對(duì)的 URL 地址。

          如果您沒(méi)有給文件關(guān)聯(lián)一個(gè)路徑,JSP編譯器默認(rèn)在當(dāng)前路徑下尋找。

          等價(jià)的XML語(yǔ)法:

          <jsp:directive.include file="文件相對(duì) url 地址" />

          Taglib指令

          JSP API允許用戶自定義標(biāo)簽,一個(gè)自定義標(biāo)簽庫(kù)就是自定義標(biāo)簽的集合。

          Taglib指令引入一個(gè)自定義標(biāo)簽集合的定義,包括庫(kù)路徑、自定義標(biāo)簽。

          Taglib指令的語(yǔ)法:

          <%@ taglib uri="uri" prefix="prefixOfTag" %>

          uri屬性確定標(biāo)簽庫(kù)的位置,prefix屬性指定標(biāo)簽庫(kù)的前綴。

          等價(jià)的XML語(yǔ)法:

          <jsp:directive.taglib uri="uri" prefix="prefixOfTag" />

          如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!


          主站蜘蛛池模板: 精品福利一区二区三区| 日韩精品中文字幕视频一区| 亚洲乱码一区av春药高潮| 国产综合视频在线观看一区| 亚洲综合色一区二区三区| 香蕉在线精品一区二区| 国产一区二区三区免费在线观看| 亚洲国产精品乱码一区二区| 精品一区二区三区在线观看| 一区二区三区在线播放视频| 亚洲av成人一区二区三区观看在线| 国产一区二区三区高清视频| 国产精品无码一区二区三区不卡| 国产一区二区三区日韩精品| 国产午夜精品片一区二区三区| 亚洲AV色香蕉一区二区| 丰满爆乳一区二区三区| 亚洲熟妇av一区二区三区漫画| 红杏亚洲影院一区二区三区| 国产免费伦精品一区二区三区| 无码人妻精品一区二| 亚洲AⅤ无码一区二区三区在线| 无码国产精品一区二区高潮| 成人精品一区二区电影| 国产成人免费一区二区三区| 国产精品亚洲专区一区| 无码人妻一区二区三区免费视频| 国产凸凹视频一区二区| 色一情一乱一伦一区二区三区| 秋霞日韩一区二区三区在线观看 | 白丝爆浆18禁一区二区三区 | 午夜爽爽性刺激一区二区视频| 国产成人一区二区三中文| 亚洲国产欧美一区二区三区| asmr国产一区在线| 国产一区二区三区夜色| 天天看高清无码一区二区三区| 一区二区手机视频| 国产美女视频一区| 亚洲一区综合在线播放| 国产精品第一区揄拍|