MVC
MVC含義
一種軟件構(gòu)架,簡(jiǎn)單的說(shuō)就是在做軟件的時(shí)候,可以將軟件分為不同的模塊,不同的模塊實(shí)現(xiàn)了不同功能。
MVC 組成部分
Model 模型
View 視圖
Controller 控制器
MVC就是三種組成部分的縮寫(xiě)。
MVC 不同模塊的功能
Model(模型層) 程序員編寫(xiě)程序應(yīng)用的功能,數(shù)據(jù)庫(kù)設(shè)計(jì)等。屬于后臺(tái)操作。
View (視圖層) 前臺(tái)界面,也就是用戶可以看到的圖形見(jiàn)面,一般在web中是一些*.jsp或*.html。
Controller(控制器) 處理前臺(tái)和后臺(tái)請(qǐng)求。
MVC 優(yōu)點(diǎn)
采用MVC的優(yōu)點(diǎn)太多了,說(shuō)再多不如你在真正的項(xiàng)目中自己體會(huì),在這里不做太多解釋。
MVC 包結(jié)構(gòu)

雖然,這并不能說(shuō)明所有MVC框架所有的包模式,不過(guò)我覺(jué)得新手對(duì)于這個(gè)包結(jié)構(gòu)還是比較容易接受的。
DAO 模式
在DAO層,最主要的作用是:完成數(shù)據(jù)的操作。在這層,你可以完成對(duì)任何表的數(shù)據(jù)操作,不過(guò)個(gè)人認(rèn)為DAO層最大的作用是簡(jiǎn)單了編程人員的編程邏輯,簡(jiǎn)單的說(shuō)就是將一個(gè)大的問(wèn)題,分成了幾個(gè)比較小的問(wèn)題,這樣不管在測(cè)試還是在維護(hù)都起著很大的方便。
Factory 工廠
Factory 工廠在這里也可以說(shuō)成是DAO的工廠,這里Factory僅僅產(chǎn)生了DAO。那么Factory工廠模式有什么好處呢?
在MVC中的Factory 層,你完全可以把它想象成現(xiàn)實(shí)中的工廠,生產(chǎn)某些東西,如果在程序中使用工廠模式,你可以簡(jiǎn)化編程代碼,相當(dāng)與現(xiàn)實(shí)中你需要某個(gè)產(chǎn)品不需要自己去生產(chǎn),完全可以去工廠“拿”一個(gè),這樣程序的編程更加符合現(xiàn)實(shí)中的邏輯。
MVC 總結(jié)
本節(jié),我僅僅是將MVC的編輯思想簡(jiǎn)單的介紹了一下,我沒(méi)有加入一些詳細(xì)的例子,因?yàn)槲矣X(jué)得你在接觸MVC的時(shí)候,最好先了解MVC的編程思想,如果你要了解MVC的編程思想之后,你再接觸MVC的編程時(shí),你就會(huì)覺(jué)得特別簡(jiǎn)單。
最后,希望我這篇文章可以讓大家簡(jiǎn)單的了解MVC的編程模式。
摘要: ForEach小結(jié)
<c:forEach>標(biāo)簽具有以下一些屬性:
var:迭代參數(shù)的名稱。在迭代體中可以使用...
閱讀全文
通過(guò)以下Servlet程序和web.xml來(lái)說(shuō)明web.xml的配置以及過(guò)程
創(chuàng)建一個(gè)Login的HTML文件
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>login.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<form action="
test1" method="
post">
<table border="0" width="379" height="79">
<tr>
<td>帳號(hào):</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密碼:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td colspan="5" align="center"><input type="submit" value="登錄"></td>
</tr>
</table>
</form>
</body>
</html>
以上HTML標(biāo)簽中要說(shuō)明的是:
<form>標(biāo)簽中的
action="test_Web_xml" 和 method="post" 分別定義了Html將登陸的信息發(fā)送給了誰(shuí),以及發(fā)送信息的方法!
創(chuàng)建一個(gè)Servlet程序
public class LoginServlet extends HttpServlet{
public void
doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = null;
username = request.getParameter("username");
String password = null;
password = request.getParameter("password");
if(username.equals("username")&&password.equals("password")){
request.getRequestDispatcher("成功登陸?。?!").forward(request,response);
}else{
request.getRequestDispatcher("登陸失敗!!!").forward(request,response);
}
}
}
web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>
Login
</servlet-name>
<servlet-class>
com.rise.LoginServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
Login
</servlet-name>
<url-pattern>
/test1
</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
我理解web.xml的作用就是將頁(yè)面和后臺(tái)程序正確連接?。?!
通過(guò)一張圖片說(shuō)明我理解的web.xml的作用
以上的內(nèi)容是我自己對(duì)web.xml的理解,我覺(jué)得很簡(jiǎn)單,但真正寫(xiě)程序的時(shí)候部署程序是非常復(fù)雜的!
什么是JDBC
JDBC是由一組Java語(yǔ)言編寫(xiě)的類和接口組成,用來(lái)處理關(guān)系數(shù)據(jù)庫(kù)!利用JDBC的API,可用Java語(yǔ)法去訪問(wèn)各種各樣的SQL數(shù)據(jù)庫(kù)。
個(gè)人認(rèn)為:
把JDBC當(dāng)做是一門(mén)連接Java程序連接數(shù)據(jù)庫(kù)的技術(shù)不如把JDBC當(dāng)做連接程序和數(shù)據(jù)庫(kù)的橋梁。
以下我要寫(xiě)的例子是用純Java的Driver來(lái)連接數(shù)據(jù)庫(kù)的方式。連接的數(shù)據(jù)庫(kù)是mysql。
JDBC編程步驟
1.加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)(jar文件)
//需要下載一個(gè)數(shù)據(jù)庫(kù)的jar包,并導(dǎo)入相應(yīng)的JDBC項(xiàng)目中,創(chuàng)建路徑!
Class.forName("com.mysql.jdbc.Driver");
2.獲得數(shù)據(jù)庫(kù)連接
DriverManager.getConnection("jdbc:mysql://Database_IP:3306/DATABASE","DATAROOT","PASSWORD");//返回Connection————獲得數(shù)據(jù)庫(kù)連接
3.創(chuàng)建語(yǔ)句
String sql = "SQL_TORUNNING";
向DATABASE發(fā)送一個(gè)執(zhí)行語(yǔ)句
Statement stmt = conn.createStatement();//創(chuàng)建一個(gè) Statement 對(duì)象來(lái)將 SQL 語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù).
Statement—————SQL_RUNNING!!!
4.執(zhí)行查詢
ResultSet rs = Statement.executeQuery(SQL_RUNNING);//執(zhí)行SQL_RUNNING命令,返回ResultSet
//如果執(zhí)行的數(shù)據(jù)庫(kù)語(yǔ)句不是對(duì)數(shù)據(jù)庫(kù)中的內(nèi)容進(jìn)行修改的話,則用 Statement.executeQuery()
//如果執(zhí)行的數(shù)據(jù)庫(kù)語(yǔ)句是修改數(shù)據(jù)庫(kù)中的內(nèi)容進(jìn)行修改的話,則用 Statement.executeUpdate()
//當(dāng)然他們返回值的類型也不同!
//根據(jù)命令的不同Statement的方法也不同
創(chuàng)建一個(gè)表
Statement.execute(create a table)
增刪改查Insert、update、delete...
Statement.executeUpdate()
查詢語(yǔ)句Select
Statement.executeQuery(Select);
5.遍歷結(jié)果集
while(ResultSet.next()){
ResultSet.getInt(int);
ResultSet.getString(int);
......
}
6.關(guān)閉數(shù)據(jù)庫(kù)連接
Connection.close();
步驟分析

(圖一)
1.加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)
我們來(lái)看圖一,工廠和幾個(gè)農(nóng)村之間有一條河,不能夠直接進(jìn)行溝通,工廠就相當(dāng)于一個(gè)Java程序,而幾個(gè)農(nóng)村就相當(dāng)于不同的數(shù)據(jù)庫(kù);
工廠為B村生產(chǎn)一些材料,但是生產(chǎn)出來(lái)之后并不能直接交給B村,然后工廠的廠長(zhǎng)就想在工廠和B村之間架設(shè)一座橋梁來(lái)運(yùn)送生產(chǎn)出來(lái)的材料——我們大可把數(shù)據(jù)庫(kù)驅(qū)動(dòng)加載當(dāng)做這個(gè)架設(shè)橋梁的想法。
在程序中我們要怎么做呢?
在加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)的時(shí)候,必須要將相應(yīng)的mysql-connector-java-5.0.4-bin.jar包,然后將jar包導(dǎo)入相應(yīng)的項(xiàng)目中如下圖

