OSS報表系統 實訓筆記
實訓公司:中科天地 (王海格,老師超好)
Edited by Hen Egg ,Michelangelo
2005-2-21
8:00
JasperReport 開支
面向OO 應用服務器
Java 開源數據庫
J2EE 需求分析
成績:
課堂表現
項目
項目:
l Java平台
(1) (編程語言)開發環境(編譯器)
(2) 部署環境(應用服務器)(JDK提供軟件運行服務器及基本運行條件,在此基礎上的開發需要配置) 目的是重用 (相關工具類)
(3) 運行環境(操作系統)
--JVM虛擬機是操作系統,即運行環境
--Java包 文件性
--垃圾收集 內存管理
--虛擬cpu (優勢)
--線程
(1)+(2)+(3) 統一環境 簡單開發
l Java語言
1. OO(最重要的特徵)——很大的系統
2. 可移植性JVM (並不重要)
3. 分佈式 JVM+AppServer ——跨平台的系統
充分利用網絡資源 跨地域跨國界
4. 安全性
Unix:安全性強類型
JVM內置強安全性 >Unix
關鍵業務
1. 人命
醫療 檢查公安 重型工業 航空
2. 錢
銀行
小結:
JVM是操作系統
Java是面向對象,分佈式,安全的語言
PS:以上紅字粗體部分為java關鍵技術
l Java虛擬機
1.垃圾收集
2.分佈式 支持各種協議
3.多線程 線程管理
4.安全性
概念
模擬了一台計算機
功能
1.垃圾回收:
(在內存中)new的對象被裝載到對像堆中
A = new Air;
new 出一個對像
調用構造函數,分配在對像堆中
返回一個引用
引用計數器++
當計數器減為0,該變量變成垃圾,從名單裡除去。
垃圾收集作用:內存洩漏,空指針
垃圾收集機制:
後台精靈線程:當CPU出現閒置,調用該線程(優先級低) 要求CPU很快 有閒置的時候(用Java 先CPU再內存再次網卡)
2.提供運行時環境
操作系統的功能,負責調入代碼,監督代碼運行,幫助程序做輸入輸出,給程序提供一系列的支持
提供 CPU 寄存器 網絡讀寫 文件系統 安全性
Class Loader 加載
Byte Code Verifier文件格式 語法 數組越界
校驗4遍
Interpreter: 中間代碼
JIT 即時編譯 (快)(編譯成本地代碼)
安裝jdk
配置環境變量
JAVA_HOME c:\j2sdk
Path ;%JAVA_HOME%\bin
CLASSPATH .;%JAVA_HOME%\lib
(ps:dos窗口不能自動刷新,改變環境變量後記得重新開)
14:00
類:
自定義
抽像
包:
package
把功能相近的類組合在一起
包是相對路徑,相當於windows裡的文件夾
import一個包 就引入了一個命名空間
import不等於include
沒寫包的話,系統默認一個包
Java代碼三部分
1) package com.project.src
2) import java.io.*;
3) 類
一個文件裡可以有多個類,但是有且只有一個public類
eg1
1. static void main(String []args)
Main method is not public
2. public void main(String []args)
Exception in thread "main" java.lang.NoSuchMethodError: main
main是整個程序的入口,不能用new出來 由於是static方法所以在載入內存時便直接執行 以此作為其他程序的入口 但main不是關鍵字
3. public static main(String []args)
TestHelloWorld.java:4: invalid method declaration; return type required
public static main(String[] args)
java規定必須有範圍類型,沒有返回值必須定義為void。但是構造函數不允許有返回類型。
4. public static void main(String []args) == static public void main(String []args)
訪問控制符和修飾符位置任意。但習慣把訪問控制符放前面
5.但是返回類型 不能放在上面兩者前面
TestHelloWorld.java:4: <identifier> expected
void static public main(String[] args)
^
TestHelloWorld.java:8: '(' expected //返回值必須貼緊方法名
}
^
2 errors
main不是關鍵字,但是自己不要用它。
6. String[] args
從arg[0]開始
註釋:
調程序用
//
/* */
javadoc註釋
/**
*/
用javadoc變成文檔
javadoc HelloWorld.java –d doc
Java關鍵字&標識符&保留字
標識符 開頭:字母(_, $)
編碼規範:
1) 有意義的單詞組成,第一個單詞第一個字母小寫,其他單詞第一個字母大寫
2) 變量名和方法名同等處理。
3) 常量由有意義的單詞組成,所有單詞全大寫,單詞之間用下劃線分開。
4) 類名第一個字母大寫
Java數據類型
1. 基本數據類型(不是對像)
8種:
int, long, short, byte, float, double, char, bool.
2. 引用類型
對像只能通過引用訪問
實際上是安全的指針
數組是引用類型(因為他在C語言裡是指針類型)
默認:
Char ‘\u0000’
bool false
引用 null
數組 null
表達式和流程控制
不要用++ --,容易引起誤讀 除了在循環裡面
=與==: ==只能用於基本類型,不要用於引用類型。equals
短路運算符: if (lasting!=null)&&,||
把概率最高的判斷放在前面,節省程序執行的時間
類型轉換
高位轉低位,必須進行強制類型轉化 ,short與char的轉換總要
傳參和傳值
基本類型傳值
引用類型傳引用
傳的是變量的副本
控制流程,循環
最好不要用switch (破壞封裝,消耗性能,破壞流程)
分支盡量用if else
循環盡量用for
while(true)在服務器中,做死循環用
別用do-while
練習1
強制類型轉換
練習2
傳參
2005-2-22
8:00
l Java OO
最早的面向對像Smalltalk, 後來的C++, Java, Phyon, .NET
Smalltalk純的 Java不純(基本類型等)
Java是對面向對象的一個實現
對像 -> 數據 <- 操作
對像之間的關係 –> 消息
OO: 按符合人的思維習慣的邏輯來分析設計,形成了一套模式,即面向對像體系。
注意:
1. 不要去繼承有代碼的類。有代碼的類請用對象的組合.
2. 繼承抽像基類或接口(n個)。接口設計完,不能減少和修改,只能增加.
3. 多重繼承本身沒錯,必不可少,但要限制多重或單繼承,破壞封裝性.
多態:
技術實現:
1. 編譯時:SRC 檢查形式類型(聲明)
2. 運行時:JVM 檢查實際類型
重載:
(編譯時)
處理相同的方法名,不同的參數列表
在編譯器裡用方法簽名區別。(method signature,由方法名+參數列表組成)
不要用運算符重載
14:00
類(實用類):
1. 類頭
只有public 和 默認的,沒有私有類
2. 屬性
static 只保留一份拷貝。與類代碼保存在一起
靜態屬性的構造方法: static {}塊。
non-static
3. 方法
4. 構造方法(不是類的基本結構)
5. static塊
l 類的定義
[權限][修飾] class 類名 [extends 父類名][implements 接口列表]
{
類體;
}
權限: 有 public —— 公有類
無 public —— 同包類
修飾: abstract 抽像類,只能被繼承(如果一個類裡面有一個抽像方法,則這個類必須是抽像類。反之,抽像類不一定包含抽像方法)不能實例化
final 終極類,完美類,不能被繼承。只能實例化
ps:
1:一般靜態變量被定義成常量
2:用靜態方法不能訪問實例變量,static
3:native 在java中調用本地c代碼
4:構著方法:選擇native(高級)
5:接口作為引用類型來使用,任何實現該接口的實例都可以存在該接口類型的變量中.
數據成員:
[權限][修飾] 類型 變量名[= 初值];
修飾: static 有 —— 類變量(類名點取)
static 無 —— 實例變量 (對像名點取)
final 用於修飾常量
static final int N=5; (90%以上用到static,就加final把它變成常量。光static破壞封裝性)
方法成員:
[權限][修飾] 返回值類型 方法名(行參列表) (傳值不傳參)
{
方法體;
}
修飾: static (靜態方法不能訪問實例對像)
final (不允許重載) (用不到)
abstract (該類必須聲明為抽像類)
native 本地方法。可以調用本地代碼,比如調用C代碼。
成員權限
public > protected > (default) > private
default 同包類
protected 同包+子類
接口裡的方法默認為: public abstract
構造方法:(僅能初始化非靜態屬性,靜態方法不能操作非靜態屬性,反之可以)
方法名=類名
一般不是public訪問權限
不能有任何修飾
無返回值類型
如果不提供構造方法,則系統提供一個無參的構造方法。但是存在任何自己寫的構造方法,缺省的構造方法立即失效。
類繼承的時候,不繼承構造方法。
初始化父類super()。 如果父類是抽像基類,就不用加了。
super()
this()
接口定義
[權限] interface 接口名 [extends 接口列表]
{
接口體;
}
可以繼承多個接口。稱為接口的拼裝
接口一般聲明為public
接口作為引用類型來使用。通過這些變量,可以訪問所有實現該接口的方法。
練習:
1.mod02/exercise3
類的公有方法被稱為類的接口。
寫一個Account類 放在包banking中
並用TestBanking測試
2.在banking中添加類Customer.
3.修改TestBanking。用Customer操作Account。
2005-2-23
8:00
1. 需求分析(top n)
概念
業務
業務流程
2. 用例圖(修正)
例:銀行的賬戶Account和客戶Customer關係
1) 客戶有一個或多個賬戶
2) 賬戶與一個客戶關聯(例外:聯名賬戶)
3) 客戶私有、控制賬戶
需求分析
總體設計
詳細設計
例:銀行和客戶、賬號的關係
銀行有若干個客戶
客戶可以選擇多家銀行(跨邊界)
系統中只能有一家銀行(系統邊界)
銀行應該對客戶信息保全
銀行擁有裁決權
銀行類的內部創建帳戶(銀行類完全創建控制帳戶)
要求:
創建客戶
用戶提交:姓、名、最初額度、身份證號碼、六位密碼
創建帳戶
提交:
身份證號碼、初始餘額
業務:
身份證號碼
帳戶號碼
密碼
業務選擇(參數):存取款 查餘額
開會標準
概要設計
1. 需求會(10∼15分鐘)
分頭寫草圖
2. 開會合併草圖
修改草圖
3. 提交修改草圖
4. 合併修改草圖
5. 畫類圖:每個類兩個人
6. 組裝至一台機器,編譯運行
10:43——17:30
banking項目
2005-2-24
8:00
項目總評
細節問題:
1.只能有一個Bank,設計方法:
Sington設計模式:
構造方法私有,則不能從外界創建他
利用該類的靜態常量來保存。
static final Bank bookIntance = new Bank();
Bank類被加載到內存裡
new出一個Bank實例,並存在靜態區
private Bank()
{
customers = new Customer[MAX];
customerNumber=0;
}
private static final Bank bankInstance = new Bank();
public static Bank getBankInstance() {
return bankInstance;
}
或:
private static final Bank bankInstance = null;
public static Bank getBankInstance() {
if(bankInstance = null)
bankInstance=new Bank();
return bankInstance;
}
在Test.java中
Bank aBank= Bank.getBankInstance();
3. 數組
引用數組是指針的指針,所以要判空
Vector, List, arrayList (只能存一種類型的對象),也要判空
4. 密碼管理方法不能用getPassword()。要用Verify()。
上課內容:
異常
java中的異常
程序中60%代碼用於處理異常
任何異常都被包裝成異常對像
有異常時候,就拋出異常對象,給JVM。JVM去查調用棧
產生異常的代碼不處理異常
好處
1) 用對像處理異常
2) 利用虛擬機作異常對象的傳遞
3) 正常代碼和處理異常代碼完全分開
try
{
unsafe;
} catch (異常類 e)
{
異常處理;
}
方法聲明為throws,該方法實用時,必須放在try,catch結構中
public void f(int score) throws MyException
{
if(score<0||score>100)
throw new MyExceptino(“”);
}
繼承類的時候,不能拋出超出父類的異常。
tips:
接口是用來統領類,分類類的
類是用來實現接口的,實例化接口的一個工具
I/O 流
輸入流,輸出流 是控制同一個流
字符型,字節型
類庫裡凡是有Stream都是字節流,有Reader就是字符流
InputStreamReader把字節流轉換為字符流
//把System.in轉化為一個帶緩衝的字符流
BufferedReader in=new BufferedReader(new InputStreamReader(System.in))
in.readline()
網絡
添加
Client端,Server端,協議解釋器
Socket連接
協議自己定
協議的解析器
new ServerSocket
accept()
new Socket
實例:
Server端
1.new一個ServerSocket
try{
s=new ServerSocket(5432);
}catch (IOException e){}
2.建一個死循環
while(true)
{
try{
Socket s1=s.accept();
}catch(IOException e){}
}
3.用產生的普通Socket通訊
OutputStream s1out=s1.getOutputStream();
DataOutputStream dos=new DataOutputStream(s1out);
dos.writeUTF(input);
dos.close();
s1.close();
Client端
1. 建一個普通Socket
Socket s1= new Socket(“127.0.0.1”, 5432)
2.用Socket通訊
InputStream is = s1.getInputStream();
DataInputStream dis = new DataInputStream(is);
System.out.println(dis.readUTF());
dis.close();
s1.close();
作業:
1. 用例和流程
2. 設計類庫,Server結構
2005-2-25
8:00
多線程
業務需求 並發訪問
技術需求 多進程、多線程
I/O流阻塞當前進程
技術
模型一
1. 創建線程的線程
2. 線程中跑的代碼是哪一個對象的代碼
定義一個實現Runnable接口的類,實現他的run()方法,然後將這個類的實例作為Thread構造方法的參數。創建Thread類的實例。
在服務器裡
new Thread(Object ); //Object工具類,存所有參數。(包含業務代碼)
.start.
構造這個類
class BusinessClass implements Runnable
{
public void run()
{
代碼; //調用其他對像完成業務和交互。
}
}
見exercise/mod15/exercise1
內部類
當
外->內代碼(功能)
內->外部非公有
需要實用內部類
小結:
1. new Thread( 類 )
2. 定義這個類, implements Runnable
C/S Bank項目
11:00 ~ 2005-2-26 17:40
2005-3-7
8:00
複習:
面向對像:清晰,封裝,抽像(針對接口編程),復用(io類,集合類)
C/S -> B/S
區別:
C/S是基於操作系統的(JVM)和基本類庫(JDK)的開發模式。
B/S 是基於已有“容器”的開發模式。
B/S優點:屏蔽底層的東西
1. 給商業系統的開發帶來方便,重用基礎代碼和服務(事務安全性)
2. 可以使用經證明有效(率)的軟件架構(j2ee核心模式 mvc)
3. 商業的技術支持(第三方)
C/S優點:
1. 完全控制Client, Server端的結構,使用自定義的通訊/業務協議
2. 可以精確定義底層服務,減少冗余和錯誤
3. 所有的開發代碼都是透明的,不存在黑箱
用途
B/S 用於比較大型的,面向最終用戶的商業系統(財務、人事、物流、電子商務、工作流)
C/S 用於各種軟件系統(用於二次開發),或軟件產品;特殊專用的商業系統(銀行,國防部)
C/S 是B/S的基礎。前者用的技術後者都能用到,反之不成立。
B/S幾種流行的架構
都是一種開發模式,實現技術變化中
1. J2EE (開發模式 不是開發技術)
2. .NET
3. PHP
4. CGI(perl, C)
J2EE開發模式結構:
系統功能
客戶端
Web層
控制層
業務層
數據操作層
容器
瀏覽器
Web服務器,JSP/Servlet容器
JSP/Servlet容器,EJB容器
EJB容器,Servlet容器
EJB容器, Servlet容器
技術
HTML, CSS, XML, JavaScript, Applet
HTTP, JSP, Servlet, HTML
JSP/Servlet,EJB,JavaBean
EJB,JavaBean,Servlet
EJB(Entity),DAO, JDO, R/O Mapping
輔助技術
美工,Flash
資源文件(國際化),MVC
資源文件(國際化),MVC。
針對容器本身的配置文件,JNDI
JMS,JTA
Tips:
JNDI:Java的目錄服務(Java Naming and Directory Interface)
JMS:Java消息服務
JTA:Java事務服務
EJB強侵入型容器,不推薦使用。
EJB基於的兩個技術:RMI和序列化
重要級:
要學的,重要的:HTML, XML格式,HTTP, JSP,Servlet,JavaBean
要熟的:HTML,JavaScript, DAO,MVC (這兩個是兩種架構)
看一下:EJB,JNDI,JMS,JTA
10:00
HTML/JSP
HTML表單
JSP 計算->服務器
瘦客戶端
Client Server端
瀏覽器Brower ----------------à JSP
| Compile
Servlet --------------------------à後台調用
| Run
HTML
過程
1) 發請求HTTP協議
2) 生成兩個對像request, response
3) 編譯servlet
4) 顯示部分硬編碼
5) 返回給客戶
HTML:
XML
<table>
<Form> 表單
1) 收集用戶輸入
2) 通過HTTP協議,提交參數到制定的URL(簡化了從客戶端傳到服務器端的過程,但是服務器端傳回來的功能就大大減弱了)
JSP表現:
返回:
1) 處理結果(Response)
2) HTML標籤(用來做界面)
3) 動作:結果 -> HTML格式
4) 返回給客戶
TIPS:
服務器端畫界面
畫的界面通過response對像返回
eg.
//03.html
<form action=”03.jsp”>
<Input type=”text” name=”myname”><br> //文本框控件
<select name=”interest”> //下拉菜單控件
<option value=”football”>football</option>
</select>
<Input type=”submit” value=”提交”> //提交按鈕
<Input type=”reset” value=”重置”> //重置按鈕,自動給所有值賦為默認值,避免空指針錯誤
</form>
//03.jsp
<%
String name= request.getParameter(“myname”);
String interest= request.getParameter(“interest”);
out.println(“Your name is “+ name);
out.println(“<br>Your interest is: “ + inerest); //println的回車對源文件回車,對HTML的顯示不起作用,所以要加回車標籤<br>
%>
14:00
JSP語法
1. 腳本元素(代碼)
1) 註釋 <%-- --%> (只在本代碼中存在)
2) 表達式<%= %>
3) 聲明<%! %> (只在本頁起作用)
4) 代碼段<% %>
2. 頁面指令<%@name 屬性列表 %>
1) page指令 <%@page Attribute_List %>
<%@page language=”scriptingLanguage” import=”” contentType=”text/html;charset=GBK” %>
2) jsp:include指令 <jsp:include page=”URLSpec” />
3) jsp:forward指令 <jsp:forward page=”URLSpec” /> (只能轉到本機上某一其他頁面)
4) jsp:param指令 不能單獨使用 <jsp:param name=”name” value=”value” />
3. 內置對像
使用out對像輸出數據
request對像和用戶輸入信息
response對像向客戶端發送信息
使用session對像在不同頁面共享數據(使用Cookies或重寫URL)
啟動Tomcat
1. Startup
2. bin下service install 控制面板-》服務-》Apache 啟動
配置
在conf文件夾裡把server.xml裡的connector裡的端口號改成別的
tome-users.xml 可以改密碼,加用戶
練習JSP
webapps\test
webapps\test\WEB-INF 是放應用程序的配置文件和類、庫文件
webapps\test\WEB-INF\classes\
webapps\test\WEB-INF\lib\
WEB-INF\web.xml
在Tomcat Manager裡面部署Deploy
練習:
提交: 1.jsp
<html>
<body>
<form action="echo.jsp" method="post">
<p>內容
<p><textarea name="content" rows="20" col="40"></textarea>
<p><input type="submit" value="submit">
</form>
</body>
</html>
返回: echo.jsp
<%@page contentType="text/html;charset=GBK" %>
<%
request.setCharacterEncoding("GBK");
String content=request.getParameter("content");
content=content.replaceAll("\n","<br>");
out.println(content);
%>
2005-3-8
8:00
複習:
JSP語法
HTML表單
TIPS
HTTP協議有兩個方法:
POST: 放在BODY內
GET: 放在URL頭部。 URL?attribute=value
<form method=”POST”>
凡是表單提交數據,都用POST
練習1:
密碼登陸框
tips:
判斷是否空字符串要用.equals(“”)
文件名.jsp小寫
練習2:
簡單驗證在客戶端進行,使用Jscript.
JS標籤
Script在客戶端運行。簡單的驗證挪到客戶端進行
<Script Language=”JavaScript”>
function mycheck() {
if(document.myform.myname.value==””){ //document是瀏覽器內置對像
alert(“請填寫姓名!”);
return;
}
if((document.myform.password1.value!=document.myform.password2.value)||){
alert
return;
}
document.myform.submit();
}
</Script>
提交表單
<form name=”myform” action=”simple.jsp” method=”post”>
<input type=”button” value=”提交” onclick=”mycheck()”>
session內置對像保存用戶狀態
//session-1.jsp
<%
//初始化
if(session.getAttribute(“flag”) == null) {
session.setAttribute(“flag”,”ok”);
session.setAttribute(“shop”,””);
session.setAttribute(“price”,””);
}
session.setAttribute(“shop”,session.getAttribute(“shop”)+”主板”);
session.setAttribute(“price”,session.getAttribute(“price”)+”100”);
out.println(session.getAttribute(“shop”)+”<br>”);
out.println(session.getAttribute(“price”)+”<br>”);
%>
窗口關掉,只要沒離開這個網站,狀態依然保留。
JavaBean
輕量級的組件
組件技術
JavaBean概述
可以被Applet、Servlet、JSP等Java程序調用
特點
1) 獨立性
2) 可重用性
3) 在可視化開發工具中使用
4) 保存狀態
JavaBean屬性
1) Simple屬性
get/set 都有:讀寫屬性,有get:只讀屬性
2) Indexed屬性
可加索引的屬性
3) Bound屬性
4) Constrained屬性
bean放在WEB-INF/classess下
在JSP中調用JavaBean
<jsp:useBean id=”bean名字” scope=”page|request|session|application” class=”bean對應的類名”/>
//id是應用變量 scope是bean作用的範圍。page該頁,request該請求,session該會話,application服務器不關機,則永遠有效
<jsp:setProperty name=”checking” property=”balance” value=”0.0” />
<jsp:getProperty …>
eg.//bean.jsp
<jsp:useBean id=”first” scope=”page” class=”bean.sampleBean” />
<body>
調用jsp:setProperty之前的值:<jsp:getProperty name=”first” property=”str” />
<p>
<jsp:setProperty name=”first” property=”str” value=”change value” />
調用jsp:setProperty之後的值:<jsp:getProperty name=”first” property=”str” />
</body>
</html>
//sampleBean.java
package bean;
public class sampleBean
{
private String str=”first value”;
public String getStr() {
return str;
}
public void setStr(String value) {
str=value;
}
}
tips
寫JavaBean的注意事項
必須寫set/get方法
必須package.不能放在默認包裡
14:00
Tips:
JavaBean的scope。 session最長用。同一個客戶的多個請求用同一個Bean
get/set方法使用條件:無參的。(標籤使用法)
Bean作為一個普通的java類。可以直接用他的方法。
練習3:
1. HTML頁面。下拉表單
2. JSP。submit/item。
3. JavaBean。用戶購物清單
2005-3-9
8:00
JDBC
JDBC是連接數據庫的一種協議。在這個系統架構裡相當於HTTP。
功能:J2EE連接到外部資源
現在可以用XML訪問數據庫
協議:規定了統一的數據庫訪問接口,由各個廠商實現。
類:
1. DriverManager
getConnection
接口:
2. Connection(數據庫廠商寫的)
3. Statement (執行SQL語句)
使用注意:
不要讓JDBC破壞程序原有結構。R/O Mapping
把數據庫的作用降低到只有數據持久化。
語法:
JDBC API
1. DriverManager 管理JDBC(不是JDBC協議裡的)將driver加載進內存
2. Connection由 drivermanager 返回一實例
3. Statement向數據庫發送SQL查詢和取得一組結果的工具,也由數據庫廠商提供
4. ResultSet定義訪問執行Statement產生的數據表方法
5. PreparedStatement編譯好的SQL語句
eg.連接mysql數據庫
import java.sql.*;
public class JdbcMySQL{
public static void main(String args[]) {
String serverName=”localhost”;
try{
Class.forName(“com.mysql.jdbc.Driver”); //先把路徑配到CLASSPATH裡
String url=”jdbc:mysql://”+serverName”+”:3306/test”; //每個數據庫不一樣的
Connection conn=DriverManager.getConnection(url,”root", "root");
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery(“select * from student”);
while(re.next()){
System.out.print("StudentNo:"+rs.getInt(1));
System.out.print(“\tStudmentName:”+rs.getString(2));
}
}catch(Exception e) {}
連接字符串每個數據庫都不一樣。
練習:
投票系統
//VoteConn.java
package vote;
import java.sql.*;
public class VoteConn {
String sDBDriver=”sun.jdbc.odbc.JdbcOdbcDriver”;
String sConnStr=”jdbc:odbc:vote”;
Connection connect=null;
ResultSet rs=null;
public VoteConn(){
try{
Class.forName(sDBDriver);
}
catch(java.lang.Exception e){}
}
public ResultSet executeQuery(String sql) {
try {
connect=DriverManager.getConnection(sConnStr);
Statement stmt=connect.
public int executeUpdate(String sql) {
int result=0;
try{
connect=Driver
//index.jsp
<%@page contentType="text/html;charset=GBK" %>
<%@page import="java.sql.*" %>
<jsp:useBean id="connDbBean" scope="page" class="vote.VoteConn" />
<%
ReasultSet rs=connDbBean.executeQuery("select * from vote");
%>
<html>
<body>
<center>
<h2><font color=#0000ff>請你投票</font></h2>
<table border bgcolor=#00ffff>
<form action="vote.jsp" method="post">
<% while(rs.next()) {%>
<TR><TD><input type="radio" name="type"
value =<%=rs.getString("id")%>><%=rs.getString("note")%></TD></TR>
<%}
rs.close();
%>
<TR align="center"><TD><Input type="submit" value="投票"></TD></TR>
</form>
<TR><TD><A href="details.jsp">查看投票</TD></TR>
<table>
</center>
</body>
</html>
//style.css
//vote.jsp
<%@page contentType="text/html;charset=GBK" %>
<%@page import="java.sql.*" %>
<jsp:useBean id="connDbBean" scope="page" class="vote.VoteConn" />
<%
String rb=request.getParameter("type");
if(rb!=null&& rb!=""){
String sql="Update vote Set c_num=c_num+1 where id="+rb;
connDbBean.executeUpdate(sql);
}
%>
<jsp:forward page="detail.jsp" />
//admin.jsp
<%
connDbBeanexecute
<%=tempRs.getString(“note”)%>
<div align=”center”><a href=”delvote.jsp?id=<%=tempRs.getInt(“id”)%>”>刪除</a></div>
//delvote.jsp
<%
String d_id=request.getParameter(“id”);
if(d_id!=null
connDbBean.execute
//addvote.jsp
<jsp:useBean scope=”page” class>
String nn=request.getParameter(“note”);
if(nn!=null
connDbBean.executeQuery(“select max(id) As maxid from vote”);
tmpRs.next();
int max_id=tmpRs.get Int(“maxid”)+1;
tmpRs.close();
String sql=”insert into vote value(“+max_id+”,’”;
sql+=nn+”’,0”;
System.out.println(sql);
conDbBean.executeUpdate(sql);
}
%>
<jsp:forward page=”admin.jsp”>
2005-3-10
8:00
Servlet
常用API:http.servlet
特點
1. 結構很嚴格
2. 代碼框架已經寫好
3. 窗口給Sevlet運行提供context
4. 僅用於處理http請求
initial方法:第一次調到內存時,訪問一次。
destroy方法:被調出內存時,訪問一次。
service方法:主方法,參數(request,response)
doget(),dopost():我們要寫的方法。
eg1.
//TestServlet 放在classes下面
import javax.servlet.*;
import javax.servlet.http.*;
public class TestServlet extends HttpServlet
{
public void doGet(HttpServlet Request req, HttpServletResponse res) throws ServletException{
res.setContentType(“text/html;charset=GBK”);
req.setChanracterEncoding(“GBK”);
PrintWriter cut=res.getWriter();
out.println();
out.close();
}
}
//.jsp
<form action=”/myServlet/TestServ”>
路徑要在配置文件裡配://web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<!-- JSPC servlet mappings start --> //配置servlet
<web-app>
<display-name>first</display-name>
<servlet>
<servlet-name>aaaa</servlet-name>
<servlet-class>TestServlet</servlet-class>
//起始地址為WEB-INFO/classes,包名.類名
</servlet>
<servlet-mapping>
<servlet-name>aaaa</servlet-name>
<url-pattern>/myServlet/TestServ</url-pattern>
// <url-pattern>/myServlet/*.do</url-pattern> //可以把很多種請求映射到一個Servlet
// <url-pattern>/myServlet/*.*</url-pattern> //一組一組的mapping
<servlet-mapping>
<!-- JSPC servlet mappings end -->
</web-app>
TIPS:
寫Servlet不是主要的。而配置文件是主要的。
以配置文件(程序結構和框架)為中心,以JSP/Servlet, HTML, JavaBean, EJB為輔
eg2.從servlet轉到jsp
//jsp轉servlet forward
request.setAttribute(“applet”,”servlet”); //相當於jsp裡的param標籤
getSevletConfig().getServletContext().getRequestDispatcher(“/hello.jsp”).forward(request.response);
在servlet裡面使用JavaBean。new一個。
//servlet和JavaBean都是內置多線程。最好不用靜態屬性。
TIPS:
Servlet配置
1. servlet-api.jar
javac –classpath %classpath%;…..
2. web.xml
14:00
MVC
一個Controller帶了一組Servlet,一個config
Controller分三部分
1. 控制器
2. 幹活的
3. 配置文件
Struts是一個MVC的框架
好處
1. 成熟
2. 用的多
特點:
1. 物理:Struts是MVC基於Java的一個框架(一個類庫Java和標籤庫JSP)
2. 功能:輔助實現MVC
struts框架
控制程序流程的類
實現和執行程序業務邏輯的類
自定義的標記使創建和驗證HTML表單更加容易
*.tld 標籤庫文件
*.war web application 包
類庫的安裝:只需解壓縮到一個路徑,然後配置環境變量
struts難點
1. config.xml
2. 標籤庫
3. 體現MVC
Struts的組件
ActionServlet 控制器
ActionClass包含事務邏輯
ActionForm顯示模塊數據
ActionMapping 幫助控制器將請求映射到操作
ActionForward 用來指示操作轉移的 對像
ActionError 用來存儲和回收錯誤
Struts標記庫 可以減輕開發顯示層次的工作
struts配置文件:struts-config.xml
自己寫的部分Action裡的perform()
小結:
在MVC中,
Struts主要給了C的框架。M自己寫。V用標籤庫自己寫。
提供兩個功能。一個C。一個C背後的系統設計。
Controller寫好了
Action的框架寫好了,只要填perform()
扭轉。反向扭轉用ActionForward。
提供一個對用戶輸入數據的緩存部分ActionForm。
幫助流程設計。一個struts-config.xml。另一個是把流程抽像到對像放在內存裡面。
標籤庫中會用到幾個。
2005-3-11
8:00
Model部分設計:
Façade
值對像
eg. struts-blank
index.jsp做客戶代理
<action
path="/Welcome"
forward="/pages/Welcome.jsp"/> //調用了一個默認的action
1. 寫aciton
2. 在config.xml裡面的actionMapping改成我們的類
3. 寫個.jsp
2005-3-12
8:00
使用struts-console查錯
使用ant自動建構
兩部分:property target
14:00
../ 上一級目錄
./ 當前目錄
/ 當前盤符的根目錄
轉向:1 頁面中最好都使用xxxx.do來把控制權交給action
2 真正的轉向由control來做 path=”/xxx/xxx.jsp” 第一個xxx為web-inf下的一目錄名
JSP的scope對應servlet裡的:(scope指生命週期和可見性)
page 局部變量
request request
session session
application servletContext
值對像(用於由action中傳出數據)
MODEL中:facade
練習
struts+bean+jdbc+ant
2005-3-14
8:00
小結
1.request.setAttribute(“name”, myBean)
2.值對像 注意scope
3.MODEL中用facade
final項目
報表:
1. struts
2. JasperReport API
3. IReport
14:00
final項目OSS報表
1. 需求:
a) 管理報表定義和實例
b) 用戶查看和輸出
2. 工具
a) struts,ant,IDE,mySQL,JasperReport,JSP/Servlet,JavaBean,iReport,tomcat
3. 流程
合作
1. 共享資源專人負責
a) struts
b) ant, mySQL, tomcat
c) JasperReport(iReport)
2. 需求分析:
a) 會:草案
b) 分:用例圖(流程)
c) 會:合併用例圖。初步系統設計
d) 分:修正
e) 會:最終版本的系統設計
3. 設計數據結構
a) 類,配置文件
b) 數據庫表
4. 詳細設計
a) 分工:接口(協議)
b) 分:詳細設計
|
|