⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 5.+

📁 jSearch - turns search Engines into FIND engines - Programming in JAVA Copyright (C) 1999-2009 Hun
💻 +
字号:
软件设计详细说明书

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 + -