在mysql-connector-java-5.0.4-bin.jar右擊建立路徑,就相當(dāng)于import的過(guò)程——我不確定這么說(shuō)對(duì)不對(duì),但我是這么理解的。
建立路徑后,你的項(xiàng)目將出現(xiàn)一個(gè)新的文件,如下圖

這樣的話,你就可以順利加載數(shù)據(jù)庫(kù)驅(qū)動(dòng),否則當(dāng)你在運(yùn)行的時(shí)候會(huì)出現(xiàn)找不到Driver.class的異常,也就是無(wú)法加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)。
Class.forName("com.mysql.jdbc.Driver");
2.獲得數(shù)據(jù)庫(kù)連接
既然廠長(zhǎng)有想法和B村之間架設(shè)一座橋梁,那就要和B村商量一下?。∪缓螅瑥S長(zhǎng)就要去河的對(duì)岸,那條河呢?就是在工廠和B村之間的那條河(這條河就相當(dāng)于Database_IP),然后去找B村的村長(zhǎng)(在這里要明白是B村的村長(zhǎng)不是A村的,所以不能找錯(cuò)了!??!),找到B村村長(zhǎng),“我要在工廠和B村之間建設(shè)一座橋,來(lái)運(yùn)輸我們的東西”,下一步談的當(dāng)然是條件了,工廠老板說(shuō)“我要B村出資90%,剩下的由工廠出!!”村長(zhǎng)當(dāng)然不干了,這橋當(dāng)然也就沒(méi)法建設(shè)了?。。∷灾挥挟?dāng)兩者都滿意的情況下才可以建設(shè)橋梁(比如,各處50%)其實(shí)談條件的過(guò)程就相當(dāng)于驗(yàn)證數(shù)據(jù)庫(kù)的"DATAROOT"和"PASSWORD"?。?!只有兩者都正確的情況下才可以進(jìn)行下一步的計(jì)劃——也就是建設(shè)橋梁!??!
在程序中的過(guò)程如下:
Connection conn = null;
conn = DriverManager.getConnection("jdbc:mysql://Database_IP:3306/DATABASE","DATAROOT","PASSWORD");
//返回Connection————獲得數(shù)據(jù)庫(kù)連接
3.創(chuàng)建語(yǔ)句
橋已經(jīng)建好了,然后工廠要準(zhǔn)備一些卡車來(lái)運(yùn)輸生產(chǎn)的貨物,然后農(nóng)村需要根據(jù)不同的貨物來(lái)處理這些貨物,有些貨物直接卸在B村就可以了,但有些貨物卸在B村之后,B村要做一些處理然后運(yùn)回工廠!??!
這個(gè)過(guò)程在程序是怎么體現(xiàn)的呢?
String sql = "SQL_TORUNNING";
向DATABASE發(fā)送一個(gè)執(zhí)行語(yǔ)句
Statement stmt = conn.createStatement();//創(chuàng)建一個(gè) Statement 對(duì)象來(lái)將 SQL 語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù).
Statement—————SQL_RUNNING!!!
4.處理數(shù)據(jù)庫(kù)發(fā)送來(lái)的消息
如果工廠運(yùn)輸?shù)紹村的貨物,只要B村的村長(zhǎng)給工廠開(kāi)一張條就行了;但也會(huì)有一些貨物需要運(yùn)回工廠!!
在程序中:
ResultSet rs = Statement.executeQuery(SQL_RUNNING);//執(zhí)行SQL_RUNNING命令,返回ResultSet
//如果執(zhí)行的數(shù)據(jù)庫(kù)語(yǔ)句不是對(duì)數(shù)據(jù)庫(kù)中的內(nèi)容進(jìn)行修改的話,則用 Statement.executeQuery()——需要返回一些貨物
//如果執(zhí)行的數(shù)據(jù)庫(kù)語(yǔ)句是修改數(shù)據(jù)庫(kù)中的內(nèi)容進(jìn)行修改的話,則用 Statement.executeUpdate()——開(kāi)張條就行了
//當(dāng)然他們返回值的類型也不同!
//根據(jù)命令的不同Statement的方法也不同
創(chuàng)建一個(gè)表
Statement.execute(create a table)
增刪改查Insert、update、delete...
Statement.executeUpdate()
查詢語(yǔ)句Select
Statement.executeQuery(Select);
5.處理數(shù)據(jù)庫(kù)傳回的內(nèi)容
這個(gè)過(guò)程由工廠完成,如果是返回的一些貨物的話,工廠要做一些處理。
處理的過(guò)程:
while(ResultSet.next()){
ResultSet.getInt(int);
ResultSet.getString(int);
......
}
6.關(guān)閉數(shù)據(jù)庫(kù)
這樣的話,工廠和B村的交易就完成,在現(xiàn)實(shí)世界中工廠和B村之間的橋梁不會(huì)被拆除,因?yàn)榻ㄒ蛔鶚虻拇鷥r(jià)很大,但在程序和數(shù)據(jù)庫(kù)之間架設(shè)一座橋梁簡(jiǎn)直太簡(jiǎn)單了,所以在這里我們要把這座橋梁拆除。
Connection.close();
簡(jiǎn)單的舉了一個(gè)例子來(lái)說(shuō)明數(shù)據(jù)庫(kù)和程序之間是怎么連接的,望對(duì)大家有所幫助。
SQL語(yǔ)言是操作數(shù)據(jù)庫(kù)的基礎(chǔ)語(yǔ)言,對(duì)于不同的數(shù)據(jù)庫(kù)語(yǔ)言產(chǎn)品,SQL語(yǔ)言大多是通用的,本篇博客旨在介紹一些最常用的SQL語(yǔ)句。希望對(duì)大家能有所幫助。
注:
本文中的紅色字體黃色背景的內(nèi)容為SQL語(yǔ)句??!
笨人也是菜鳥(niǎo),如果我寫(xiě)的有錯(cuò)誤,大家一定要指出來(lái)啊?。?!好了,廢話不說(shuō)了,切入正題:
首先,使用
status查看MySQL當(dāng)前的信息
1.使用
show databases;語(yǔ)句查看當(dāng)前數(shù)據(jù)庫(kù):
2.使用
create database DATABASE_NAME;語(yǔ)句來(lái)創(chuàng)建DATABASE_NAME數(shù)據(jù)庫(kù)
這樣,我們創(chuàng)建好了一個(gè)名字為database_name的數(shù)據(jù)庫(kù)。
注:數(shù)據(jù)庫(kù)語(yǔ)句對(duì)字母大小寫(xiě)不敏感!
3.使用
use DATABASE_NAME;切換到使用DATABASE_NAME數(shù)據(jù)庫(kù)模式。
4.在database_name數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)表:
create table if not exists table_name -- 如果表table_name不存在則創(chuàng)建
(id int primary key auto_increment, -- 創(chuàng)建int類型為主鍵,且自動(dòng)增長(zhǎng)
name varchar(200) not null, -- 創(chuàng)建字符類型的列,最大長(zhǎng)度是200字節(jié)
age int(3), -- 創(chuàng)建int類型,長(zhǎng)度為3個(gè)字節(jié)
sex varchar(2), -- 創(chuàng)建字符類型,長(zhǎng)度是2個(gè)字節(jié)
salary float(11,2), -- 創(chuàng)建float類型的列,長(zhǎng)度為2個(gè)字節(jié)
address varchar(50), -- 創(chuàng)建字符類型,長(zhǎng)度為50個(gè)字節(jié)
birthday date -- 創(chuàng)建日期類型
);
這樣就創(chuàng)建好了一張表,可以用 describe 或則 desc來(lái)查看表的結(jié)構(gòu)
describe table_name;
desc table_name;
這樣數(shù)據(jù)就創(chuàng)建好了一張表,我們可以用
show tables; 來(lái)查看數(shù)據(jù)庫(kù)中所有表

然后,我們就可以看見(jiàn)我們創(chuàng)建的表
====================================================================================
數(shù)據(jù)庫(kù)最具核心的用法——對(duì)數(shù)據(jù)庫(kù)表的數(shù)據(jù)的
增刪改查。
向表中增加數(shù)據(jù)(要了加入表的結(jié)構(gòu),看哪項(xiàng)可以為空)
insert table_name (name,age,sex) values ('tovep',22,'男');
向表中加入數(shù)據(jù)的時(shí)候,并不是要把所有的信息都要寫(xiě)近期,只要表中結(jié)構(gòu)設(shè)置為可以為空的都
可以不寫(xiě)??!
id不用寫(xiě),因?yàn)樗亲詣?dòng)增長(zhǎng)的!
要想查看表中的內(nèi)容,可以用select語(yǔ)句———為了說(shuō)明下面的情況,我加入了多條信息
select * from table_name; -- 將table_name表中的所有數(shù)據(jù)都打印出來(lái)
select name from table_name; --查看所有人的名字
select * from table_name where id<5; --將表中id小于100的都打印出來(lái)
在使用select 語(yǔ)句查詢的時(shí),常常用到別名
select t.name,t.id,t.age from table_name as t;
select 語(yǔ)句中的where表示查詢的條件
where中還可以使用like與"%"對(duì)字符類型的列進(jìn)行模糊查詢
select * from table_name where name like 't%';
update語(yǔ)句:修改數(shù)據(jù)
update 表名 set 字段名 = '修改的值'
update table_name set name='tvoep1' where id>2;

刪除用
delete from 表名 where 判斷信息
delete from table_name where id=5;

這樣的話就刪除了id=5的信息
====================================================================================
使用drop 來(lái)刪除表或者數(shù)據(jù)庫(kù)
drop table table_name;
drop database database_name;
經(jīng)過(guò)一個(gè)多月的Java學(xué)習(xí),我們慢慢深入了解了Java中的一些比較高級(jí)的方法!但這些方法在你調(diào)試的時(shí)候一定要慎重!!不要等待失去了整個(gè)硬盤(pán),才后悔莫及?。?! 如果你在編程的時(shí)候多長(zhǎng)個(gè)心眼,這些小的錯(cuò)誤是可以避免的!?。?/p>
下面我們來(lái)看一下一個(gè)讓人很崩潰的錯(cuò)誤,這個(gè)錯(cuò)誤讓我感到不可思議!!代碼如下:
import java.io.File;
public class KillBackServer {
public static void main(String[] args){
File f = new File("C:\\");
fun(f);
}
//定義一個(gè)靜態(tài)函數(shù),用來(lái)實(shí)現(xiàn)對(duì)一盤(pán)文件的遍歷
public static void fun(File f)
{
if(f.isDirectory())
{
File file[] = f.listFiles();
try
{
for(int i = 0 ; i <file.length ; i++)
{
fun(file[i]);
}
}
catch(Exception e){}
}
else
{
if("我是病毒.exe".equals(f.getName()))
System.out.println(f);
//僅僅當(dāng)程序找到"我是病毒.exe"的 時(shí)候才執(zhí)行這一句代碼
//f.delete();
System.out.println("該病毒已被查殺");}
System.out.println(f.getPath() + "***********************");
}
}
}
大家一定要注意紅色字體的代碼?。?!我之所以注釋了,就是怕直接復(fù)制我的代碼,然后運(yùn)行……
如果這樣后果你是知道的……
本來(lái)這段代碼是用來(lái)掃描C盤(pán),找到"我是病毒.exe"文件,并把它刪除,判斷一個(gè)文件名,用的是equals這是對(duì)的?。?!
錯(cuò)就錯(cuò)在:if()判斷,大家都明白了吧!
希望大家以后不要因?yàn)榉噶诉@個(gè)低級(jí)錯(cuò)誤,而把自己的硬盤(pán)給了格了= = |||
其實(shí),有很多方法可以避免這種錯(cuò)誤?。。”热?,你可以在f.delete(); 后面加上一句打印語(yǔ)句,這樣的話,在你測(cè)試的時(shí)候就會(huì)發(fā)現(xiàn),原來(lái)if語(yǔ)句后面少一個(gè)大括號(hào)……
這個(gè)錯(cuò)誤寫(xiě)出來(lái)僅僅為了提醒大家規(guī)范的重要性?。。?br />
/**
* Robot類 :
*
* exec 函數(shù)聲明:
* public Process exec (String command) throws IOException ,參數(shù)及功能說(shuō)明:
* command: 一條指定的系統(tǒng)命令
* 功能:在單獨(dú)的進(jìn)程中執(zhí)行指定的字符串命令
*
* keyPress 函數(shù)說(shuō)明:
* public void keyPress(int keycode),參數(shù)及功能說(shuō)明:
* keycode:要按下的鍵(例如,KeyEvent.VK_A)
* 功能:模擬按下指定鍵
*
* keyRelease 函數(shù)說(shuō)明:
* public void keyRelease(int keycode),參數(shù)及功能說(shuō)明:
* keycode:要釋放的鍵
* 功能:模擬釋放指定鍵
*
* @param tovep
*/
import java.awt.Robot;
import java.awt.event.KeyEvent;
public class Exce {
public static void main(String[] args) {
try{
//創(chuàng)建自動(dòng)操作類
Robot robot = new Robot();
/**
*
* 利用Runtime類運(yùn)行Word程序的方法為:
* Runtime.getRuntime().exec("cmd /c start winword");
* 括號(hào)里的是系統(tǒng)命令
*
*/
//啟動(dòng)記事本程序
Runtime.getRuntime().exec("cmd /c start notepad");
//延緩幾秒鐘,等待記事本程序啟動(dòng)成功
robot.delay(3000);
//模擬按下"Ctrl + Space" 組合鍵,啟動(dòng)輸入法
pressKeyWithCtrl(robot,KeyEvent.VK_SPACE);
//模擬隨機(jī)按下100個(gè)字母,輸入漢字
for(int i=0;i<100;i++){
pressKey(robot, (int) (Math.random()* 25) + 'A');
pressKey(robot,KeyEvent.VK_SPACE);
}
//延緩5秒鐘,一共觀察
robot.delay(5000);
//關(guān)閉記事本
//closeApplication(robot);
}catch (Exception e){
System.out.println(e.getMessage());
}
}
//模擬按下鍵盤(pán)字符鍵
public static void pressKey(Robot robot, int keyvalue){
//模擬按下
robot.keyPress(keyvalue);
//模擬彈起
robot.keyRelease(keyvalue);
}
//模擬同時(shí)按下"Ctrl"鍵和字符鍵
public static void pressKeyWithCtrl(Robot robot, int keyvalue){
//模擬按下
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(keyvalue);
//模擬彈起
robot.keyPress(keyvalue);
robot.keyRelease(KeyEvent.VK_CONTROL);
}
//模擬按下"Alt + F4"組合鍵,關(guān)閉當(dāng)前應(yīng)用程序
public static void closeApplication(Robot robot){
//模擬按下"Alt + F4"組合鍵
//模擬按下
robot.keyPress(KeyEvent.VK_ALT);
robot.keyPress(KeyEvent.VK_F4);
//模擬彈起
robot.keyRelease(KeyEvent.VK_ALT);
robot.keyRelease(KeyEvent.VK_F4);
//模擬按下"N",不保存文件退出記事本程序
//模擬按下
robot.keyPress(KeyEvent.VK_N);
//模擬彈起
robot.keyRelease(KeyEvent.VK_N);
}
}
在Java中,Everything is Object!所以在文件中,要不例外!
在Java中,可以用File類來(lái)表示一個(gè)文件!!?。ㄗ⒁膺@里的文件可以是所有文件,包括文件夾)
下面的代碼表示一個(gè)文件:
public class Demo {
public static void main(String[] args){
File f = new File("e:\\file");
if(f.isDirectory()){
System.out.println(f.getPath());
}
}
}
運(yùn)行結(jié)果是:

