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

📄 详细分析四.txt

📁 开源论坛实现
💻 TXT
📖 第 1 页 / 共 5 页
字号:
  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("|&lt;");
					sb.append("&laquo;");
					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("&lt;");
					sb.append("&#8249;");
					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("&gt;");
					sb.append("&#8250;");
					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("&gt;|");
					sb.append("&raquo;");
					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 + -