杨芳萍等
摘 要:在Windows环境下搭建的Android平台上,以Eclipse 为开发工具,应用Android网络组件包模拟浏览器的行为,向我校的教务管理系统服务器提交一个请求,服务器接到该请求后进行处理并返回一个HTML页面,然后利用Jsoup解析这个HTML页面,从中获得用户想要的数据并显示到App中,从而实现直接使用手机App方便快捷查询的功能。
关键词:Android ;SDK ;Jsoup ;Eclipse ;便捷查询
中图分类号:TP212 文献标识码:A 文章编号:2095-1302(2015)04-00-03
0 引 言
在21世纪的今天,互联网已深入到世界的各个角落,而WAP技术的发展和无线业务的成熟,为人们获取各种信息提供了除Internet之外的另一种便捷的途径。考生成绩的查询方式经历了传统书信通知、电话查询、网上查询和手机短信查询阶段,其中以网上查询方式最为经济。当前,虽然Internet达到了前所未有的普及,但其终究受到“有线入户”的限制,在广大的农村、不发达地区以及学校学生宿舍还不能很方便的实现上网,而目前的无线通信网络几乎覆盖了全国每个角落,,只要有一部具有WAP功能的手机,就可以不受时间、地域和设备的限制,轻松获取到学生的考试成绩。
Android是一个开放的手机平台,从Android的发布到其推广,以惊人的速度在短短的时间内,占据了大量的智能手机市场,而且将继续扩大其用户量。因此,开发基于Android的成绩查询系统有其深远的意义。
1 系统主要功能模块设计与实现
1.1 成绩查询模块
先进行第一次连接服务器,拿到服务器返回的__VIEWSTATE字段的值,然后使用这个字段的值再进行成绩查询操作。
publicclass QueryScore {
public File queryScore(String uid , String name , HashMap
String score_info = null;
File file = new File(“查询成绩完成.html");
String url = “http://jwgl.ldxy.edu.cn/xscj_gc.aspx?xh=”+uid+”&;xm=”+name+”&;gnmkdm=N121605”;
//System.out.println(url);
Connection conn = Jsoup.connect(url);
//conn1:第一次连接
conn.timeout(30000);
conn.data(“Button1”, “按学期查询");
conn.header(“Connection”, “keep-alive”);
conn.header(“Host”, “jwgl.ldxy.edu.cn”);
conn.data(“Accept”, “image/png,image/*;q=0.8,*/*;q=0.5”);
conn.data(“gnmkdm”,”N121605”);
conn.data(“ddlXN”, “”);
conn.data(“ddlXQ”, “”);
conn.referrer(“http://jwgl.ldxy.edu.cn/xs_main.aspx?xh=”+uid);
conn.cookies(cookies);
String __VIEWSTATE = “”;
try {
Document doc1 = conn.post();
score_info = doc1.toString();
File temp_file = new File(“查询成绩开始.html");
FileOutputStream fos = new FileOutputStream(temp_file);
fos.write(doc1.toString().getBytes());
fos.close();
__VIEWSTATE = ParserHTML.analysis__VIEWSTATE(temp_file);
} catch (IOException e) {
//e.printStackTrace();
System.out.println(“错误:IOException e1");
returnnull;
}
conn.data(“__VIEWSTATE”, __VIEWSTATE);
try {
Document doc = conn.post();
score_info = doc.toString();
FileOutputStream fos = new FileOutputStream(file);
fos.write(doc.toString().getBytes());
fos.close();
} catch (IOException e) {
//e.printStackTrace();
System.out.println(“错误:IOException e2");
returnnull;
}
return file;
}}
1.2 查看/选择选修课模块
使用cookies和__VIEWSTATE直接获取所有可选选修课列表,并呈献给用户浏览。
publicclass EnrollOptionalCourse {
private String __VIEWSTATE;
public List
ArrayList
Connection c = Jsoup.connect(“http://jwgl.ldxy.edu.cn/xf_xsqxxxk.aspx?xh=”+uid+”&xm=”+name+”&gnmkdm=N121203”);
c.timeout(30000);
c.header(“Host”, “jwgl.ldxy.edu.cn”);
c.referrer(“http://jwgl.ldxy.edu.cn/xf_xsqxxxk.aspx”);
c.data(“__EVENTARGUMENT”, “”);
c.data(“__EVENTTARGET”, “dpkcmcGrid:txtPageSize”);
c.data(“__VIEWSTATE”, “”);//过长,不再给出
c.data(“Button1”, “提交");
c.data(“ddl_kcgs”, “”);
c.data(“ddl_kcxz”, “”);
c.data(“ddl_sksj”, “”);
c.data(“ddl_xqbs”, “2”);
c.data(“ddl_ywyl”, “有");//有无余量
c.data(“dpkcmcGrid:txtChoosePage”, “1”); //跳转到页
c.data(“dpkcmcGrid:txtPageSize”, “200”);//每页显示条
c.data(“TextBox1”, “”); //根据课程名称查询
c.cookies(cookies);
Document doc;
try {
doc = c.post();
System.out.println(“第一次得到的响应内容长度 "+doc.toString().length());
File temp_file = new File(“C:\\查询选修课开始.html");
FileOutputStream fos = new FileOutputStream(temp_file);
fos.write(doc.toString().getBytes());
fos.close();
__VIEWSTATE = ParserHTML.analysis__VIEWSTATE(new File(“C:\\查询选修课开始.html"));
Iterator
oclist = new ArrayList
int course_count = 1 ; //用于记录可选选修课的条数 while(it_tr.hasNext()){
Element e_tr = it_tr.next();
Iterator
OptionalCourse oc = new OptionalCourse();
oc.setKcmcGrid(course_count+++””);
int i = 0 ;
while(it_td.hasNext()){ Element e_td = it_td.next();
String td_content = e_td.html();
if((td_content.contains(“”))){
int index = 0 ;
index = td_content.indexOf(‘>);
td_content = td_content.substring(index+1);
td_content = td_content.replaceAll(“
”, “”);} if(((td_content.contains(“”)))){ int index = 0 ;
index = td_content.indexOf(“/>”);
td_content = td_content.substring(index+2); }
if(“ ;”.equals(td_content)){td_content = “” ;}
if(td_content.contains(“{第..")){
td_content = td_content.substring(0, td_content.indexOf(“{第.."));}
switch (i++) {
case 1: oc.setOcname(td_content) ;break; case 2: oc.setOcid(td_content) ;break; case 3: oc.setOcteacher(td_content) ;break; case 4: oc.setOctime(td_content) ;break;
case 5: oc.setOcpace(td_content) ;break;
case 6: oc.setOcredit(td_content) ;break;
case 7: oc.setOcweektimes(td_content) ;break;
case 8: oc.setOcweekstart(td_content) ;break;
case 9: oc.setOcsize(td_content) ;break;
case 10:oc.setOcallowance(td_content) ;break;
case 11: oc.setOckcgs(td_content) ;break;
case 12: oc.setOcproperty(td_content) ;break;
case 13: oc.setOcschoolid(td_content) ;break;
case 14: oc.setOckkxy(td_content) ;break;
case 15: oc.setExamtime(td_content) ;break; }}
oclist.add(oc);}
} catch (IOException e) {e.printStackTrace();}
// choiceOptionalCourse(cookies, uid, name);
return oclist;}
2 结 语
我校的教务管理系统因为考虑到数据安全的问题,并没有给用户提供一个查询接口,但是,因为该系统是接入Internet网络,所以,就可以利用教务系统使用Web浏览器查询信息的原理,用户登录后选定自己所需的功能,然后向服务器提交一个表单,服务器经过处理后再返回给用户一个包含用户所需信息的HTML页面。那么,我们就可以应用这一原理,模拟浏览器的行为,也像浏览器一样,提交给服务器一个请求,服务器处理完返回一个HTML文件,然后我们再解析这个HTML文件,从中拿到我们想要的数据并显示到App中,从而实现直接使用手机App查询信息的功能。故开发基于Android平台的手机查询系统替代传统教务管理系统的信息查询是很有必要的,也是很有市场的。
参考文献
[1]王向辉,张国印,沈洁. Android 应用程序开发[M]. 北京: 清华大学出版社,2010.
[2]李金霖,赖超,龙曦,等.基于Android平台的手机日程管理系统[J].计算机与数字工程,2003,39(3):65-68,137.
[3]杨丰盛. Android应用开发揭秘[M].北京:机械工业出版社,2010.
[4]姚立旻,刘卫国. Android 的架构与应用开发研究[J]. 计算机系统应用,2008(11):110-113.
[5]耿东久,索岳,陈渝,等.基于Android手机的远程访问和控制系统[J].计算机应用研究,2011,31(2):559-561.
[6]张正政,林耀荣.基于Android系统的影音播放器开发[J].现代电子技术,2011,34(2):5-8.
[7]叶达峰. Eclipse编程技术与实例[M].北京:人民邮电出版社,2006.