解析一个页面,是一个程序员的基本功,下面这个例子将介绍解析一个页面的具体方法;这个例子是一个比较特殊的例子,这里的页面不是一个标准的页面,而是一个在浏览器打开的内部的小系统,具体的含义都下载代码的注释中,代码如下:
package test;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fxrj.security.model.NoticeList;
import com.fxrj.security.model.PageInfo;
import com.platform.common.constants.OtherSystemBingdingUrl;
import com.platform.common.util.Base64EncodeAndDecode;
import com.platform.common.util.EncoderByMd5;
import com.platform.http.RequestContext;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Created by Administrator on 2017/8/21 0021.
*/
//todo
public class TestNoticeList {
public static void main(String[] args) {
RequestContext requestContext = new RequestContext();
try{
//模拟登录
String name="111";
String password="222";
//Base64加密
String nameBase64= Base64EncodeAndDecode.encode(name);
//MD5处理加密唯一编码
String passwdMD5 = EncoderByMd5.encodeByMd5(password).toUpperCase();
String params =basicUrl+"\"&_m=loginByEncode&_p0=\""+nameBase64+"\"&_p1=\""+passwdMD5+"\"";
//链接
Connection.Response response = Jsoup.connect(OtherSystemBingdingUrl.SECURITY_LOGIN)
.header("Content-Type","application/x-www-form-urlendoced")
.header("X-Request-With","XMLHttpRequest")
.requestBody(params)
.method(Connection.Method.POST)
.execute();
//获取原网页的cookies
Map<String,String> cookies= response.cookies();
requestContext.cookies(cookies);
//需要访问的具体页面地址
String url=basicUrl2+"?&p=1EAB1808-1343-4D98-8381-C8B6586C2CD8";
//requstContext中的resquestBody中放入的参数;
String resBody=basicUrl3+"&_m=getListData&_p0=\"\"&_p1=\"1EAB1808-1343-4D98-8381-C8B6586C2CD8\"&_p2=5&_p3=\"F2DA902D-B732-41D3-8DD3-B4232C4CB128\"&_p4=\"BT ASC,SHOWORDER ASC,SHEETID ASC\"&_p5=null&_p6=1&_p7=15";
//用Jsoup解析原网址(及各个参数)
Document doc = Jsoup.connect(url)
.header("Content-Type","application/x-www-form-urlencoded")
.header("X-Requested-With","XMLHttpRequest")
.cookies(requestContext.cookies())
.requestBody(resBody)
.post();
//JSON解析
String jsonString = doc.body().html();
//用正则表达式来解析获取的jsonString(方法已封装)
List<String> noticeListstr = OtherSystemBingdingUrl.extractMessageByRegular(jsonString);
//创建一个List容器来装列表中解析出来的一个个对象;
List<NoticeList> noticeLists = new ArrayList<>();
for (String s:noticeListstr) {
//创建一个空对象,来装从列表中解析出来的一个个对象;仅仅当做瓢用,做舀水动作,运输作用,没有实际存储的作用;放在for循环里面,每次清空
NoticeList nl = new NoticeList();
//JSON将String类型的,具有Json格式的s,解析(parse)出来的对象是Object类型的,需要强制转换成JSONObject格式;
JSONObject jsonObject = (JSONObject) JSON.parse(s);
System.out.println(jsonObject);
//这里jsonObject可以通过get()方法,使用键来获取josn内的值;然后一个一个set给我们的实体类nl(瓢)
nl.setSHEETSTATUSNAME((String)jsonObject.get("SHEETSTATUSNAME"));
nl.setCREATEDEPT((String) jsonObject.get("FXR"));
nl.setEDITUSERID((String) jsonObject.get("EDITUSERID"));
nl.setLASTOPENTIME((String) jsonObject.get("LASTOPENTIME"));
nl.setCREATEORG((String) jsonObject.get("CREATEORG"));
nl.setDATASTATUSID((String) jsonObject.get("DATASTATUSID"));
nl.setCREATEDEPTID((String) jsonObject.get("CREATEDEPTID"));
nl.setBT((String) jsonObject.get("BT"));
nl.setDATASTATUSID((String) jsonObject.get("DATASTATUSID"));
nl.setCREATEUSER((String) jsonObject.get("CREATEUSER"));
nl.setFLOWID((String) jsonObject.get("FLOWID"));
nl.setBZ((String) jsonObject.get("BZ"));
nl.setSHEETID((String) jsonObject.get("SHEETID"));
nl.setFLOWNODEID((String) jsonObject.get("FLOWNODEID"));
nl.setFLOWOBJECTID((String) jsonObject.get("FLOWOBJECTID"));
nl.setEDITUSER((String) jsonObject.get("EDITUSER"));
nl.setROW_INDEX((String) jsonObject.get("ROW_INDEX"));
nl.setBM((String) jsonObject.get("BM"));
nl.setOPENERID((String) jsonObject.get("OPENERID"));
nl.setFLOWNODENAME((String) jsonObject.get("FLOWNODENAME"));
nl.setWJ((String) jsonObject.get("WJ"));
nl.setSHEETNAME((String) jsonObject.get("SHEETNAME"));
nl.setSHOWORDER((String) jsonObject.get("SHOWORDER"));
nl.setCREATEDEPTID((String) jsonObject.get("CREATEDEPTID"));
nl.setWJID((String) jsonObject.get("WJID"));
nl.setOPENER((String) jsonObject.get("OPENER"));
nl.setCREATEUSERID((String) jsonObject.get("CREATEUSERID"));
nl.setDATATYPE((String) jsonObject.get("DATATYPE"));
nl.setTXR((String) jsonObject.get("TXR"));
nl.setCREATEDATE((String) jsonObject.get("CREATEDATE"));
nl.setTXSJ((String) jsonObject.get("TXSJ"));
nl.setFLOWID((String) jsonObject.get("FLOWID"));
nl.setCREATEORGID((String) jsonObject.get("CREATEORGID"));
nl.setSHEETSTATUSID((String) jsonObject.get("SHEETSTATUSID"));
nl.setFILEURL(basicJsp+"?fileid="+nl.getWJID());
//当nl的所有局部变量都设置好了以后,一个完整的,有值的nl对象就装载完毕了,然后我们给放到List(容器)中;
//这里就像用集装箱装东西,对象就是集装箱,我们把货物(各个局部变量,就是上面不断get,set的每一行)放到集装箱nl中,等集装箱装满了
//我们再把集装箱放到货轮上,货轮上有好多集装箱,唯一的区别是,集装箱是不重复使用,而这里的nl是像瓢一样,重复使用;
noticeLists.add(nl);//装载上船
}
//解析包含页面信息的Json;
List<String> PageLists = OtherSystemBingdingUrl.extractMessageByRegular2(jsonString);
//List<PageInfo> pageInfoList= new ArrayList<>();
PageInfo pl = new PageInfo();
for(String s1 :PageLists){
JSONObject jsonObject2 = (JSONObject) JSON.parse(s1);
pl.setTableId((String) jsonObject2.get("tableId"));
pl.setTableName((String) jsonObject2.get("tableName"));
pl.setDataSourceName((String) jsonObject2.get("dataSourceName"));
pl.setDataUserName((String) jsonObject2.get("dataUserName"));
pl.setPageIndex((Integer) jsonObject2.get("pageIndex"));
pl.setRowsCount((Integer) jsonObject2.get("rowsCount"));
pl.setPageCount((Integer) jsonObject2.get("pageCount"));
pl.setCurrentRowCount((Integer) jsonObject2.get("currentRowCount"));
}
}catch (Exception e){
e.printStackTrace();
}
}
}