📄 详细分析四.txt
字号:
delsCompleted: function(res) {
resText = res.responseText;
var jsonMsgObj = new JsonMsgObj(resText);
var codeid = jsonMsgObj.getCodeid();
alert(jsonMsgObj.getMessage());
if (codeid == "0") {
refreshBoxNum("inbox",-this.noteNum);//注意-代表是在原来的 num_span = document.getElementById("inboxNumDiv");中减去this.noteNum数量!
var url = getActionMappingURL("/note?action=inbox&ajax=shtml&page=" + this.pageNum);//还是这页!
loadNoteInboxUrl(url);
}
}
};
-->
function loadNoteInboxUrl(url) {
$('noteListDiv').innerHTML = pageLoadingCenter;
var urls = getActionName(url);
var pars = getActionPars(url);
var myAjax = new Ajax.Updater("noteListDiv", urls, {method: 'get', parameters: pars});
showInboxNum();
showOutboxNum();
}
而getActionName和getActionPars两个函数在comm.js中:
function getActionName(url) {
var question = url.indexOf("?");
if (question > 0) {
return url.substring(0, question);
}
else {
return url;
}
}
function getActionPars(url) {
var question = url.indexOf("?");
if (question > 0) {
return url.substring(question+1, url.length);
}
else {
var d = new Date();
var t = d.getTime();
return "timestamp="+t;
}
}
这里用了个bbscs:pages <bbscs:pages value="%{pageList.pages}" javaScript="loadNoteInboxUrl"/>我们分析下,这个子tag的属性可真多,不过只有value必须有,其它可不用:
<tag>
<name>pages</name>
<tag-class>com.laoer.bbscs.web.taglib.PageTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>styleClass</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>argPage</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>argTotal</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>pageSep</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>javaScript</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
我们看PageTag.java:
protected void populateParams() {
super.populateParams();
Page tag = (Page) component;
tag.setArgPage(argPage);
tag.setArgTotal(argTotal);
tag.setJavaScript(javaScript);//OK!
tag.setPageSep(pageSep);
tag.setStyleClass(styleClass);
tag.setValue(value);//OK!
}
我们进入com.laoer.bbscs.web.taglib包里面的Page.java:
protected String styleClass = ""; //显示格式
protected String argPage = "page";//页参数名称
protected String argTotal = "total";//总页参数名称
protected int pageSep = 10;//一页显示的数量
protected String javaScript = "";//用的javascript
private String value;//%{pageList.pages} -->Pages pages = (Pages) this.getStack().findValue(value);
// 一行显示页数
int pagesep = this.pageSep;
// 总行数
int allpagesep = (int) Math.ceil((pages.getAllPage() + pagesep - 1) / pagesep);
// 当前行数
int cpagesep = (int) Math.ceil((pages.getCpage() + pagesep - 1) / pagesep);
// 当前一行显示页数
int cnum;
if (pages.getAllPage() > 0) {
// 在页中
if (cpagesep != allpagesep) {
cnum = pagesep;
}
// 页末
else {
cnum = pages.getAllPage() % pagesep;
// 正好整除
if (cnum == 0) {
cnum = pagesep;
}
}
} else {
cnum = 0;
}
String fileName = pages.getFileName();
StringBuffer sb = new StringBuffer();
其实这个public boolean start(Writer writer)方法中主要根据pages.isUseUrlRewrite()和this.javaScript分四种情况来讨论这个分页的写法的。下面是本次调用所使用的部分:
sb.append("<span");
if (StringUtils.isNotBlank(this.styleClass)) {//有没有样式!
sb.append(" class=\"");
sb.append(this.styleClass);
sb.append("\"");
}
sb.append(">");
if (cpagesep > 1) {//一页显示数大于1
sb.append("<a href=\"javascript:;\" onclick=\"");
sb.append(this.javaScript);
sb.append("('");
sb.append(fileName);
sb.append(this.getArgPage());
sb.append("=1&");
sb.append(this.argTotal);
sb.append("=");
sb.append(pages.getTotalNum());
sb.append("');\">");
// sb.append("|<");
sb.append("«");
sb.append("</a>");
// sb.append(" <a href=\"");
sb.append(" <a href=\"javascript:;\" onclick=\"");
sb.append(this.javaScript);
sb.append("('");
sb.append(fileName);
sb.append(this.getArgPage());
sb.append("=");
// 往前一行
int previous;
if (pages.getCpage() <= 1) {
previous = 1;
} else {
previous = pages.getCpage() - 1;
}
sb.append(previous);
// sb.append("&total=");
sb.append("&");
sb.append(this.argTotal);
sb.append("=");
sb.append(pages.getTotalNum());
// sb.append("\">");
sb.append("');\">");
// sb.append("<");
sb.append("‹");
sb.append("</a>");
}
/**
* middle butten ,append to <a href='xxx.lt?page=x&t=x'><img></a>
*/
for (int i = 0; i < cnum; i++) {
// sb.append(" <a href=\"");
sb.append(" <a href=\"javascript:;\" onclick=\"");
sb.append(this.javaScript);
sb.append("('");
sb.append(fileName);
sb.append(this.getArgPage());
sb.append("=");
sb.append(((i + 1) + ((cpagesep - 1) * pagesep)));
sb.append("&");
sb.append(this.argTotal);
sb.append("=");
sb.append(pages.getTotalNum());
// sb.append("\">");
sb.append("');\">");
if (pages.getCpage() == (i + 1) + ((cpagesep - 1) * pagesep)) {
sb.append("<strong>");
sb.append((i + 1) + ((cpagesep - 1) * pagesep));
sb.append("</strong>");
} else {
sb.append(((i + 1) + ((cpagesep - 1) * pagesep)));
}
sb.append("</a>");
}
/**
* next butten ,append to <a href='xxx.lt?page=x&t=x'><img></a>
*/
if (cpagesep < allpagesep) {
// sb.append(" <a href=\"");
// sb.append(pages.getFileName());
sb.append(" <a href=\"javascript:;\" onclick=\"");
sb.append(this.javaScript);
sb.append("('");
sb.append(fileName);
sb.append(this.getArgPage());
sb.append("=");
// sb.append("page=");
int next;
if (pages.getCpage() >= pages.getAllPage()) {
next = (int) pages.getAllPage();
} else {
next = pages.getCpage() + 1;
}
sb.append(next);
sb.append("&");
sb.append(this.argTotal);
sb.append("=");
// sb.append("&t=");
sb.append(pages.getTotalNum());
// sb.append("\">");
sb.append("');\">");
// sb.append(">");
sb.append("›");
sb.append("</a> ");
// sb.append("<a href=\"");
// sb.append(pages.getFileName());
sb.append(" <a href=\"javascript:;\" onclick=\"");
sb.append(this.javaScript);
sb.append("('");
sb.append(fileName);
sb.append(this.getArgPage());
sb.append("=");
// sb.append("page=");
sb.append(pages.getAllPage());
sb.append("&");
sb.append(this.argTotal);
sb.append("=");
// sb.append("&t=");
sb.append(pages.getTotalNum());
// sb.append("\">");
sb.append("');\">");
// sb.append(">|");
sb.append("»");
sb.append("</a>");
}
sb.append("</span>");
注意到这里用了两个replace方法,可将tempfilename中的一些值{page}{total}改为实际值:
public String replacePage(String txt, int page) {
return txt.replaceAll("\\{page\\}", String.valueOf(page));
}
public String replaceTotal(String txt, long total) {
return txt.replaceAll("\\{total\\}", String.valueOf(total));
}
这里我们再回头看看javaScript:
function loadNoteInboxUrl(url) {
$('noteListDiv').innerHTML = pageLoadingCenter;
var urls = getActionName(url);
var pars = getActionPars(url);
var myAjax = new Ajax.Updater("noteListDiv", urls, {method: 'get', parameters: pars});
showInboxNum();
showOutboxNum();
}
我们看看这些是怎么与.java后端服务action联系在一起的:
public String readinbox() {
note = this.getNoteService().findNoteByIDToID(this.getId(), this.getUserSession().getId());
if (note == null) {
this.addActionError(this.getText("error.note.notexist"));
return RESULT_HTMLERROR;
}
if (note.getIsNew() == 1) {//note未读
note.setIsNew(0); //设置为note已读
try {
note = this.getNoteService().saveNote(note);
} catch (BbscsException ex2) {
logger.error(ex2);
this.addActionError(this.getText("error.note.read.error"));
return RESULT_HTMLERROR;
}
}
if (note.getSysMsg() == 0) {//不是系统消息!
note.setNoteContext(BBSCSUtil.filterText(note.getNoteContext(), this.getSysConfig().isPmAllowHTML(), this
.getSysConfig().isPmAllowUBB(), this.getSysConfig().isPmAllowSmilies()));
}
return "noteReadInbox";
}
我们看noteReadInbox 对应的noteReadInbox.jsp:
<s:property value="%{note.noteContext}" escape="false"/>
...
<div align="right">
<s:if test="%{note.noteType==1}">//收件箱!
<span id="noteReImg<s:property value="%{note.id}"/>" align="right"></span>
<s:if test="%{note.isRe==1}">
<img src="images/note_replied.gif" alt=""/>
</s:if>
[<a href="javascript:;" onclick="loadNoteSendInNote('<s:property value="%{note.id}"/>');"><s:text name="bbscs.re"/></a>]
[<a href="javascript:;" onclick="deleteInboxNote('<s:property value="%{note.id}"/>','<s:property value="%{page}"/>');"><s:text name="bbscs.del"/></a>]
</s:if>
<s:else>//发件箱
[<a href="javascript:;" onclick="deleteOutboxNote('<s:property value="%{note.id}"/>','<s:property value="%{page}"/>');"><s:text name="bbscs.del"/></a>]
</s:else>
[<a href="javascript:;" onclick="closeNoteDiv('<s:property value="%{note.id}"/>');"><s:text name="bbscs.close"/></a>]//加入关闭按钮!
</div>
我们看看这些js:
function deleteInboxNote(noteId,pageNum) {
var del = confirm(confirm_del);
if (del) {
var oNoteDelInboxOjbAjax = new NoteDelInboxOjbAjax(noteId,pageNum);
oNoteDelInboxOjbAjax.del();
}
else {
return false;
}
}
var NoteDelInboxOjbAjax = Class.create();
NoteDelInboxOjbAjax.prototype = {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -