1. 程式人生 > >【Web】Jsp基礎學習

【Web】Jsp基礎學習

Apache目錄結構


Web 目錄結構


WEB-INF下包括下列檔案


WEB-INF目錄結構

1.      WEB-INF是java的WEB應用的安全目錄。所謂安全目錄就是客戶端無法訪問,只有伺服器端可以訪問的目錄。

2.      Web.xml,專案部署檔案。

3.      Classes資料夾,用以放置*.class檔案

4.      Lib資料夾,用以存放需要的jar包。

MyEclipseJavaWeb專案目錄結構


Web專案虛擬路徑

可以在下面這個地方配置


修改tomcat預設的埠號

在conf/server.xml檔案

<Connector port=”8080”

         Protocol=”HTTP/1.1”

         connectionTimeout=”20000”

         redirecPort=”8443”

/>

JSP:

JSP全名為Java Server Pages 其根本是一個簡化的Servlet設計,他實現了在Java當中使用標準HTML標籤。Jsp是一種動態網頁技術標準,也是JavaEE標準。JSP和Servlet一樣,是在伺服器端執行的。

常見動態網站開發技術對比

JSP

Java平臺,安全性高,適合開發大型的,企業級的Web應用程式。

Asp.net

.Net平臺,簡單易學。但是安全性以及跨平臺性差。

Php

簡單,高效,成本低開發週期短,特別適合中小型企業Web應用開發。(LAMP:Linux+Apache+MySQL+PHP)

Jsp基礎語法

Page指令 通常位於jsp頁面的頂端,同一個頁面可以有多個page指令。

Include指令  將一個外部檔案嵌入到JSP檔案中,同時解析這個頁面中的JSP語句。

Taglib指令  使用標籤庫定義新的自定義標籤,在JSP頁面中啟用定製行為。

Page指令語法

<%@ page 屬性1=“屬性值” 屬性2=“屬性值1,屬性值2…” 屬性n=“屬性值n”%>

屬性

描述

預設值

Language

指定JSP頁面使用的指令碼語言

Java

Import

通過該屬性來引用指令碼語言中使用到的類檔案

ContentType

指定JSP頁面所採用的編碼方式

Text/html  ISO-8859-1

JSP 註釋

HTML的註釋

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

JSP註釋

<%--html註釋--%> //客戶端不可見

JSP指令碼註釋

//單行註釋    /**/多行註釋

JSP指令碼

<% Java程式碼 %>

Jsp宣告

<%! Java程式碼%>

<%!

       String s="ISI";  //聲明瞭一個變數

       int add(int x,int y){ //聲明瞭一個方法

                return x+y;

       }

 %>

JSP表示式

<% =表示式%>  //注意:表示式不以分號結束

你好,<%=s%>

 <%=add(3,2) %>

JSP頁面宣告週期


JspService()方法被呼叫來處理客戶端的請求。對每一個請求,JSP引擎建立一個新的執行緒來處理該請求。如果有多個客戶端同時請求該JSP檔案,則JSP引擎會建立多個執行緒。每個客戶端請求對應一個執行緒。以多執行緒方式執行可以大大降低對系統的資源需求,提高系統的併發量和響應時間。但要注意多執行緒的程式設計帶來的程式的同步問題,由於該servlet始終常駐與記憶體,所以響應時間非常快。

列印九九乘法表

<%!

                   String printCalculate(){

                            String s="";

                            for(int i = 1;i<=9;i++){

                                     for(int j=1;j<=i;j++){

                                               s+=(i+"*"+j+"="+(j*i)+"&nbsp;");

                                     }

                                     s+="<br/>";

                            }

                            return s;

                   }

                   //使用指令碼列印乘法表

                   void printCalculate1(JspWriter out)throws IOException{

                            String s="";

                            for(int i = 1;i<=9;i++){

                                     for(int j=1;j<=i;j++){

                                               out.println(i+"*"+j+"="+(j*i)+"&nbsp;");

                                     }

                                     out.println("<br/>");

                            }

                   }

         %> 

         <%=printCalculate()%>

         <%--指令碼方式呼叫要加分號 --%>

         <%printCalculate1(out); %>

Get

以明文的方式通過URL提交資料,資料在URL中可以看到。提交的資料最多不超過2KB。安全性較低但效率比post方式高。適合提交資料量不大,安全性不高的資料。比如:搜尋、查詢等

Post

將使用者提交資訊封裝在HTML HEADER中。適合提交資料量大,安全性高的使用者資訊。比如:註冊、修改、上傳等。

JSP內建物件

JSP內建物件是Web容器建立的一組物件,不使用new關鍵字就可以使用的內建物件。

JSP九大內建物件

介紹

Out物件

Out物件是JspWriter類的例項,是向客戶端輸出內容常用的物件。

常用方法:

1.       Void println() 向客戶端列印字串

2.       Void clear()清除緩衝區的內容,如果在flush之後呼叫會丟擲異常。

3.       Void clearBuffer();清除緩衝區的內容,如果在flush之後呼叫不會丟擲異常。

4.       Void flush() 將緩衝區內容輸出到客戶端。

5.       Int getBufferSize() 返回緩衝區以位元組數的大小,如不設緩衝則為0

6.       Int getRemaining() 返回緩衝區還剩餘多少可用。

7.       Boolean isAutoFlush() 返回緩衝區滿時,是自動清空還是丟擲異常。

8.       Void close() 關閉輸出流。

Request物件

客戶端的請求資訊被封裝在request物件中,通過它才能瞭解客戶的需求,然後做出響應。他是HttpServletRequest類的例項。Request物件具有請求域,即完成客戶的請求之前,該物件一直有效。

常用方法:

1.       String getParameter(String name) 返回name指定引數的字元。

2.       String[] getParameterValues(String name) 返回包含引數name的所有值得陣列。

3.       Void setAttribute(String,Object);儲存此請求中的屬性。

4.       Object getAttribute(String name) 返回指定屬性的屬性值。

5.       String getContentType() 得到請求體的MIME型別。

6.       String getProtocol() 返回請求用的協議型別及版本號。

7.       String getServerName() 返回接受請求的伺服器主機名。

8.       int getServerPort()返回伺服器接收此請求所用的埠號

9.       String getCharacterEncoding()返回字元編碼方式

10.   Void setCharacterEncoding()設定請求的字元編碼方式。

11.   Int getContentLength() 返回請求體的長度(以位元組數)

12.   String getRemoteAddr()返回傳送此請求的客戶端IP地址

13.   String getRealPath(String path) 返回一虛擬路徑的真實路徑

14.   String request.getContextPath()返回上下文路徑

Response物件

Response 物件包含了響應客戶請求的有關資訊,但在JSP中很少用到。它是HttpServletReponse類的例項。Response物件具有頁面作用域,即訪問一個頁面時,該頁面內的response物件只能對這次的訪問有效,其他頁面的response物件對當前頁面無效。

1.       String getCharacterEncoding() 返回響應用的是何種字元編碼。

2.       Void setContentType(String type) 設定響應的MIME型別。

3.       PrintWriter getWriter() 返回可以向客戶端輸出字元的一個物件(注意比較:PrintWriter與內建out的區別)PrintWriter輸出總是提前於內建out物件。

4.       SendRedirect(java.lang.String location) 重新定向客戶端請求

Session物件

Session 表示客戶端與伺服器的一次會話。

Web中的session指的是使用者在瀏覽某個網站時,從進入網站到瀏覽器關閉所經過的這段時間,也就是使用者瀏覽這個網站所花費的時間,session實際上是一個特定的時間概念。

在伺服器的記憶體中儲存著不同使用者的session。

1.       Session物件在第一個JSP頁面被裝載時自動建立,完成會話期管理。

2.       從一個客戶開啟瀏覽器並連線到伺服器開始,到客戶端關閉瀏覽器離開這個伺服器結束,被稱為一個會話。

3.       當一個客戶訪問一個伺服器時,可能會在伺服器的幾個頁面之間切換,伺服器應當通過某種方法指導這是一個客戶,就需要session物件。

4.       Session物件是HttpSession類的例項。

Session物件的方法

1.       Long getCreationTime() 返回session建立時間。

2.       Public String getId(); 返回session建立時JSP引擎為它設的唯一ID號。

3.       Public Object setAttribute(String name,Object value) 使用指定名稱將物件繫結到此會話。

4.       Public Object getAttribute(String name) 返回此會話中的指定名稱繫結在一起的物件,如果沒有物件繫結在該名稱下,則返回null。

5.       String[] getValueNames() 返回一個包含此session N種可用屬性的陣列。

6.       Int getMaxInctiveInterval(); 返回兩次請求間隔多長時間此session被取消。(單位秒)

7.       SetMaxInctiveInterval(); 設定生存時間。

Session的生命週期

建立: 當客戶端第一次訪問某個jsp或者servlet時候,伺服器會為當前會話建立一個SessionId,每次客戶端向伺服器傳送請求時,都會將此SessionId攜帶過去,伺服器會對此SessionID進行校驗。

活動:某次會話當中通過超連結開啟的新頁面屬於同一次會話。

只要當前會話頁面沒有全部關閉,重新開啟新的瀏覽器視窗訪問同一專案資源時屬於同一次會話。除非本次會話的所有頁面都關閉後再重新訪問某個Jsp或者Servlet將會建立新的會話。

銷燬:1.session.invalidate()方法

      2.Session過期(超時)

      3. 伺服器重啟

application物件

Application 物件實現了使用者間資料的共享,可存放全部變數。

Application 開始於伺服器的啟動,終止於伺服器的關閉。

在使用者的前後連線或不同使用者之間的連線中,可以對Application物件的同一屬性進行操作。

在任何地方對Application物件屬性的操作,都將影響到其他使用者對此的訪問。

伺服器的啟動和關閉決定了Application物件的生命。

Application物件是ServletContext類的例項

常用方法:

1.       Public void setAttribute(String name,Object value)使用指定名稱將物件繫結到此會話。

2.       Public Object getAttribute(String name) 返回與此會話中的指定名稱繫結在一起的物件,如果沒有物件繫結在該名稱下,則返回null

3.       Enumeration getAttributeNames()返回所有可用屬性名的列舉

4.       String getServerInfo() 返回JSP(SERVLET)引擎名及版本號

Page內建物件

Page物件就是指向當前jsp頁面本身,有點像類中的this指標,它是java.lang.Object 類的例項。常用方法如下:

1.       Class getClass() 返回此Object的類

2.       Int hashCode() 返回此Object的hash碼

3.       Boolean equals(Object obj) 判斷此Object是否與指定的Object物件相等。

4.       Void copy(Object obj) 把此Object拷貝到指定的Object物件中。

5.       Object clone() 克隆此Object物件

6.       String toString() 把此Object物件轉換成String類的物件

7.       Void notify() 喚醒一個等待的執行緒

8.       Void nofityAll() 喚醒所有等待的執行緒

9.       Void wait(int timeout) 使一個執行緒處於等待直到timeout結束或被喚醒。

10.   Void wait() 使一個執行緒處於等待直到被喚醒

PageContext物件

PageContext 物件提供了對JSP頁面內所有的物件及名字空間的訪問。

PageContext 物件可以訪問到本頁所在的session,也可以取本頁所在的Application的某一屬性值。

PageContext物件相當於頁面中所有功能的集大成者。

PageContext 物件的本類名也叫pageContext.

常用方法:

1.       JspWriter getOut() 返回當前客戶端響應被使用的JspWriter流(out)

2.       HttpSession getSession() 返回當前頁中的HttpSession物件(session)

3.       Object getPage() 返回當前頁的Object物件(page)

4.       ServletRequest getRequest() 返回當前頁的ServletRequest物件(request)

5.       ServletResponse getResponse() 返回當前頁的ServletResponse物件(response)

6.       Void setAttribute(String name,int scope) 設定屬性及屬性值。

7.       Object getAttribute(String name,int scope) 在指定範圍內取屬性的值。

8.       Int getAttributeScope(String name) 返回某屬性的作用範圍。

9.       Void forward(String relativeUrlPath) 使當前頁面重導到另一頁面

10.   Void include(String relativeUrlPath) 在當前位置包含另一檔案

Config物件

Config物件是在一個Servlet初始化時,JSP引擎向它傳遞資訊用的,此資訊包括Servlet初始化時所要用到的引數(通過屬性名和屬性值構成)以及伺服器的有關資訊(通過傳遞一個ServletContext物件),常用方法:

1.       ServletContext getServletContext() 返回含有伺服器相關資訊的ServletContext物件。

2.       String getInitParameter(String name) 返回初始化引數的值。

3.       Enumeration getInitParameterNames() 返回Servlet初始化所需所有引數的列舉。

Exception 物件

Exception物件是一個異常物件,當一個頁面在執行過程中發生了異常,就產生這個物件。如果一個JSP頁面要應用此物件,就必須把isErrorPage設為true,否則無法編譯。他實際上是java.lang.Throwable的物件,常用方法如下:

1.       String getMessage() 返回描述異常的資訊

2.       String toString() 返回關於異常的簡短描述訊息

3.       Void printStackTrace() 顯示異常及其棧軌跡

4.       Throwable FillInStackTrace() 重寫異常的執行棧軌跡

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" errorPage="exception.jsp"%>

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" isErrorPage="true"%>

使用URL傳參中文亂碼問題

修改tomcat配置檔案server.xml

<Connector port=”8080”protocol=”HTTP/1.1”

         connectionTimeout=”20000”

         redirectPort=”8443”

         URIEncoding=”utf-8”>

重啟tomcat伺服器

請求轉發與請求重定向

請求重定向:客戶端行為,response.sendRedirect(),從本質上講等同於兩次請求,前一次的請求物件不會儲存,傳遞的引數丟失,位址列的URL地址會改變。

請求轉發:伺服器行為,reqeust.getRequestDispatcher().forward(req,resp);是一次請求,轉發後請求物件會儲存,位址列的URL地址不會改變。

Session超時時間

Tomcat預設session超時時間為30分鐘。

設定session超時有兩種方式。

1.      session.setMaxInactiveInterval();//單位是秒

2.      在web.xml中配置

<session-config>

           <session-timeout>

                    10

           </session-timeout>

</session-config> //單位是分鐘

Javabean

Javabeans 就是符合某種特定的規範的Java類。使用Javabeans的好處是解決程式碼重複編寫,減少程式碼冗餘,功能區分明確,提高程式碼的維護性。

Javabean設計原則


Public class Students{
	Private String name;
	Private int age;
	Public Students(){}
	Public void setName(String name){this.name=name;}
	Public String getName()(return this.name;)
	Public void setAge(int age){this.age=age;}
	Public int getAge(){return this.age;}
}<strong>
</strong>

Jsp動作

JSP動作元素(action elements),動作元素為請求處理階段提供資訊。動作元素遵循XML元素的語法,有一個包含元素名的開始標籤,可以有屬性、可選的內容、與開始標籤匹配的結束標籤。

Jsp動作元素包括五類

第一類是與存取Javabean 有關的,包括:

<jsp:userBean><jsp:setProperty><jsp:getProperty>

第二類是JSP1.2就開始有的基本元素,包括6個動作元素

<jsp:include> <jsp:forward><jsp:param> <jsp:plugin> <jsp:params> <jsp:fallback>

第三類是JSP2.0新增加的元素,主要與JSP Document相關,包括六個元素

<jsp:root>  <jsp:declaration> <jsp:scriptlet><jsp:expression> <jsp:text> <jsp:output>

第四類是JSP2.0新增的動作元素,主要是用來動態生成XML元素標籤的值,包括3個動作

<jsp:attribute> <jsp:body><jsp:element>

第五類是JSP2.0新增的動作元素,主要是用在Tag File中,有2個元素

<jsp:invoke> <jsp:dobody>

在JSP頁面中使用Javabeans

建立一個JavaBeans類

package com.po;

/**

 * 使用者類

*/

public class Users {

         private String username;

         private String password;

         public String getUsername() {

                   return username;

         }

         public void setUsername(String username) {

                   this.username = username;

         }

         public String getPassword() {

                   return password;

         }

         public void setPassword(String password) {

                   this.password = password;

         }

         public Users(){}

}

1.  像使用普通java類一樣,建立javabean例項。

<%@ page import="com.po.Users" %>

<%

                Users user = new Users();

                user.setPassword("123");

                user.setUsername("lisi");

   %>

<h1>使用普通方式建立javaBean例項</h1>

     使用者名稱:<%=user.getUsername() %><br/>

     密碼:<%=user.getPassword() %>

1.      在Jsp頁面中通常使用jsp動作標籤使用javabean

UserBeans動作

setProperty動作

getProperty動作

<jsp:useBean>

作用:在jsp頁面中例項化或者在指定範圍內使用javabean

<jsp:useBean id=”識別符號” class=”java類名” scope=”作用範圍”/>

例:

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

     <h1>使用useBean建立javaBean例項</h1>

     使用者名稱:<%=myUsers.getUsername() %><br/>

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

這裡獲取的值都為null

<jsp:setProperty>

作用:給已經例項化的Javabean物件的屬性賦值,一共有四種形式

1.       <jsp:setProperty name=”javaBean例項名” property=”*”/> (跟表單關聯)

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

    <h1>setProperty用法</h1><hr>

    <!-- 根據表單名字和Javabean名字自動匹配所有的屬性 -->

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

使用者名稱:<%=myUsers.getUsername() %><br/>

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

2.       <jsp:setProperty name=”javaBean例項名” property=”JavaBean屬性名”/> (跟表單關聯)

對部分屬性進行匹配,這裡只匹配使用者名稱,密碼顯示為空

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

    <h1>setProperty用法</h1><hr>

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

使用者名稱:<%=myUsers.getUsername() %><br/>

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

3.       <jsp:setProperty name=”JavaBean例項名” property=”JavaBean屬性名” value=”BeanValue”/>(手工設定)

和表單無關,通過手工賦值的方法。

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

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

使用者名稱:<%=myUsers.getUsername() %><br/>

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

4.       <jsp:setProperty name=”JavaBean例項名” property=”propertyName” param=”request物件中的引數名”/>(跟request引數關聯)

Param 可以是url地址傳參的方式給javabean賦值,密碼顯示666

<form action="setProperty.jsp?mypass=666" method="post">

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

使用者名稱:<%=myUsers.getUsername() %><br/>

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

<jsp:getProperty>

作用: 獲取指定Javabean物件的屬性值

<jsp:getProperty name=”JavaBean例項名” property=”屬性名”/>

使用者名稱:<jsp:getProperty property="username" name="myUsers"/><br/>

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

    <%--使用者名稱:<%=myUsers.getUsername() %><br/>

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

Javabean的四個作用域範圍

說明:使用useBeans的scope屬性可以用來指定javabean的作用範圍

Page

僅在當前頁面有效

Request

可以通過HttpRequest.getAttribute()方法獲取JavaBean物件

Session

可以通過HttpSession.getAttribute()方法獲取JavaBean物件

Application

可以通過application.getAttribute()方法取得JavaBean物件

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

使用者名稱:<jsp:getProperty property="username" name="myUsers"/><br/>

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

   <!-- 通過內建物件方式獲取 -->

使用者名稱<%=((Users)application.getAttribute("myUsers")).getUsername()%><br/>

密碼:<%=((Users)application.getAttribute("myUsers")).getPassword()%>

Model1簡介

在Model 1 出現之前,整個Web應用的情況:幾乎全部由JSP頁面組成,JSP頁面接收處理客戶端的請求,對請求處理後直接作出響應。

Javabean的出現可以使jsp頁面中使用Javabean封裝的資料或者呼叫 Javabean的業務邏輯程式碼,這樣大大提升了程式的可維護性。



例子:Model 1登入案例

Login.jsp  登入介面

<%@ page language="java" import="java.util.*" contentType="text/html; charset=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">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  </head>
  
  <body>
    <form action="dologin.jsp" method="post">
    	使用者名稱:<input type="text" name="username"/><br/>
    	密碼:<input type="password" name="password" value=""/><br/>
    	<input type="submit" value="登入"> 
    </form>
  </body>
</html>
Users.java  Javabean 
package com.po;
public class Users {
	private String username;
	private String password;
	public Users(){
		
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}
UsersDAO.java  處理資料操作
package com.dao;
import com.po.Users;
//使用者的業務邏輯
public class UsersDAO {
	//使用者登入方法
	public boolean usersLogin(Users u){
		if("admin".equals(u.getUsername())&&"admin".equals(u.getPassword())){
			return true;
		}else{
			return false;
		}
	}
}
dologin.jsp  處理登入,登入成功或失敗分別跳轉到不同頁面
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<jsp:useBean id="loginUser" class="com.po.Users" scope="page"></jsp:useBean>
<jsp:useBean id="userDao" class="com.dao.UsersDAO" scope="page"></jsp:useBean>
<jsp:setProperty property="*" name="loginUser"/>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

if(userDao.usersLogin(loginUser)){

	session.setAttribute("loginUser",loginUser.getUsername() );
	request.getRequestDispatcher("login_success.jsp").forward(request, response);
}else{
	response.sendRedirect("login_fail.jsp");
}
%>

Jsp狀態管理

http協議的無狀態性

無狀態是指,當瀏覽器傳送請求給伺服器的時候,伺服器響應客戶端的請求。

但是當同一個瀏覽器再次傳送請求給伺服器的時候,伺服器並不知道它就是剛才那個瀏覽器。

簡單地說,就是伺服器不會記得你,所以就是無狀態協議。

Cookie

Cookie: 是Web伺服器儲存在客戶端的一系列文字資訊。

典型應用一:判斷註冊使用者是否已經登入網站。

典型應用二:“購物車”的處理。

Cookie的作用:

         對特定物件的追蹤。

         儲存使用者網頁瀏覽記錄與習慣。

         簡化登入。

安全風險:容易洩露使用者的資訊。

Jsp中建立與使用Cookie

建立Cookie物件

Cookie newCookie = new Cookie(String key ,Object value);

寫入Cookie物件

Response.addCookie(new Cookie);

讀取Cookie物件

Cookie[] cookies= request.getCookies();

Cookie的常用方法

Void setMaxAge(int expiry)

設定cookie的有效期,以秒為單位

Void setValue(String value)

在cookie建立後,對cookie進行賦值

String getName()

獲取cookie的名稱

String getValue()

獲取cookie的值

Int getMaxAge()

獲取cookie的有效時間,以秒為單位

案例:記住使用者的使用者名稱和密碼的登入狀態。

login.jsp

<%@ page language="java" import="java.util.*,java.net.*" contentType="text/html; charset=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">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  </head>
  
  <body>
  <%
    	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 = c.getValue();
    			}
    		}
    	}
    	
     %>
    <form action="dologin.jsp" method="post">
    	使用者名稱:<input type="text" name="username" value="<%=username%>"/><br/>
    	密碼:<input type="password" name="password" value="<%=password %>"/><br/>
    	記住我的登入狀態<input type="checkbox" name="isUseCookie" checked="checked"/><br/>
    	<input type="submit" value="登入"> <input type="reset" value="取消">
    </form>
  </body>
</html>
dologin.jsp 處理登入邏輯,向客戶端寫Cookie
<%@page import="java.net.CookieStore"%>
<%@ page language="java" import="java.util.*,java.net.*" contentType="text/html; charset=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">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'users.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  <!-- 
  	Cookie 中文亂碼,需要使用 java.net.* 包裡的類來處理
   -->
  
  <body>
    <h1>使用者登入</h1>
    <%
    	request.setCharacterEncoding("utf-8");
    	//判斷使用者是否點選了記住登入狀態
    	String[] isUserCookies = request.getParameterValues("isUseCookie");
    	if(isUserCookies != null && isUserCookies.length >0){
    		//把使用者名稱和密碼儲存在Cookie物件裡面
    		//使用URLEncoder 解決無法再Cookie中儲存中文問題
    		String username= URLEncoder.encode(request.getParameter("username"),"utf-8");
    		String password=request.getParameter("password");
    		
    		Cookie usernameCookie = new Cookie("username",username);
    		Cookie passwordCookie = new Cookie("password",password);
    		//設定最大生存期限
    		usernameCookie.setMaxAge(864000);
    		passwordCookie.setMaxAge(864000);
    		response.addCookie(usernameCookie);
    		response.addCookie(passwordCookie);
    	}else{
    		//把已經儲存的cookie 清空
    		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);//設定最大時間為0,使其失效
    					response.addCookie(c);
    				}
    			
    			}
    		}
    	}
     %>
    
    <a href="users.jsp" target="_blank">檢視使用者名稱和密碼</a>
    <hr>
  </body>
</html>
users.jsp 讀取cookie中使用者的登入資訊
<%@ page language="java" import="java.util.*,java.net.*" contentType="text/html; charset=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">
<html>
  <head>
    <base href="<%=basePath%>">  
    <title>My JSP 'users.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  </head>  
  <body>
    <h1>檢視使用者資訊</h1>  
    <%
    	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 = c.getValue();
    			}
    		}
    	}  	
     %>
    <hr>
    使用者名稱:<%=username %><br/>
 密碼:<%=password %>
  </body>
</html>

Session與Cookie對比

Session

Cookie

在伺服器端儲存使用者資訊

Session中儲存的是Object型別

隨會話的結束而將其儲存的資料銷燬

儲存重要的資訊

在客戶端儲存使用者資訊

Cookie儲存的是String型別

Cookie可以長期儲存在客戶端

儲存不重要的使用者資訊

Include指令

語法:

<%@ include file=”URL”%>

Include動作

語法:

<jsp:include page=”URL”flush=”true|false”/>

Page 表示要包含的頁面

Flush 表示是否從緩衝區中讀取頁面

Include指令與include動作比較

Include指令

Jsp:include 動作

語法格式

<%@ include file=” ..”%>

<jsp:include page=”..”>

發生作用的時間

頁面編譯期間

請求期間

包含的內容

檔案的實際內容

頁面的輸出

轉換成Servlet

主頁面和包含頁面轉換為一個Servlet

主頁面和包含頁面轉換為獨立的Servlet

編譯時間

較慢—資源必須被解析

較快

執行時間

稍快

較慢—每次資源必須被解析

Forward動作

語法:

<jsp:forward page=”URL”/>

等同於伺服器轉發:

Request.getRequestDispatcher(“/url”).forward(request,response);

Param動作

語法:

<jsp:param name=”引數名” value=”引數值”>

常常與 <jsp:forward> 一起使用,作為其子標籤。

<jsp:forward page=”xxx.jsp”>

   <jsp:param name=”email” value=”[email protected]”>

</jsp:forward>

小案例:商品瀏覽記錄



1.首先,開啟mysql資料庫,建立表和插入資料
DROP TABLE IF EXISTS `items`;
CREATE TABLE `items` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) default NULL,
  `city` varchar(50) default NULL,
  `price` int(11) default NULL,
  `number` int(11) default NULL,
  `picture` varchar(500) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

-- ----------------------------

-- ----------------------------
INSERT INTO `items` VALUES ('1', '沃特籃球鞋', '佛山', '180', '500', '001.jpg');
INSERT INTO `items` VALUES ('2', '安踏運動鞋', '福州', '120', '800', '002.jpg');
INSERT INTO `items` VALUES ('3', '耐克運動鞋', '廣州', '500', '1000', '003.jpg');
INSERT INTO `items` VALUES ('4', '阿迪達斯T血衫', '上海', '388', '600', '004.jpg');
INSERT INTO `items` VALUES ('5', '李寧文化衫', '廣州', '180', '900', '005.jpg');
INSERT INTO `items` VALUES ('6', '小米3', '北京', '1999', '3000', '006.jpg');
INSERT INTO `items` VALUES ('7', '小米2S', '北京', '1299', '1000', '007.jpg');
INSERT INTO `items` VALUES ('8', 'thinkpad筆記本', '北京', '6999', '500', '008.jpg');
INSERT INTO `items` VALUES ('9', 'dell筆記本', '北京', '3999', '500', '009.jpg');
INSERT INTO `items` VALUES ('10', 'ipad5', '北京', '5999', '500', '010.jpg');
2. 建立資料庫幫助類,獲取資料庫連線物件 DBHelper.java
package util;
import java.sql.Connection;
import java.sql.DriverManager;
public class DBHelper {
	private static final String driver ="com.mysql.jdbc.Driver";//載入資料庫驅動
	//連線資料庫的URL地址
	private static final String url = "jdbc:mysql://localhost:3306/shopping?useUnicode=true&characterEncoding=UTF-8";
	private static final String username="root";//資料庫使用者名稱
	private static final String password="limeng";//資料庫密碼
	
	private static Connection conn= null;
	static{
		
		try {
			Class.forName(driver);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	//單例模式返回資料庫連線物件
	public static Connection getConnection() throws Exception{
		if(conn== null){
			conn = DriverManager.getConnection(url,username,password);
			return conn;
		}
		return conn;
	}
}
3.建立實體類Items.java 和資料庫的欄位對應
package entity;
//商品類
public class Items {
	private int id;
	private String name;//名字
	private String city;//產地
	private int price;//價格
	private int number;//庫存
	private String picture;//圖片
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getCity() {
		return city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}

	public int getNumber() {
		return number;
	}

	public void setNumber(int number) {
		this.number = number;
	}

	public String getPicture() {
		return picture;
	}

	public void setPicture(String picture) {
		this.picture = picture;
	}
}
4.建立業務邏輯類 ItemsDAO.java 處理不同的業務邏輯
package dao;

import java.awt.event.ItemListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import util.DBHelper;
import entity.Items;

//商品業務邏輯類
public class ItemsDAO {
	
	//獲取所有的商品資訊
	public ArrayList<Items> getAllItems(){
		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		ArrayList<Items> list = new ArrayList<Items>();
		try {
			conn = DBHelper.getConnection();
			String sql = "select * from items;";
			stmt = conn.prepareStatement(sql);
			rs = stmt.executeQuery();
			while(rs.next()){
				Items item = new Items();
				item.setId(rs.getInt("id"));
				item.setName(rs.getString("name"));
				item.setCity(rs.getString("city"));
				item.setNumber(rs.getInt("number"));
				item.setPrice(rs.getInt("price"));
				item.setPicture(rs.getString("picture"));
				list.add(item);
			}
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			
			try {
				if(rs != null){
					rs.close();
				}
				if(stmt != null){
					stmt.close();
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return list;
	}
	
	//根據商品編號獲取商品資料
	public Items getItemById(int id){
		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			conn = DBHelper.getConnection();
			String sql = "select * from items where id=?;";
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, id);
			rs = stmt.executeQuery();
			if(rs.next()){
				Items item = new Items();
				item.setId(rs.getInt("id"));
				item.setName(rs.getString("name"));
				item.setCity(rs.getString("city"));
				item.setNumber(rs.getInt("number"));
				item.setPrice(rs.getInt("price"));
				item.setPicture(rs.getString("picture"));
				return item;
			}else{
				
				return null;
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}finally{
			try {
				if(rs != null){
					rs.close();
				}
				if(stmt != null){
					stmt.close();
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	
	//獲取最近瀏覽資訊
	public ArrayList<Items> getViewList(String list){
		String[] ids = list.split("#");
		ids = array_unique(ids);//去除重複的id
		ArrayList<Items> itemsList = new ArrayList<Items>();
		if(ids != null && ids.length>0){
			if(ids.length>=5){
				for(int i = 0;i<5;i++){
					Items items = getItemById(Integer.parseInt(ids[i]));
					itemsList.add(items);
				}
				return itemsList;
			}else{
				for(int i= 0;i<ids.length;i++){
					Items items = getItemById(Integer.parseInt(ids[i]));
					itemsList.add(items);
				}
				return itemsList;
			}
		}
		return null;
	}
	
	//去除陣列中重複的記錄  
	public static String[] array_unique(String[] a) {  
	    // array_unique  
	    List<String> list = new LinkedList<String>();  
	    for(int i = a.length-1; i >=0; i--) {  
	        if(!list.contains(a[i])) {  
	            list.add(a[i]);  
	        }
	    }  
	    return (String[])list.toArray(new String[list.size()]);
	}  
}
5. index.jsp 顯示所有商品列表
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%@ page import="dao.ItemsDAO,entity.Items" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>

<style type="text/css">
	   div{
	      float:left;
	      margin: 10px;
	   }
	   div dd{
	      margin:0px;
	      font-size:10pt;
	   }
	   div dd.dd_name
	   {
	      color:blue;
	   }
	   div dd.dd_city
	   {
	      color:#000;
	   }
	</style>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  </head>
  
  <body>
   <h1>商品展示</h1>
   <hr>
   	<center>
   		<table width="770" height="60" cellpadding="0" cellspacing="0" border="0"> 
   			<tr>
   			<td>
   				<!-- 商品迴圈開始 -->
   				<%
   					ItemsDAO itemsDAO = new ItemsDAO();
   					ArrayList<Items> list = itemsDAO.getAllItems();
   					//開始迴圈
   					if(list != null && list.size()>0){
   					for(int i= 0;i<list.size();i++){
   					Items item = list.get(i);
   				 %>
   				 <div>
   				 	<dl>
   				 		<dt>
   				 			<a href="detail.jsp?id=<%=item.getId()%>"><img src="images/<%=item.getPicture()%>" width="120" height="90" border="1"></a>
   				 		</dt>
   				 		<dd class="dd_name"><%=item.getName() %></dd>
   				 		<dd class="dd_city">產地<%=item.getCity() %>  價格¥<%=item.getPrice() %></dd>
   				 	</dl>
   				 </div>
   				<!-- 商品迴圈結束 -->
   				<%
   					}
   				}
   				 %>
   				</td>
   			</tr>
   		</table>
   	
   	</center>
   	
  </body>
</html>
6. detail.jsp 顯示商品詳情和最近瀏覽記錄(最多顯示5條)
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%@ page import="dao.ItemsDAO,entity.Items" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'detail.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
   		<h1>商品詳情列表</h1><hr>
   	<center>
   	<table width="770" height="60" cellpadding="0" cellspacing="0" border="0"> 
   		<tr>
   			<!-- 商品詳情 -->
   			<%
   				ItemsDAO dao = new ItemsDAO();
   				Items item = dao.getItemById(Integer.parseInt(request.getParameter("id")));
   				if(item != null){
   			%>
   			<td width="70%" valign="top">
   			<table>
               <tr>
                 <td rowspan="4"><img src="images/<%=item.getPicture()%>" width="200" height="160"/></td>
               </tr>
               <tr>
                 <td><B><%=item.getName() %></B></td> 
               </tr>
               <tr>
                 <td>產地:<%=item.getCity()%></td>
               </tr>
               <tr>
                 <td>價格:<%=item.getPrice() %>¥</td>
               </tr> 
             </table>
   			</td>
   	<%
   		}
	%>
   	  <% 
              String list ="";
              //從客戶端獲得Cookies集合
              Cookie[] cookies = request.getCookies();
              //遍歷這個Cookies集合
              if(cookies!=null&&cookies.length>0)
              {
	              for(Cookie c:cookies)
	              {
	                  if(c.getName().equals("ListViewCookie"))
	                  {
	                     list = c.getValue();
	                  }
	              }
	          }
              
              list+=request.getParameter("id")+"#";
              //如果瀏覽記錄超過1000條,清零.
              String[] arr = list.split("#");
              if(arr!=null&&arr.length>0)
              {
                  if(arr.length>=1000)
                  {
                  	list = "";
                  	//清空後前900條
                  	for(int i =arr.length-101;i<arr.length;i++){
                  		list+= arr[i];
                  	}
                  }
              }
              Cookie cookie = new Cookie("ListViewCookie",list);
              response.addCookie(cookie);
          
          %>
          <!-- 瀏覽過的商品 -->
          <td width="30%" bgcolor="#EEE" align="center">
             <br>
             <b>您瀏覽過的商品</b><br>
             <!-- 迴圈開始 -->
             <% 
                ArrayList<Items> itemlist = dao.getViewList(list);
                if(itemlist!=null&&itemlist.size()>0 )
                {
                   System.out.println("itemlist.size="+itemlist.size());
                   for(Items i:itemlist)
                   {
                         
             %>
             <div>
             <dl>
               <dt>
                 <a href="details.jsp?id=<%=i.getId()%>"><img src="images/<%=i.getPicture() %>" width="120" height="90" border="1"/></a>
               </dt>
               <dd class="dd_name"><%=i.getName() %></dd> 
               <dd class="dd_city">產地:<%=i.getCity() %>  價格:<%=i.getPrice() %> ¥ </dd> 
             </dl>
             </div>
             <% 
                   }
                }
             %>
             <!-- 迴圈結束 -->
          </td>
   		</tr>
   	</table>
   	</center>	
   
   	 
  </body>
</html>
知識點來自慕課網 點選開啟連結



相關推薦

WebJsp基礎學習

Apache目錄結構 Web 目錄結構 WEB-INF下包括下列檔案 WEB-INF目錄結構 1.      WEB-INF是java的WEB應用的安全目錄。所謂安全目錄就是客戶端無法訪問,只有伺服器端可以訪問的目錄。 2.      Web.xml,專案部署檔案。

pythonnumpy基礎學習

numpy是Python中科學計算的核心庫。其主要資料型別是ndarray,即同種元素的多維陣列。 narray屬性 import numpy as np a=np.array([[1,2,3],[2,3,4],[4,5,6]]) #narr

webjsonp原始碼學習

API jsonp(url, opts, fn) url (String) url to fetch opts (Object), optional param (String) name of the query string parameter t

webjavascript基礎鞏固——引用型別(二)

引用型別 1 引用型別是一種資料結構,從技術上講是一門面向物件的語言,但是不具備傳統的面向物件的語言所支援的類和介面等基本結構。 2 建立object例項有兩種方式:第一種使用new操作符後跟obj

Pythonpython基礎學習筆記

Python資料型別 整數 浮點數 字串 ’ ’ ” “ 布林值 True False 可以用and(與),or(或),not(非)運算 Python把0,空字串,None視為False,其他都是True。 空值 None 不是0,是

webjavascript基礎鞏固(五)——事件&表單

事件流 1 事件冒泡:即事件開始時由具體的元素接受,然後逐級向上傳播到較為不具體的節點,主流瀏覽器將一直冒泡到window物件上。 2 事件捕獲:不太具體的節點更早接收到事件,而最具體的節點最後接收到事件,用意在事件達到預定目標之前捕獲它。 3 DOM事件

MVVM- AngularJS基礎學習

Angular JS AngularJS 基礎入門案例 外觀頁面 <!--

Java.WebJSP —— 語法基礎 —— 選擇在web.xml配置訪問JSP URL

對於JSP檔案的釋出,可以選擇兩種方式: 在瀏覽其中直接訪問該JSP檔案,如: http://localhost:8080/base_webapp/jsp/example.jsp 該URL中JSP的路徑為該檔案在WEB應用中的實際路徑,位於應用入口的根目錄或其子資料夾下

ServicesWebLVSlvs基礎概念

通過 pre inactive cli 端口 sch obi 私有地址 expect 1.簡介 1.1. 作者:張文嵩,就職於阿裏 1.2. LVS是基礎四層路由、四層交換的軟件,他根據請求報文的目標IP和目標PORT將其調度轉發至後端的某主機; 1.3. IPTABLES

總結整理JQuery基礎學習---事件篇

交互 .... over 指針 events 返回值 避免 func 坐標 jQuery鼠標事件之click與dbclick事件 用交互操作中,最簡單直接的操作就是點擊操作。jQuery提供了兩個方法一個是click方法用於監聽用戶單擊操作,另一個方法是dbclick方

shell指令碼 變數基礎學習整理

1.linux系統環境 echo 'echo /etc/profile ' >> /etc/profile echo 'echo /etc/bashrc' >> /etc/bashrc echo 'echo /root/.bashrc ' >> /root/.bas

Javawebsession學習總結 2018-9-28

session學習總結 Session概念: ​ Session是伺服器端技術,利用這個技術,伺服器在執行時可以為每一個使用者的瀏覽器建立一個其獨享的session物件,由於session為使用者瀏覽

java webJSP中form表單中文亂碼的解決嘗試

       在人生中的第一個實際專案中,我遇到了一個很困擾的問題,就是在內管系統中,我做了一個測試頁面,用來測試向對方介面傳遞引數,我使用了jsp的form表單向後端傳遞引數,在本地啟動服務,進行測試都沒有問題,沒有出現中文亂碼的情況,但是提交到測試環境進行驗證時,卻出現了

Java WebJSP總結

JSP 結構 網路伺服器需要一個JSP引擎,也就是一個容器來處理JSP頁面。容器負責截獲對JSP頁面的請求。本教程使用內嵌JSP容器的Apache來支援JSP開發。 JSP容器與Web伺服器協同合作,為JSP的正常執行提供必要的執行環境和其他服務,並且能夠正確識別專屬於JSP網頁的特

WebJavaWeb專案為什麼我們要放棄jsp?為什麼要前後端解耦?為什麼要前後端分離?2.0版,為分散式架構打基礎。

前戲 前後端分離已成為網際網路專案開發的業界標準使用方式,通過nginx+tomcat的方式(也可以中間加一個nodejs)有效的進行解耦, 並且前後端分離會為以後的大型分散式架構、彈性計算架構、微服務架構、多端化服務(多種客戶端,例如:瀏覽器,車載終端,安卓,IOS等等

大前端學習筆記整理LESS基礎

第一次接觸CSS預編譯,然後對比後發現其實less的上手容易度確實比sass高不少,再加上公司專案也是使用的less。所以想想還是根據網上的各種教程,整理出來了一些比較基礎的、而且比較能讓我們這種初學者快速上手的例子。 菜雞一隻,程式碼要是有錯或者表達不清的地方,請各位批評指正! 那麼,現在我們就開始正文部分

Unity3D外掛NGUI基礎學習筆記

1、DrawCall:在Unity中,每次引擎準備資料並通知GPU的過程稱為一次Draw Call。Draw Call值越低,會得到更好的渲染效能。 Draw Call Tool:NGUI--》Open--》Draw Call Tool,可以檢視DrawCall的一些資訊。 影響DrawCall的因素: At

我的javaEE學習JSP簡單學習

一、JSP簡介 1、SUN公司推出的開發動態web資源的技術,屬於JavaEE技術之一。由於原理上是Servlet, 所以JSP/Servlet在一起。 二、HTML、Servlet和JSP 1、HTML:靜態頁面,不能包含java程式碼,只能有HTML有關的標記 2、

創科之龍基礎學習嵌入式開發以及專案實戰開發第二期視訊

【創科之龍】零基礎學習嵌入式開發以及專案實戰開發【學習交流零基礎火熱進行ing】 大家好,我是aiku,上期的專案學習資料在電子發燒友論壇上分享,大家覺得都很好。 在這裡我首先要感謝電子發燒友給我

redisredis基礎命令學習集合

寫在前面 Redis是一個高速的記憶體資料庫,它的應用十分廣泛,可以說是服務端必學必精的東西。然而,學以致用,無用則無為。學了的東西必須反覆的去用,去實踐,方能有真知。這篇文章記錄了我在redis學習過程中的筆記、理解和實踐,僅供參考。 本章介紹redis基礎中的基礎,常用命令的使用和效果。