計數器是儲存特定事件或過程發生次數的裝置,通常與時間週期有關聯。
最常見的類型是經由輸入和輸出線的時序邏輯電路,每次施加到的脈衝使計數容器增加或是減少。
計數器在數位電路中使用非常廣泛,會製成積體電路晶片成為3C用品的一部分。
程式設計領域則是利用各種輔助記憶體作為容器取代積體電路晶片,以CPU運算的各種計數器技術通常則是以文字做為主要的儲存方式,
計數器的原理其實非常簡單,其實不需要太多的深入探討。
本篇的目的主要是介紹網頁中的「GET」用法,利用資料庫來實作計數器。
透過網址列傳遞參數 - GET
有時不經意注意到瀏覽器的網址列顯示冗長的文字,通常穿插著「?」、「&」、「=」符號。這種方式就是「GET」,以明碼方式把使用者下達的參數透過網址後面的連接符號表達。這種方式不但在瀏覽器中會留下記錄,凡經過的網路節點都能夠看見甚至修改當中的值。看以非常不安全,但是好處就是使用上非常方便。其實只要不要傳送或執行會影響個人權益的資料,GET在使用上也不至於會造成損失。首先請在專案的WebContent資料夾中建立「ch02.jsp」,複製下列程式碼。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="org.sqlite.*"%>
<%
request.setCharacterEncoding("UTF-8"); //將輸入編碼設定為UTF-8
response.setCharacterEncoding("UTF-8"); //將輸出編碼設定為UTF-8
SQLiteConfig cfg = new SQLiteConfig();
SQLiteDataSource ds = new SQLiteDataSource(cfg);
ds.setUrl("jdbc:sqlite:E:\\joop\\my.db"); //請選擇資料庫連線位置
String sql;//重複使用的SQL查詢變數
Statement stat;//資料庫發送指令變數
stat = ds.getConnection().createStatement();
try{
stat.executeUpdate("INSERT INTO counter(id, total)VALUES(null, 1)");
}catch(Exception e){
System.out.println(e);
stat.executeUpdate("UPDATE counter SET total=total+1 WHERE id=null");
}
sql="select * from counter";
ResultSet rs = stat.executeQuery(sql);
%>
<!--DOCTYPE html-->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<%while(rs.next()){%>
名稱: <%=rs.getString("id")%>
次數: <%=rs.getString("total")%>
<hr>
<%}
rs.close();
stat.close(); %>
以上程式碼建立完成後請啟動偵錯伺服器,在網址列輸入以下網址。
http://127.0.0.1:8080/josp/counter.jsp?id=102123456
網頁程式會依據「?」後面的參數名稱,以及「=」後面的參數讀取並請程式做相應的處理。程式的處理動作就是將做適當的判斷,將資料寫入資料庫中正確的欄位。
在網頁中的實際應用
當瞭解計數器的運作方式之後,接下來試著應用在首頁。請在專案的WebContent資料夾中打開「index.jsp」,複製下列程式碼。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="org.sqlite.*"%>
<%
request.setCharacterEncoding("UTF-8");//將輸入編碼設定為UTF-8
response.setCharacterEncoding("UTF-8");//將輸出編碼設定為UTF-8
SQLiteConfig cfg = new SQLiteConfig();
SQLiteDataSource ds = new SQLiteDataSource(cfg);
ds.setUrl("jdbc:sqlite:E:\\joop\\my.db");//資料庫連結路徑
String sql;
Statement stat;
stat = ds.getConnection().createStatement();
//隨機建立動態資料庫
try {
//sql = "CREATE TABLE counter (id string, total integer, PRIMARY KEY(id));";
//stat.executeUpdate(sql);
sql = "INSERT INTO counter(id, total)VALUES('0', 0);";
stat.executeUpdate(sql);
} catch (Exception e) {}
//計數器動作
sql = "DELETE FROM counter WHERE id !='0'";
stat.executeUpdate(sql);
sql = "UPDATE counter SET total=total+1 WHERE id ='0'";
stat.executeUpdate(sql);
sql = "select * from counter WHERE id ='0'";
ResultSet rs = stat.executeQuery(sql);
%>
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Insert title here</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.2/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.2/css/bootstrap-responsive.min.css" rel="stylesheet">
<script src="http://code.jquery.com/jquery-1.12.4.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
</head>
<body>
<div class="navbar navbar-static-top">
<div class="navbar-inner">
<div class="container">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<a class="brand" href="index.jsp">我的學習歷程</a>
<div class="nav-collapse collapse">
<ul class="nav">
<li class="active"><a href="#">首頁</a></li>
<li class="dropdown"><a href="#" class="dropdown-toggle"
data-toggle="dropdown">課程選單 <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="temp.jsp">裝飾器</a></li>
<li><a href="ch02.jsp">計數器</a></li>
<li class="divider"></li>
<li class="nav-header">期中</li>
<li><a href="ch03.jsp">BBS</a></li>
<li><a href="ch04.jsp">討論區</a></li>
<li><a href="#">大樂透開獎</a></li>
<li class="divider"></li>
<li class="nav-header">期末</li>
<li><a href="#">問卷/投票</a></li>
<li><a href="#">購物車</a></li>
</ul></li>
<li><a href="#">筆記1</a></li>
<li><a href="#">筆記2</a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="container">
<div class="page-header">
<h1>
<%while (rs.next()) {%>
次數:<%=rs.getString("total")%>
<%}
rs.close();
stat.close();
%>
</h1>
</div>
<p class="lead">JSP可用於網頁應用程式開發的前端,包括HTML、CSS及JavaScript的框架,提供字體排印、表單、按鈕、選單和
Javascript動態擴充。與之對應的「後端」是在伺服器上面執行的程式碼框架,JSP也能以簡單的語法提供絕大部份的應用所需。</p>
<p>此 <a href="#">網站</a> 為學習JSP過程中的課程範例的學習歷程,</p>
<div class="page-footer">
<p class="muted credit">
內容是由 <a href="#">中華科技大學</a> 資管系 <a href="#">10X14D0XX同學</a> 建立
</p>
</div>
</div>
</body>
</html>
大部分的學校課程都會直接傳授網頁程式設計等課程,卻忽略這重要的的 HTTP 協定。
程式設計雖然不用包山包海,但是基本常識在資訊領域中必須有所認識。
沒有留言:
張貼留言