代碼中isDirectory()方法是判斷文件是文件夾還是一個(gè)文件(這里可能有點(diǎn)迷糊),也可以這么理解,我所說(shuō)的文件夾就是一個(gè)目錄,
getPath()方法是打印文件(這里指的是file文件夾)的路徑?。?!
看看下面的代碼還有注釋:
/**
*
* File.speparator的作用是判斷在不同的系統(tǒng)中斜杠的方向
*
* 在windows中斜杠的方向是向右斜的\\
* 在Linux 中斜杠的方向是向左斜的//
*
*
* File中createNewFile方法:
* 當(dāng)且僅當(dāng)不存在具有此抽象路徑名指定名稱的文件時(shí),不可分地創(chuàng)建一個(gè)新的空文件。
* 檢查文件是否存在,若不存在則創(chuàng)建該文件,這是單個(gè)操作,對(duì)于其他所有可能影響該文件的文件系統(tǒng)活動(dòng)來(lái)說(shuō),該操作是不可分的。
*
* 注:此方法不應(yīng)該 用于文件鎖定,因?yàn)樗脜f(xié)議可能無(wú)法可靠地工作。應(yīng)該使用 FileLock 機(jī)制替代。
*
*
*/
import java.io.File;
public class Demo01 {
public static void main(String[] args) throws Exception{
File f;
f = new File("e:" + File.separator + "file" + File.separator + "io.txt");
System.out.println(f.createNewFile());
}
}
===================================
運(yùn)行結(jié)果是:
大家注意,如果你的直接復(fù)制這些代碼的話,可能會(huì)出現(xiàn)以下異常
看看大家都明白了吧! 系統(tǒng)找不到指定的文件,就是在e盤(pán)下新建一個(gè)file文件夾就可以啦?。。?br />
下面代碼詳細(xì)的介紹了File類中的createNewFile()方法:
/**
*
* File中createNewFile方法:
* 當(dāng)且僅當(dāng)不存在具有此抽象路徑名指定名稱的文件時(shí),不可分地創(chuàng)建一個(gè)新的空文件。
* 檢查文件是否存在,若不存在則創(chuàng)建該文件,這是單個(gè)操作,對(duì)于其他所有可能影響該文件的文件系統(tǒng)活動(dòng)來(lái)說(shuō),該操作是不可分的。
*
* 注:此方法不應(yīng)該 用于文件鎖定,因?yàn)樗脜f(xié)議可能無(wú)法可靠地工作。應(yīng)該使用 FileLock 機(jī)制替代。
* 返回:是布爾型
*
*/
import java.io.File;
public class Demo02 {
public static void main(String[] args) throws Exception{
File f = new File("f:\\demo.txt");
System.out.println(f.createNewFile());
}
}
運(yùn)行結(jié)果如下:
下面介紹一下File類中delete()方法,代碼如下:
/**
*
* 要操作一個(gè)文件,必須要找到這個(gè)文件
* 在Java中,只有File類能表示一個(gè)文件,所有用File表示一個(gè)文件
* File的屬性就是文件的路徑,虛擬機(jī)會(huì)根據(jù)File類的參數(shù)找到指定的文件
* 找到問(wèn)及那后可以用File類的方法進(jìn)行操作!
*
* delete()方法可以刪除一個(gè)文件或者一個(gè)整個(gè)文件夾(整個(gè)目錄),返回結(jié)果是布爾類型??!
*
* */
import java.io.File;
public class Demo11 {
public static void main(String[] args) {
File f = new File("f:\\demo.txt");
f.delete();
if(boo){
System.out.println("成功刪除文件");
}
}
}
這個(gè)程序運(yùn)行的結(jié)果:
下面的代碼是介紹查看一個(gè)文件的目錄,以及判斷這個(gè)文件是否是文件夾,代碼如下:
/**
*
* File的一個(gè)方法File.getPath()
* 是將此抽象路徑名轉(zhuǎn)換為一個(gè)路徑名字符串。
*
* File的exists方法
* 是測(cè)試此抽象路徑名表示的文件或目錄是否存在。
*
*
* File的getParent()方法
* 是返回此抽象路徑名父目錄的路徑名字符串;如果此路徑名沒(méi)有指定父目錄,則返回 null
*
* */
import java.io.File;
public class Demo21 {
public static void main(String[] args) {
File f = new File("f:" + File.separator + "demo.txt");
System.out.println(f.getPath());
System.out.println(f.getParent());
if(f.exists()){
f.delete();
}
else{
try{
System.out.println(f.createNewFile());
}catch(Exception e){}
}
}
}
運(yùn)行結(jié)果:
再看一個(gè)判斷目錄的方法:
/**
*
* File的一個(gè)方法File.getPath()
* 是將此抽象路徑名轉(zhuǎn)換為一個(gè)路徑名字符串。
*
* File的isDirectory()的方法
* 是測(cè)試此抽象路徑名表示的文件是否是一個(gè)目錄。
* 當(dāng)且僅當(dāng)此抽象路徑名表示的文件存在且 是一個(gè)目錄時(shí),返回 true;否則返回 false。
*
*
* */
import java.io.File;
public class Demo51 {
public static void main(String[] args){
File f = new File("f:" + File.separator + "aa");
System.out.println(f.getPath());
System.out.println(f.isDirectory());
}
}
運(yùn)行結(jié)果:
注意下一個(gè)代碼,可能對(duì)你很有幫助啊??!
/**
*
* File的list()方法可以:
* 返回一個(gè)字符串?dāng)?shù)組,
* 這些字符串指定此抽象路徑名表示的目錄中的文件和目錄。
*
* */
import java.io.File;
public class Demo61 {
public static void main(String[] args) {
File f = new File("f:\\book");
//使用list列出
//列出的只是一個(gè)名稱
String[] str = f.list();
for(int i=0;i<str.length;i++){
System.out.println(str[i]);
}
}
}
這個(gè)程序的運(yùn)行結(jié)果是你目錄下的文件:
下面的程序 你可能會(huì)很感興趣!因?yàn)槟阆胪鍴K,或者你想給別人整個(gè)惡作劇,你必須要掃描下他的電腦,以下方法就實(shí)現(xiàn)了怎樣去掃描一個(gè)電腦里的所有文件(我的代碼選擇的是掃描C盤(pán)下的所有文件,如果你想掃描其他盤(pán),只要把文件改一下就OK啦)
import java.io.File;
public class Demo81 {
public static void main(String[] args) {
String str = "C:\\";
File f = new File(str);
fun(f);
}
//要不斷列出,因?yàn)榻o出的File類對(duì)象可能是一個(gè)目錄
public static void fun(File f){
//判斷給定的路徑是否是目錄,如果是目錄在列出
if(f.isDirectory()){
File[] file = f.listFiles();
//再依次循環(huán)進(jìn)行判斷
try{
for(int i = 0;i < file.length;i++){
//繼續(xù)把內(nèi)容傳入到fun方法之中進(jìn)行驗(yàn)證
fun(file[i]);
}
}catch(Exception e){}
}
else{
System.out.println(f);
}
}
}
運(yùn)行結(jié)果我就不貼出來(lái)了,因?yàn)镃盤(pán)的文件太多啦?。?!如果你想知道,自己把代碼帶下看看,你會(huì)很吃驚的!你會(huì)想原來(lái)掃描的原理這么簡(jiǎn)單?。?!
posted @
2010-11-07 23:05 tovep 閱讀(59669) |
評(píng)論 (2) |
編輯 收藏
Java線程類有兩種實(shí)現(xiàn)方式,第一種就是繼承Thread類,另一種是現(xiàn)實(shí)Runnable接口。這兩種實(shí)現(xiàn)方式的區(qū)別很大,下面就說(shuō)一下它們之間到底有什么區(qū)別。
我們首先用第一種方式寫(xiě)一個(gè)線程類:
代碼如下:
package Ticket;
public class Extends {
public static void main(String[] args){
//實(shí)例化進(jìn)程并準(zhǔn)備執(zhí)行
new Thread(new MyThread(),"001窗口").start();
new Thread(new MyThread(),"001窗口").start();
new Thread(new MyThread(),"001窗口").start();
}
}
class MyThread extends Thread{
//定義一個(gè)變量
private int ticket = 10;
public void run(){
//這里之所以要循環(huán)300次,就是為了讓所有的 車票都賣出去!可能你會(huì)想,為什么不是30呢?
//嘿嘿。。。聰明的你肯定明白這個(gè)循環(huán)的次數(shù)為什么會(huì)多出票數(shù)很多?=====其實(shí)我開(kāi)始也不知道!?。?nbsp; ==|||
for(int i=0;i<300;i++){
try {
//調(diào)用sell()方法
this.sell();
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void sell(){
if(ticket>0){
System.out.println(Thread.currentThread().getName() + " ===> 還剩下" + (ticket--) + "車票");
}
}
}
看看這個(gè)程序的運(yùn)行結(jié)果你就明白為什么繼承Thread類實(shí)現(xiàn)線程類的一個(gè)弊端
------------------------------------------------
大家都發(fā)現(xiàn)了吧!輸出的結(jié)果和預(yù)想的不一樣?。?!
我們來(lái)分析一下代碼,查看main函數(shù):
new Thread(new MyThread(),"001窗口").start();
new Thread(new MyThread(),"001窗口").start();
new Thread(new MyThread(),"001窗口").start();
我們可以看出,實(shí)例化了三個(gè)MyThread類,這樣的話,private int ticket = 10;就運(yùn)行了三次,所以ticket打印出來(lái)的 也就是30張;在這里注意一下并不是ticket賦值為30,而是ticket賦值為10,但賦值了三次?。?!也就是現(xiàn)在有三個(gè)ticket?。。?br />
這樣并不能實(shí)現(xiàn)資源共享!
我們知道我們利用多線程就是為了將多個(gè)線程去處理一個(gè)數(shù)據(jù)的集合?。?! 他們是同時(shí)處理的!??!如果向上面的話,并沒(méi)有將數(shù)據(jù)的集合(ticket)進(jìn)行共享,而是將每一個(gè)類都從新建了一個(gè)數(shù)據(jù)的集合,分別對(duì)自己的集合進(jìn)行處理?。。?!
如果想解決這個(gè)問(wèn)題,其實(shí)也很簡(jiǎn)單,不過(guò)如果當(dāng)數(shù)據(jù)的類型和種類比較多的時(shí)候,這樣寫(xiě)就太麻煩了?。。?!
那實(shí)現(xiàn)Runnable接口的線程類可不可以呢?。????
下面來(lái)看一看:
代碼如下:
package IO;
public class Inter {
public static void main(String[] args){
//聲明并實(shí)例化一個(gè)MyThread01類
MyThread01 mt = new MyThread01();
new Thread(mt,"001窗口").start();
new Thread(mt,"002窗口").start();
new Thread(mt,"003窗口").start();
}
}
class MyThread01 implements Runnable{
private int ticket = 10;
public void run(){
for(int i=0;i<200;i++){
try {
this.sell();
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void sell(){
if(ticket>0){
System.out.println(Thread.currentThread().getName() + " ===> 還剩下" + (ticket--) + "車票");
}
}
}
---------------------------------------------
這段程序的運(yùn)行結(jié)果:

看看這個(gè)結(jié)果是不是和自己想的一樣?。。。∵@樣就可以了!??!用這個(gè)方法去創(chuàng)建一個(gè)線程類是不是可以達(dá)到資源共享?。。。?br />
其實(shí)??!我看來(lái),所謂的資源共享也就是將一個(gè)數(shù)據(jù)的集合讓多個(gè)線程去處理?。?!
我們看一下代碼?。。?br />
MyThread01 mt = new MyThread01();
new Thread(mt,"001窗口").start();
new Thread(mt,"002窗口").start();
new Thread(mt,"003窗口").start();
我們可以看出這個(gè)過(guò)程中,我們只聲明并實(shí)例化了一個(gè)MyThread01類,也就是說(shuō)在這里過(guò)程中,給ticket進(jìn)行了初始化?。。?br />
但大家要注意的是:真正創(chuàng)建處理數(shù)據(jù)的線程是
new Thread(mt,"001窗口").start();
new Thread(mt,"002窗口").start();
new Thread(mt,"003窗口").start();
因此,這樣可以將一個(gè)ticket的數(shù)據(jù)集 由三個(gè)線程來(lái)處理?。?!
這樣就是所謂的資源共享!??!
ok???
=====================================================================
總結(jié)一下這兩種方式的特點(diǎn):
1.繼承Thread來(lái)創(chuàng)建線程類的方法,在繼承了Thread后,不能再繼承其他類,這樣靈活性就不如實(shí)現(xiàn)Runnable接口來(lái)創(chuàng)建線程類的方法了!??!
2.正如上面所說(shuō)的使用實(shí)現(xiàn)Runnable接口來(lái)創(chuàng)建線程類的方法可以達(dá)到資源共享?。。。ㄔ谶@里說(shuō)明一下:繼承Thread類來(lái)創(chuàng)建線程類的方法也可以實(shí)現(xiàn)資源共享,只不過(guò)比較麻煩?。?!因此,在創(chuàng)建線程類的時(shí)候,應(yīng)優(yōu)先選擇實(shí)現(xiàn)Runnable接口來(lái)創(chuàng)建線程類的方法?。。。?br />
今天寫(xiě)一個(gè)具有簡(jiǎn)單功能的學(xué)生管理系統(tǒng)!不過(guò),這個(gè)系統(tǒng)的構(gòu)建基于現(xiàn)實(shí)中的Java程序開(kāi)發(fā)框架!所有的代碼全部自己去寫(xiě),并且要在程序中體現(xiàn)出面向?qū)ο蟮募?xì)想和程序開(kāi)發(fā)中的框架實(shí)現(xiàn)原理。
首相,對(duì)問(wèn)題進(jìn)行分析:
程序要完成的功能很簡(jiǎn)單,當(dāng)程序運(yùn)行的時(shí)候出現(xiàn)以下信息

--------圖1--------
然后程序等待用戶輸入
如果用戶選擇1,那么進(jìn)入增加人員的信息(
下面來(lái)分析增加人員的過(guò)程:
首先,要新建一個(gè)Person類,當(dāng)用戶選擇1的時(shí)候就實(shí)例化Person類,并將Person進(jìn)行初始化,這并沒(méi)有結(jié)束此次的操作,最后的操作是將Person類存儲(chǔ)到文件中,這個(gè)文件名我定義為Person.ser。這樣這個(gè)過(guò)程才算結(jié)束,但這里的結(jié)束并不是程序結(jié)束,而是完成了1操作,整個(gè)程序并沒(méi)有結(jié)束,除非用戶選擇4退出程序,否則程序一直執(zhí)行。
)
如果用戶選擇2,那么程序查看所有人員的信息(
在這個(gè)過(guò)程中,程序要將Person.ser文件中的內(nèi)容寫(xiě)入到程序中,并打印到控制臺(tái)顯示,執(zhí)行完這一步之后,程序返回上一步操作,在這里程序仍然沒(méi)有退出。
)
如果用戶選擇3,程序進(jìn)入的是對(duì)信息進(jìn)行修改的頁(yè)面(
這個(gè)過(guò)程相對(duì)來(lái)說(shuō)比較復(fù)雜,因?yàn)檫@個(gè)過(guò)程涉及到Person.ser文件內(nèi)容的寫(xiě)入和寫(xiě)出過(guò)程,也就是先把文件中的內(nèi)容輸出到控制臺(tái)顯示當(dāng)前用戶的信息,等待用戶輸入新的信息,當(dāng)用戶輸入信息后,要將原來(lái)的信息進(jìn)行覆蓋,也就是將信息從新寫(xiě)到Person.ser中——這里我們僅僅考慮Person.ser中只有一個(gè)Person的情況。
)
通過(guò)以上分析,我們可以很清楚的知道,這個(gè)程序需要一個(gè)循環(huán)來(lái)做支撐,并且這個(gè)循環(huán)每執(zhí)行一次都要輸出圖1的內(nèi)容。
首先新建一個(gè)Persion類
package Object;
import java.io.Serializable;
//要想將類存儲(chǔ)在文件中必須實(shí)現(xiàn)Serializable接口!?。?/p>
public class Person implements Serializable{
private String name;
private int age;
private float score;
public Person(String name, int age, float score){
this.name = name;
this.age = age;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public float getScore() {
return score;
}
public void setScore(float score) {
this.score = score;
}
public String toString(){
return "NAME: " + this.name + " AGE: " + this.age + " SCORE: " + this.score;
}
}
Text類中包含了程序中所有的text信息
package Text;
/**
*
* 這個(gè)類是用來(lái)輸出整個(gè)程序中要輸出的所有的Text信息?。?!
* Text類中沒(méi)有任何屬性,只有幾個(gè)輸出文本的方法!!!
*
*
* */
public class Text {
//這個(gè)方法用來(lái)顯示用戶運(yùn)行程序時(shí)的信息
public String mainText(){
return "\n\t\t1.增加人員的信息" + "\n\t\t2.瀏覽人員的信息" + "\n\t\t3.修改人員的信息" + "\n\t\t4.退出系統(tǒng)" + "\n\n請(qǐng)選擇要使用的操作:";
}
//輸入有誤信息
public String errText(){
return "您所輸入的信息有誤,請(qǐng)重新輸入?。?!";
}
//增加信息顯示
public String addText(){
return "請(qǐng)輸入您要增加的學(xué)生的信息";
}
public String addName(){
return "請(qǐng)輸入學(xué)生的姓名:";
}
public String addAge(){
return "請(qǐng)輸入學(xué)生的年齡:";
}
public String addScore(){
return "請(qǐng)輸入學(xué)生的成績(jī):";
}
//修改的內(nèi)容Modify
public String modifyText(){
return "請(qǐng)輸入您要修改的內(nèi)容";
}
public String edd(){
return "操作成功";
}
}
Methods類中包含了所有的方法:
package Methods;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Scanner;
import Object.Person;
import Text.Text;
/**
*
* 這個(gè)方法中包括了整個(gè)程序所要用到的方法,包括:
* 從控制臺(tái)寫(xiě)入(Input)信息方法;
* 向控制臺(tái)寫(xiě)出(Output)信息的方法;
* 基本上包含了所有的方法
*
*
* */
public class Methods {
private static Person obj;
//用戶從控制臺(tái)向程序?qū)懭霐?shù)據(jù),用來(lái)選擇用戶想要的操作
public int InputSelect(){
Scanner inputSelect = new Scanner(System.in);
int select = inputSelect.nextInt();
return select;
}
//增加Person信息方法
public Person InputPerson(){
Text text = new Text();
Scanner str = new Scanner(System.in);
System.out.println(text.addText() + "\n" + text.addName());
String name = str.next();
System.out.println(text.addAge());
int age = str.nextInt();
System.out.println(text.addScore());
float score = str.nextFloat();
Person p = new Person(name, age, score);
return p;
}
//將類從程序中寫(xiě)出,寫(xiě)到文件中
public void Output(Person p) throws Exception{
ObjectOutputStream out = null;
out = new ObjectOutputStream(new FileOutputStream(new File("e:\\person.ser")));
out.writeObject(p);
out.close();
}
//從文件中讀入信息
public Person Output() throws Exception{
ObjectInputStream in = null;
in = new ObjectInputStream(new FileInputStream(new File("e:\\person.ser")));
obj = (Person)in.readObject();
Person p = obj;
in.close();
return p;
}
//修改類的方法
public void ModifyPerson() throws Exception{
Text text = new Text();
Scanner str = new Scanner(System.in);
//先從文件中讀入信息
Person p = this.Output();
System.out.println(text.modifyText());
System.out.println("修改前的內(nèi)容為: \n" + p);
this.Output(this.InputPerson());
text.edd();
}
}
Main用來(lái)調(diào)用這些方法,完成想要的結(jié)果
package Main;
import Methods.Methods;
import Object.Person;
import Text.Text;
/**
*
* 這里是程序的入口,當(dāng)執(zhí)行這個(gè)程序的時(shí)候首先打印了圖1的內(nèi)容,為了表現(xiàn)面向?qū)ο蟮乃枷?,我將程序中首先要打印的信?br />
* 放入到一個(gè)Text類中。
* 因?yàn)閮H僅當(dāng)用戶選擇了退出程序的時(shí)候才能退出程序,所以這個(gè)程序必須用一個(gè)‘死’循環(huán),只有當(dāng)用戶選擇了4的時(shí)候,用戶
* 才退出程序!
*
* */
public class Main {
final static Text text = new Text();
static Methods m = new Methods();
public static void main(String[] args) throws Exception{
boolean mainCycle = true;
//有一個(gè)循序
while(mainCycle){
//只有當(dāng)用戶輸入的是4的時(shí)候程序才退出循環(huán)
System.out.println( text.mainText());
//捕獲控制臺(tái)用戶輸入的選擇信息
int select = m.InputSelect();
if(select == 4)//這里的判斷是——用戶輸入的信息等于4的時(shí)候程序結(jié)束循環(huán)
{
mainCycle = false;
}
else
{
switch(select)//用戶選擇的數(shù)據(jù)
{
case 1 : {
Person pp = m.InputPerson();
m.Output(pp);
System.out.println(text.edd());
{}//利用輸入方法
};break;//用戶增加人員信息方法
case 2 : {
System.out.println(m.Output());
};break;//瀏覽人員的信息
case 3 : {
Person p = m.Output();
System.out.println(text.modifyText());
p = m.InputPerson();
m.Output(p);
System.out.println(text.edd());
};break;//修改人員的信息
default : {
System.out.println(text.errText());
}
}
}
}
}
}
這個(gè)程序的運(yùn)行結(jié)果如下:



======================================================================================
這僅僅是一個(gè)很簡(jiǎn)單的醫(yī)院掛號(hào)系統(tǒng),雖然涉及到一些C/S架構(gòu)思想,但并沒(méi)有按照C/S架構(gòu)去實(shí)現(xiàn)
還請(qǐng)大家見(jiàn)諒!?。?br />
======================================================================================
**************************************************************************************
首先,新建一些輔助的類。
比如:Patients類,用于存放掛號(hào)的病人;Init類,用于預(yù)先存儲(chǔ)一些病人,這樣就可以方
便的測(cè)試Doctor類;還有一個(gè)Server類,相當(dāng)于一個(gè)服務(wù)器。
**************************************************************************************
Patients類
package Queue;
/**
定義一個(gè)Patients類,這個(gè)類從寫(xiě)了toString方法,可以方便的進(jìn)行輸出!
*/
public class Patients {
private String name;
private String id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
//這里從寫(xiě)了toString方法
public String toString(){
return "病人的ID是: " + this.id + " \n\n病人的姓名是: " + this.name;
}
}
Init類:
package Queue;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
/**
*
* @author toveping
* 向一個(gè)隊(duì)列中加入一些病人,對(duì)醫(yī)生的客戶端進(jìn)行測(cè)試?。?!
*
*
*/
public class Init {
public Map init(String no){
Map<String, LinkedList<Patients>> queueSystem = new HashMap<String, LinkedList<Patients>>();
LinkedList<Patients> patQueue = new LinkedList<Patients>();
for(int i =0;i<20;i++){
Patients p = new Patients();
p.setId(i + "");
p.setName("A" + i);
patQueue.add(p);
}
queueSystem.put(no, patQueue);
return queueSystem;
}
}
Server類:
package Queue;
/**
定義一個(gè)Server類相當(dāng)于服務(wù)器,掛號(hào)客戶端增加一個(gè)病人的話,相應(yīng)的存儲(chǔ)在這里,可以供Doctor調(diào)用?。?!
*/
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
public class Server {
//這是病人的隊(duì)列
Queue<Patients> patQueue = new LinkedList<Patients>();
//String 是醫(yī)生的代號(hào) ;Queue 是病人的隊(duì)列
Map<String, Queue> queueSystem = new HashMap<String, Queue>();
public int serverAdd(String no){
Map<String, LinkedList<Patients>> queueSystem = new HashMap<String, LinkedList<Patients>>();
LinkedList<Patients> patQueue = new LinkedList<Patients>();
Patients p = new Patients();
p.setId(patQueue.size()+"");
patQueue.add(p);
queueSystem.put(no, patQueue);
return patQueue.size();
}
}
**************************************************************************************
下面是掛號(hào)客戶端:
**************************************************************************************
package Queue;
/**
這是一個(gè)掛號(hào)客戶端,對(duì)會(huì)診的病人進(jìn)行掛號(hào),以及方便掛號(hào)的病人容易的掛到自己想要的專家!!!
*/
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class Client {
public static void main(String[] args){
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
shell.setText("專家掛號(hào)系統(tǒng)");
shell.open();
shell.setBounds(190, 100, 800, 600);
final Text txt = new Text(shell,SWT.MULTI);
txt.setBounds(200, 50, 400, 300);
Button firstButton = new Button(shell,SWT.NULL);
firstButton.setText("一號(hào)專家");
firstButton.setBounds(100, 400, 120, 65);
firstButton.addSelectionListener(new SelectionAdapter() {
Server ser = new Server();
int i = ser.serverAdd("1");
public void widgetSelected(SelectionEvent e) {
txt.setText("掛號(hào)成功\n" + "您選的專家是一號(hào)專家\n" + "您前面有" + i + "\n請(qǐng)耐心等待??!");
i++;
}
});
Button secondButton = new Button(shell,SWT.NULL);
secondButton.setText("二號(hào)專家");
secondButton.setBounds(250, 400, 120, 65);
secondButton.addSelectionListener(new SelectionAdapter() {
Server ser = new Server();
int i = ser.serverAdd("2");
public void widgetSelected(SelectionEvent e) {
txt.setText("掛號(hào)成功\n" + "您選的專家是二號(hào)專家\n" + "您前面有" + i + "\n請(qǐng)耐心等待!!");
i++;
}
});
Button thirdButton = new Button(shell,SWT.NULL);
thirdButton.setText("三號(hào)專家");
thirdButton.setBounds(400, 400, 120, 65);
thirdButton.addSelectionListener(new SelectionAdapter() {
Server ser = new Server();
int i = ser.serverAdd("3");
public void widgetSelected(SelectionEvent e) {
txt.setText("掛號(hào)成功\n" + "您選的專家是三號(hào)專家\n" + "您前面有" + i + "\n請(qǐng)耐心等待??!");
i++;
}
});
Button fourthButton = new Button(shell,SWT.NULL);
fourthButton.setText("四號(hào)專家");
fourthButton.setBounds(550, 400, 120, 65);
fourthButton.addSelectionListener(new SelectionAdapter() {
Server ser = new Server();
int i = ser.serverAdd("4");
public void widgetSelected(SelectionEvent e) {
txt.setText("掛號(hào)成功\n" + "您選的專家是四號(hào)專家\n" + "您前面有" + i + "\n請(qǐng)耐心等待??!");
i++;
}
});
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
運(yùn)行結(jié)果如下圖:
**************************************************************************************
最后是Doctor的客戶端:
**************************************************************************************
package Queue;
/**
這里定義了Doctor使用的客戶端,用來(lái)顯示會(huì)診的一些基本信息!
*/
import java.util.LinkedList;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class Doctor {
public static void main(String[] args){
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
shell.setText("醫(yī)生會(huì)診系統(tǒng)");
shell.open();
shell.setMaximized(true);
final Text firsttxt = new Text(shell,SWT.MULTI);
firsttxt.setBounds(100, 50, 200, 300);
Button firstButton = new Button(shell,SWT.NULL);
firstButton.setText("下一個(gè)(一號(hào)專家)");
firstButton.setBounds(150, 400, 120, 65);
firstButton.addSelectionListener(new SelectionAdapter() {
Init aInit = new Init();
LinkedList lin = (LinkedList) aInit.init("1").get("1");
public void widgetSelected(SelectionEvent e) {
firsttxt.setText("\n您正在診斷的病人信息:\n\n" + lin.remove());
}
});
final Text secondtxt = new Text(shell,SWT.MULTI);
secondtxt.setBounds(400, 50, 200, 300);
Button secondButton = new Button(shell,SWT.NULL);
secondButton.setText("下一個(gè)(二號(hào)專家)");
secondButton.setBounds(450, 400, 120, 65);
secondButton.addSelectionListener(new SelectionAdapter() {
Init aInit = new Init();
LinkedList lin = (LinkedList) aInit.init("2").get("2");
public void widgetSelected(SelectionEvent e) {
secondtxt.setText("\n您正在診斷的病人信息:\n\n" + lin.remove());
}
});
final Text thirdtxt = new Text(shell,SWT.MULTI);
thirdtxt.setBounds(750, 50, 200, 300);
Button thirdButton = new Button(shell,SWT.NULL);
thirdButton.setText("下一個(gè)(三號(hào)專家)");
thirdButton.setBounds(800, 400, 120, 65);
thirdButton.addSelectionListener(new SelectionAdapter() {
Init aInit = new Init();
LinkedList lin = (LinkedList) aInit.init("3").get("3");
public void widgetSelected(SelectionEvent e) {
thirdtxt.setText("\n您正在診斷的病人信息:\n\n" + lin.remove());
}
});
final Text fourthtxt = new Text(shell,SWT.MULTI);
fourthtxt.setBounds(1050, 50, 200, 300);
Button fourthButton = new Button(shell,SWT.NULL);
fourthButton.setText("下一個(gè)(四號(hào)專家)");
fourthButton.setBounds(1100, 400, 120, 65);
fourthButton.addSelectionListener(new SelectionAdapter() {
Init aInit = new Init();
LinkedList lin = (LinkedList) aInit.init("4").get("4");
public void widgetSelected(SelectionEvent e) {
fourthtxt.setText("\n您正在診斷的病人信息:\n\n" + lin.remove());
}
});
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
運(yùn)行的結(jié)果如下圖:
**************************************************************************************
讓大家見(jiàn)笑了!
曾以為QQ很神秘
后來(lái)覺(jué)得QQ很簡(jiǎn)單,感覺(jué)無(wú)非就是一個(gè)QQ客戶端發(fā)送一個(gè)消息到服務(wù)器,然后服務(wù)器將消息發(fā)送到指定QQ客戶端
現(xiàn)在把當(dāng)時(shí)想的過(guò)程畫(huà)了下來(lái)
(大家別笑話我啊,當(dāng)時(shí)真的就是這么想的,感覺(jué)很簡(jiǎn)單——其實(shí),當(dāng)自己去實(shí)現(xiàn)的時(shí)候,真的很復(fù)雜!?。。?br />

還寫(xiě)了一些代碼,不過(guò)還不能具體運(yùn)行,僅僅是一個(gè)框架:
我把這些都放在QQ包內(nèi):
*****************************************************************
首先,定義了一個(gè)客戶端接口——可能有點(diǎn)羅嗦,沒(méi)有完全實(shí)現(xiàn)接口的作用
package QQ;
/**
這個(gè)接口的作用是用來(lái)實(shí)現(xiàn)客戶端向服務(wù)器發(fā)送消息的接口。
*/
public interface QQClientInterface {
public void SendServerMessage();
public QQMessage ToFromQQServer();
}
****************************************************************
================================================================
****************************************************************
這是一個(gè)服務(wù)器的接口——貌似和上面的接口重復(fù)了?。?!
package QQ;
/**
用來(lái)實(shí)現(xiàn)QQ服務(wù)器向QQ客戶端發(fā)送消息,和接受QQ客戶端發(fā)送來(lái)的消息
*/
public interface QQServerInterface {
public QQMessage SendMessageToQQClient(String QQName);
public void GetMessageFromQQClient();
}
****************************************************************
================================================================
****************************************************************
這里插入一個(gè)消息類QQMessage
package QQ;
/**
這個(gè)類專門(mén)用來(lái)存放QQClient和QQserver發(fā)送的消息。
*/
public class QQMessage {
private String FromQQName;
private String ToQQName;
public String getFromQQName() {
return FromQQName;
}
public void setFromQQName(String fromQQName) {
FromQQName = fromQQName;
}
public String getToQQName() {
return ToQQName;
}
public void setToQQName(String toQQName) {
ToQQName = toQQName;
}
****************************************************************
================================================================
****************************************************************
下面可以重點(diǎn)~\(≧▽≦)/~啦啦啦
這是QQ客戶端的代碼:
package QQ;
public class QQClient implements QQClientInterface {
private String QQName;
private QQMessage message;
public void SendServerMessage() {
/**
用來(lái)實(shí)現(xiàn)對(duì)QQ服務(wù)器發(fā)送消息(調(diào)用QQ服務(wù)器的接受消息的方法,將消息發(fā)送到服務(wù)器)
*/
}
public QQMessage ToFromQQServer() {
/**
隔一段時(shí)間向服務(wù)器發(fā)送一個(gè)消息,帶有自己QQName的消息,然后QQ服務(wù)器檢索,是否
有消息要傳給這個(gè)QQ,如果有將消息傳過(guò)來(lái),并顯示。
*/
return null;
}
public String getQQName() {
return QQName;
}
public void setQQName(String qQName) {
QQName = qQName;
}
public QQMessage getMessage() {
return message;
}
public void setMessage(QQMessage message) {
this.message = message;
}
}
****************************************************************
================================================================
****************************************************************
最后是服務(wù)器端的代碼:
package QQ;
import java.util.HashMap;
import java.util.Map;
public class QQServer implements QQServerInterface {
Map<String,QQMessage> qqMessage = new HashMap<String,QQMessage>();
public QQMessage SendMessageToQQClient(String QQName) {
/**
QQServer要發(fā)送消息必須滿足兩個(gè)條件:
1. QQ客戶端將自己的QQName發(fā)送給QQServer,然后根據(jù)自己的QQNameQQ服務(wù)器開(kāi)始遍歷qqMessage;
2. qqMessage的Values不是null。
如果QQMessage不為空,則將自己的V發(fā)送給QQName,否則返回Null;
*/
return null;
}
public void GetMessageFromQQClient() {
/**
QQServer接受消息,并將消息存放在qqMessage中
*/
}
}
****************************************************************
****************************************************************
暫時(shí)還沒(méi)寫(xiě)出一個(gè)簡(jiǎn)單QQ程序,大家盡心等待!我一定會(huì)寫(xiě)出一個(gè)讓自己滿意的即時(shí)通訊程序!
所謂的抽象類就是一個(gè)類前加上一個(gè)abstract修飾的類,我覺(jué)得抽象類更像一個(gè)特殊的類,雖然抽象類和類也有些不同之處。
抽象類和類的區(qū)別:
抽象——就是一種具有共同屬性的集體概括。
抽象類中可以有抽象方法,也可以其他的方法及屬性;
抽象類和類的最大區(qū)別在于: 抽象類可以有抽象方法,但類中一定沒(méi)有抽象方法,只要一個(gè)類有抽象方法那么這個(gè)類一定是抽象方法,抽象方法
是由abstract修飾的方法,但在抽象類中并沒(méi)有去定義這個(gè)方法,這個(gè)抽象方法必須在它的子類中得到定義——這是必須的! 從這里可以看出,
抽象類的作用是建立在繼承之上的。
另外需要注意的是:抽象類中不一定有抽象方法,但有抽象方法的類一定是抽象類!
繼承抽象類的子類,必須實(shí)現(xiàn)父類(這是抽象類)中所有的抽象方法!
其他的,抽象類和普通的類沒(méi)有區(qū)別!
暫且不舉例子,胃痛,今天就到這里!實(shí)在撐不住了!
this 相當(dāng)于本類,說(shuō)白了就是“自己的”。
super 指的是父類,說(shuō)白了就是自己繼承的類。
面向?qū)ο蟮娜筇卣魇牵悍庋b,繼承和多態(tài)!
封裝:
所謂的封裝就是將類包裝起來(lái),可以理解為 將一個(gè)類包裝成一個(gè)黑箱子,外部對(duì)內(nèi)部是不可見(jiàn)的!
但這個(gè)箱子(封裝的類)有若干個(gè)接口,這些接口可以向這個(gè)黑箱子傳送一些數(shù)據(jù),這個(gè)箱子做一些處理,然后從另外的接口(也可以從輸入的接
口)接受處理完的信息。
說(shuō)白了,封裝就是將一個(gè)類包裝起來(lái),使類內(nèi)部數(shù)據(jù)對(duì)外不可見(jiàn),這樣的話,這個(gè)類就更安全了!只要你從一個(gè)接口輸入信心,就可以從另外的接口(也可以從輸入的接口)接受你想要的處理完的數(shù)據(jù)!
繼承:
所謂的繼承就是將一個(gè)父類(被繼承的類)的全部(包括屬性和方法)包含在子類(繼承的類)中,這樣做可以減少代碼量,同時(shí)也可以將
具有某些相同屬性的類,先寫(xiě)出一個(gè)父類,然后繼承,在子類中,子類可以有自己的屬性和方法。
舉一個(gè)很經(jīng)典的例子:
父類就相當(dāng)于你的父親,子類就相當(dāng)于你。(基因就相當(dāng)于類中方法,屬性就是你的姓名啊等等)你父親的基因你都有,但你又從你
母親那繼承了很多基因,但在JAVA中只允許單程繼承,也就是你有且只有一個(gè)父類,但子類中確包含了父類中沒(méi)有的屬性和方法,你可以這么理
解,就是你繼承了你“母類”屬性和方法——注意:JAVA中并沒(méi)有“母類”。
多態(tài):
多態(tài)是什么呢? 多態(tài)多態(tài)就是有很多狀態(tài)。
比如還拿上面那個(gè)經(jīng)典的例子來(lái)說(shuō),父類中的方法你也有,但你可以將這個(gè)方法的執(zhí)行過(guò)程按照自己的方式寫(xiě)出來(lái)!這樣呢,這個(gè)方法才真
正屬于你(舉個(gè)小例子:就是你的父親可以吃飯,你也可以吃飯,但你們喜歡吃什么,喜歡怎么吃,吃多少,肯定不一樣?。T谧宇愔幸獜膶?xiě)
自己的方法,子類中方法的名字,參數(shù)以及參數(shù)屬性的順序必須相同。
另外,還有一種多態(tài)形式是表現(xiàn)在一個(gè)類中的構(gòu)造方法,他們的方法名肯定相同且和子類的類名相同,但構(gòu)造方法的參數(shù)個(gè)數(shù),順序和類型必須
有一樣是不相同的!
按我目前的理解,僅僅能解釋成這樣!如果以后有新的理解,一定會(huì)更新這篇博客!
這是一個(gè)用SWT做的用戶登陸程序:
----------------------可視化用戶登陸系統(tǒng)----------------------------
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class Swt_Check {
public static void main(String[] args) {
Display mianWindow = new Display();
//創(chuàng)建一個(gè)主窗口
final Shell window = new Shell();
//打開(kāi)主窗口大小
window.setBounds(30, 75, 300, 400);
//設(shè)置主窗口的標(biāo)題
window.setText("登陸界面");
//創(chuàng)建觸發(fā)按鈕以及按鈕的顯示文字和大小位置
Button surebutton = new Button(window,SWT.NONE);
Button nosurebutton = new Button(window,SWT.NONE);
surebutton.setText("確定");
nosurebutton.setText("取消");
surebutton.setBounds(160, 235, 75, 30);
nosurebutton.setBounds(60, 235, 75, 30);
//創(chuàng)建輸入Text框及其位置
final Text nameText = new Text(window,SWT.NONE);
final Text passNumber = new Text(window,SWT.PASSWORD);
nameText.setBounds(100, 100, 110, 20);
passNumber.setBounds(100, 160, 110, 20);
//創(chuàng)建標(biāo)簽
Label nameLabel = new Label(window,SWT.NONE);
nameLabel.setText("賬號(hào):");
nameLabel.setBounds(60, 105, 40,20);
Label passLabel = new Label(window,SWT.NONE);
passLabel.setText("密碼:");
passLabel.setBounds(60, 165, 40, 20);
//輸入后單擊確定后的操作
surebutton.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
//創(chuàng)建一個(gè)adm數(shù)組
Admin[] admin = new Admin[3];
//實(shí)例化三個(gè)賬號(hào)
admin[0] = new Admin("admin", "admin");
admin[1] = new Admin("admin1", "pastNumber");
admin[2] = new Admin("admin2", "pastNumber");
//新建一個(gè)布爾型和整型數(shù)據(jù),布爾值 用于判斷,整型判斷是那個(gè)賬號(hào)登陸
boolean past = false;
int pastN = 0;
//判斷賬號(hào)密碼是否正確
for(int i=0;i<admin.length;i++){
if(admin[i].getName().equals(nameText.getText())&&admin[i].getPastNumber().equals(passNumber.getText())){
past = true;
pastN = i;
break;
}
}
//輸出賬號(hào)密碼是否正確
if(past){
//從新打開(kāi)一個(gè)界面輸出歡迎用戶
Shell welWindow = new Shell(window);
welWindow.setBounds(120, 130, 450, 200);
Label welText = new Label(welWindow,SWT.NONE);
welText.setText("歡迎 " +admin[pastN].getName() + "用戶登陸!");
welText.setBounds(140, 60, 180, 90);
welWindow.open();
}
else{
Shell noPassWindow = new Shell(window);
noPassWindow.setBounds(120, 130, 450, 200);
Label noPassText = new Label(noPassWindow,SWT.NONE);
noPassText.setText("對(duì)不起,您輸入的賬號(hào)或密碼有誤!");
noPassText.setBounds(140, 60, 180, 90);
noPassWindow.open();
}
}
}
);
nosurebutton.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){{
window.close();
}}});
//打開(kāi)窗體
window.open();
while(!window.isDisposed()){//如果主窗體沒(méi)有關(guān)閉則一直循環(huán)
if(!mianWindow.readAndDispatch()){//如果display不忙
mianWindow.sleep();//休眠
}
}
mianWindow.dispose();
}
}
class Admin{
private String name;
private String pastNumber;
Admin(String name, String pastNumber){
this.name = name;
this.pastNumber = pastNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPastNumber() {
return pastNumber;
}
public void setPastNumber(String pastNumber) {
this.pastNumber = pastNumber;
}
}
=========================程序的運(yùn)行結(jié)果如下==============================
打開(kāi)時(shí),用戶的登陸界面
當(dāng)輸入的賬號(hào)密碼都正確時(shí):
當(dāng)密碼或者賬號(hào)不正確:
希望這個(gè)程序?qū)Υ蠹矣兴鶐椭?br />
-----------------------用戶登陸原----------------------------
public class Check {
public static void main(String[] args) {
//創(chuàng)建一個(gè)adm數(shù)組
Admin[] adm = new Admin[3];
//三個(gè)賬號(hào)
adm[0] = new Admin("admin", "pastNumber");
adm[1] = new Admin("admin1", "pastNumber");
adm[2] = new Admin("admin2", "pastNumber");
//使用標(biāo)準(zhǔn)輸入流函數(shù),從鍵盤(pán)輸入一些信息
Scanner scan = new Scanner(System.in);
System.out.println("請(qǐng)輸入你的賬號(hào):");
//將輸入的賬號(hào)放入putName
String putName = scan.next();
System.out.println("請(qǐng)輸入你的賬號(hào)密碼:");
//將輸入的密碼放入普通putPassNumber中
String putPassNumber = scan.next();
//新建一個(gè)布爾型和整型數(shù)據(jù),布爾值 用于判斷,整型判斷是那個(gè)賬號(hào)登陸
boolean past = false;
int pastN = 0;
//判斷賬號(hào)密碼是否正確
for(int i=0;i<adm.length;i++){
if(adm[i].getName().equals(putName)&&adm[i].getPastNumber().equals(putPassNumber)){
past = true;
pastN = i;
break;
}
}
//輸出賬號(hào)密碼是否正確
if(past){
System.out.println("歡迎" + adm[pastN].getName() + "登陸");
}
else{
System.out.println("輸入有誤,請(qǐng)正確輸入你的賬號(hào)和密碼!");
}
}
}
class Admin{
private String name;
private String pastNumber;
Admin(String name, String pastNumber){
this.name = name;
this.pastNumber = pastNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPastNumber() {
return pastNumber;
}
public void setPastNumber(String pastNumber) {
this.pastNumber = pastNumber;
}
}
運(yùn)行結(jié)果為:
當(dāng)密碼或者賬號(hào)不正確的時(shí)候輸出結(jié)果是: