📄 5.+
字号:
软件设计详细说明书
1. 引言
1.1 编写目的
将概要设计进行细化,产生与源代码的直接映像
1.2 背景
无
1.3 定义
1.4 参考资料
《软件工程》,电子工业出版社
2. 程序(模块)系统的组织结构
JSApplet
SearchThread
3. 模块JSApplet设计说明
3.1 模块JSApplet描述
用于人机交互。所有的界面显示。所有的用户操作及软件对用户操作的响应主要在这上面进行。
用于存放全局变量。在这里全局变量作为通讯的一种重要手段,因为在这里使用的是Applet,所以所有的全局变量其实可以看作是Applet上的一个对象供其它对象直接存储。
3.2 功能
见描述
3.3 性能
无
3.4 输入项
搜索串
选择的引擎
3.5 输出项
JSApplet的响应
3.6 算法
定义了下列方法用于调用:
//JSApplet初始化
public void init()
//设置按钮状态,在init()中使用。
void controlSetting()
//从输入文件JSENGINES.TXT中整理出搜索引擎的信息
Hashtable getEngData()
//从输入文件JSENGINES.TXT中整理出搜索引擎的类别(间接通过getEngData()取得。)
Vector getEngCateg(Hashtable engData)
//按钮状态设定
static void buttonStatus(int Status)
//搜索引擎类别选择
void categorySelect()
//改变语言
void changeLanguage(int languageIndex)
//PREVIEW-STATUS-MESSAGES的显示状态切换
void switchPSM(boolean p, boolean s, boolean m)
//ENGINES&OPTIONS&ABOUT的显示状态切换
void switchEOA(boolean e, boolean o, boolean a)
//清除所有显示
void clearAll()
//开始搜索
void startSearch()
//停止搜索
void stopSearch()
//新建搜索
void newSearch()
3.7 流程逻辑
初始化:
//取得搜索引擎信息
engDataTable = getEngData();
engDataCateg = getEngCateg(engDataTable);
//设置控件
controlSetting();
//加入事件监听器
开启搜索:
for (Enumeration en = engDataTable.elements(); en.hasMoreElements();) {
engDtl = (EnginesDetails)(en.nextElement());
if ((engDtl.name).equals(enginesSelected[srchNo])) {
//将srchChain中的"^"置换成待搜索的字串
srchChainConverted = "";
StringReader strIn = new StringReader(engDtl.srchChain);
while (strIn.read(singleChar,0,1) != -1) {
if (singleChar[0] == '^') {
srchChainConverted += URLEncoder.encode(containingTf.getText().trim());
} else {
srchChainConverted += singleChar[0];
}
}
strIn.close();
//准备搜索线程
srchThread[srchNo] = new SearchThread(srchChainConverted, engDtl.srchBlkB, engDtl.srchBlkE, engDtl.name, srchNo);
//在STATUS中加入信息
statusLi.add("Starting Search From " + engDtl.name + " ...");
//如果已经达到了实际的搜索数,就退出。
if (++srchNo >= actualSearchAllowed) break;
}
}
//开始搜索
for (srchNo = 0; srchNo < actualSearchAllowed; srchNo ++) {
//启动搜索线程
srchThread[srchNo].start();
}
3.8 接口
//公共全局量定义/JSApplet对外的接口
static Hashtable resultTable = new Hashtable(); //结果集,包括网址、{主题、预览},通过网址进行定位
static Vector resultIndex = new Vector(); //结果集,仅包括网址,但可以快速使用elementAt(int)进行定位,并确定网址
static boolean _stop = false; //用标志让线程结束,而不是用stop()!
static int actualSearchAllowed = 0; //实际应打开的线程数,并用于SearchThread的计数器
//SEARCH
static TextField containingTf = new TextField("");
static Button findNowBu = new Button("");
static Button stopBu = new Button("");
static Button newSearchBu = new Button("");
//RESULTS
static List resultLi = new List();
static Label totalNumLa = new Label("0");
//PSM
static TextArea previewTe = new TextArea("",0,0,TextArea.SCROLLBARS_VERTICAL_ONLY);
static List statusLi = new List();
static TextArea messageTe = new TextArea();
//OPTIONS
static Choice smcCh = new Choice();
static Choice smlCh = new Choice();
static Choice valurlCh = new Choice();
static Choice languageCh = new Choice();
static Choice webBrowCh = new Choice();
static TextField webBrowPTf = new TextField();
3.9 存储分配
//搜索引擎详细信息
class EnginesDetails {
String name; //搜索引擎名称
String category; //搜索引擎类别
String srchChain; //搜索串
String srchBlkB; //信息块开始
String srchBlkE; //信息块结束
}
//搜索结果详细信息
class ResultsDetails {
String title; //主题
String preview; //预览
}
4. 模块SearchThread设计说明
4.1 模块SearchThread描述
用于与Internet通信的接口。
JSApplet信息的来源。
4.2 功能
见描述
4.3 性能
用较快的速度,稳定的搜索结果并进行分析
4.4 输入项
this.srchChainConverted = srchChainConverted;
this.srchBlkB = srchBlkB;
this.srchBlkE = srchBlkE;
this.srchEngName = srchEngName;
this.srchNo = srchNo;
4.5 输出项
搜索到的网址,并在JSApplet.ResultLi上显示。
4.6 算法
主要是对搜索信息块进行分析,有如下方法:
//核心搜索线程
public void run()
//用传入的变量对类中的变量进行赋值
public SearchThread(String srchChainConverted, String srchBlkB, String srchBlkE, String srchEngName, int srchNo)
//向前推进一个字符
boolean stepOneChar()
//分析信息块
void analyseBlock()
//网址有效性验证
boolean validUrl()
//格式化结果集
String formatString(String unFmtStr, int width)
//显示结果信息
void showResult()
4.7 流程逻辑
for (int level=0; level < Integer.valueOf(JSApplet.smlCh.getSelectedItem()).intValue() && !JSApplet._stop; level++) {
//用级数处理搜索串
srchChainConvertedWithLevel = srchChainConverted.replace('`',(char)(48+level));
//打开搜索的页面流
inURLStream = new BufferedReader(new InputStreamReader((new URL(srchChainConvertedWithLevel)).openStream()));
//推进
while (stepOneChar()) {
//找到信息块的开始:srchBlkB
if (matchString.equals(srchBlkB)) {
//准备收集信息
resultDtlHead = "";
resultDtlBody.title = "";
resultDtlBody.preview = "";
//对信息块进行分析,并取出URL,TITLE,PREVIEW
analyseBlock();
//将最后一个非结果集排除,因为最后一个信息块的结束不可能也是页面的结束。或如果当页已结束则退出。
if (!stepOneChar()) break;
//适当休眠,让PREVIEW有办法进行!且让其它搜索线程有办法进行!并让死锁有时间释放。并且如果有多个线程,这0.1秒的重叠后也就不算什么了。
Thread.sleep(100);
//对所得到的结果进行网址有效性验证
if (JSApplet.valurlCh.getSelectedItem().equals("Yes")) {
if (!validUrl()) break; //如果验证不通过,则不将这个URL记入/显示。
}
//将结果存放并显示
showResult();
} //if
} //while
//关闭流
inURLStream.close();
4.8 接口
this.srchChainConverted = srchChainConverted;
this.srchBlkB = srchBlkB;
this.srchBlkE = srchBlkE;
this.srchEngName = srchEngName;
this.srchNo = srchNo;
4.9 存储分配
//要搜索的内容
String srchChainConverted;
//当前搜索线程的序号
int srchNo;
//搜索引擎的基本信息
String srchBlkB, srchBlkE, srchEngName;
//定义搜索当中要用到的变量
String srchChainConvertedWithLevel; //加入Level后的搜索串
BufferedReader inURLStream;
char matchChars[] = {' ', ' ', ' ', ' '}; //将与标志相符的字符
char singleChar[] = {' '}; //每次取得的字符
String matchString; //用作matchChars到String的转化。
int resultCount = 0; //当前线程找到的结果
//准备搜集的信息
String resultDtlHead = new String(); //用于存放结果集中的URL
ResultsDetails resultDtlBody = new ResultsDetails(); //用于存放主题和预览
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -