对天乙社区bbscs8实现的详细分析十九

来源:互联网 发布:淘宝网红店铺排名2017 编辑:程序博客网 时间:2024/06/04 17:53
我们看JAVA代码片断:
Friend f = this.getFriendService().findFriendByID(this.getId(), this.getUserSession().getId());//找到friend!
if (f != null) {
   UserInfo ui = this.getUserService().findUserInfoById(f.getFriendID());
   int isBlack = f.getIsBlack();
   try {
    this.getFriendService().removeFriend(f);//去之
    if (ui != null) {
     if (isBlack == 0) {//数据库的记录是好友!
      ui.setUserKnow(ui.getUserKnow() - 1); // 减少用户人缘系数
      this.getUserService().saveUserInfo(ui);
     } else {
      ui.setUserKnow(ui.getUserKnow() + 1); // 增加用户人缘系数
      this.getUserService().saveUserInfo(ui);
     }
    }
当我们点击增加时:出现div为addfriend的内容显示,下面是一个特别之处:
   <td width="82%">
        <s:textfield id="friendName" name="friendName" cssClass="input2" size="40" maxlength="20" onkeypress="return handleEnter(this, event);"></s:textfield>
      </td>
-->
function handleEnter (field, event) {
var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;//firefox2.0中不支持 window.event.keyCode!
if (keyCode == 13) { //回车键(也就相当于<br>没有)
    return false;
}
return true;
}
当提交时:
function friendAdd() {
var isBlack = $('isBlack').value;
var oFriendAddAjax = new FriendAddAjax(isBlack);
oFriendAddAjax.addFriend();
}
ar FriendAddAjax = Class.create();

FriendAddAjax.prototype = {
initialize: function(isBlack) {
    this.isBlack = isBlack;
},

addFriend: function() {
    showExeMsg();
    var url = getActionMappingURL("/friendSet");
    var pars = "action=addsave&ajax=xml&friendName="+$('friendName').value+"&friendComment="
    + encodeURIComponent($('friendComment').value) + "&isBlack="+this.isBlack //带全参数哦!
    var myAjax = new Ajax.Request(url, {method: 'post', parameters: pars, onComplete: this.addFriendCompleted.bind(this)});
},

addFriendCompleted: function(res) {

    resText = res.responseText;
   var jsonMsgObj = new JsonMsgObj(resText);
   var codeid = jsonMsgObj.getCodeid();

    hiddenExeMsg();
    alert(jsonMsgObj.getMessage());
    if (codeid == "0") {
      closeFriendNewPage();
      if (this.isBlack == "0") {
        loadFriendList();
      }
      if (this.isBlack == "1") {
        loadBlackUserList();
      }
    }
}
};
对于FriendSet.java的addsave方法:
f = this.getFriendFactory().getInstance(this.getUserSession().getId());
产生一个freind实例用于填充之.
f = this.getFriendService().saveFriend(f); // 保存用户
   this.getFriendService().friendIDsToFile(this.getUserSession().getId()); // 将用户列表写入文件
   if (this.getIsBlack() == 0) { // 添加好友情况下
    ui.setUserKnow(ui.getUserKnow() + 1); // 增加用户人缘系数
    this.getUserService().saveUserInfo(ui);
   } else {
    ui.setUserKnow(ui.getUserKnow() - 1); // 减少用户人缘系数
    this.getUserService().saveUserInfo(ui);
   }
好的,我们看note.bbscs:
<action name="note" class="noteAction">
   <interceptor-ref name="mainUserAuthInterceptorStack"></interceptor-ref>
   <interceptor-ref name="requestBasePathInterceptor"></interceptor-ref>
   <result name="success">/WEB-INF/jsp/note.jsp</result>
   <result name="noteInbox">/WEB-INF/jsp/noteInbox.jsp</result>
   <result name="noteOutbox">/WEB-INF/jsp/noteOutbox.jsp</result>
   <result name="input">/WEB-INF/jsp/noteSend.jsp</result>
   <result name="noteReadInbox">/WEB-INF/jsp/noteReadInbox.jsp</result>
</action>
不过这里用到了requestBasePathInterceptor,注意他对应的是NoteAction.java:有fromID,id,ids,noteContext,noteTitle,toID,toUserName,needRe,pageList等属性.
public String index() {
return SUCCESS;
}
看note.jsp:<body onload="loadNoteInbox();">它有了js/note.js中的一些函数:
function loadNoteInbox() {
$('noteListDiv').innerHTML = pageLoadingCenter;//noteListDiv是一个空的div,var pageLoadingCenter = "<div align="center"><s:text name="js.pageLoading"/></div>";
var urls = getActionMappingURL("/note");
var pars = "action=inbox&ajax=shtml";
var myAjax = new Ajax.Updater("noteListDiv", urls, {method: 'get', parameters: pars});
showInboxNum();
showOutboxNum();
}
-->
function showInboxNum() {

var url = getActionMappingURL("/note");
var pars = "action=innum&ajax=xml";

var myAjax = new Ajax.Request(url, {method: 'get', parameters: pars, onComplete: showInboxNumComplete});

}

function showInboxNumComplete(res) {
var resText = res.responseText;
   var jsonMsgObj = new JsonMsgObj(resText);

   $('inboxNumDiv').innerHTML = jsonMsgObj.getText();
}

function showOutboxNum() {

var url = getActionMappingURL("/note");
var pars = "action=outnum&ajax=xml";

var myAjax = new Ajax.Request(url, {method: 'get', parameters: pars, onComplete: showOutboxNumComplete});
}

function showOutboxNumComplete(res) {
resText = res.responseText;
   var jsonMsgObj = new JsonMsgObj(resText);
   $('outboxNumDiv').innerHTML = jsonMsgObj.getText();
}
这里有三个ajax请求,对应的java代码:
public String innum() {
long inBoxNum = this.getNoteService().getNoteAllNumInBox(this.getUserSession().getId());
this.getAjaxMessagesJson().setMessage("0", "", String.valueOf(inBoxNum));
return RESULT_AJAXJSON;
}
public String outnum() {
long outBoxNum = this.getNoteService().getNoteAllNumOutBox(this.getUserSession().getId());
this.getAjaxMessagesJson().setMessage("0", "", String.valueOf(outBoxNum));
return RESULT_AJAXJSON;
}
public String inbox() { //这个方法带分页哦!~
Pages pages = new Pages();
pages.setPage(this.getPage());
pages.setPerPageNum(this.getSysConfig().getPmPerPage());
//pages.setPerPageNum(2);
pages.setFileName(this.getBasePath()
    + BBSCSUtil.getActionMappingURLWithoutPrefix("note?action=inbox&ajax=shtml"));
this.setPageList(this.getNoteService().findNotesInBox(this.getUserSession().getId(), pages));//可以用PageList!
return "noteInbox"; //好,接下来我们看看它对应的页面!
}
我们看看noteInbox.jsp,我们得到的pageList封装了所有的东东。
<span class="font1"><strong><s:text name="note.title"/>:<s:property value="%{pageList.pages.totalNum}"/></strong></span> //总数的显示!
                    <input id="checkall" type="checkbox" name="checkall" value="checkall" onclick="checkAll();"/>
-->
function checkAll() {
var ca = document.getElementById("checkall");
var ids = document.getElementsByName("ids");
for (var i = 0; i < ids.length; i++) {
      ids[i].checked = ca.checked;   //所有的ids checkbox与你选择的一致!
}
}
下面是主要的遍历整个收件箱的其中关于note显示部分的过程:
<td colspan="2">
                  <div id="noteDiv<s:property value="#note.id"/>" class="noteClass1" style="display:none">
                    <div id="noteDetail<s:property value="#note.id"/>"></div>
                    <div id="noteSend<s:property value="#note.id"/>" style="display:none">
                      <form action="<%=BBSCSUtil.getActionMappingURL("/note",request)%>" name="noteSendForm<s:property value="#note.id"/>">
                      <INPUT TYPE="hidden" name="id" value="<s:property value="#note.id"/>">
                      <table width="100%" border="0" cellpadding="5" cellspacing="0">

                        <tr>
                          <td width="15%"><s:text name="note.tousername"/>:</td>
                          <td width="85%"><input name="toUserName" type="text" value="<s:property value="#note.fromUserName"/>" readonly="readonly" class="input2" size="40" /></td>
                        </tr>
                        <tr>
                          <td width="15%"><s:text name="note.msg.title"/>:</td>
                          <td width="85%"><input name="noteTitle" type="text" class="input2" size="40" /></td>
                        </tr>
                        <tr>
                          <td valign="top"><s:text name="note.content"/>:</td>
                          <td><textarea name="noteContext" cols="40" rows="5" class="textarea1"></textarea></td>
                        </tr>
                        <tr>
                          <td><s:text name="note.needre"/>:</td>
                          <td><input type="checkbox" name="needRe" value="1" />
                            <s:text name="note.needre.notice"/></td>
                        </tr>
                        <tr>
                          <td>&nbsp;</td>
                          <td>
                            <input name="Submit2" type="button" class="button1" onclick="noteRe('<s:property value="#note.id"/>');" value="<s:text name="bbscs.re"/>" />
                            <input type="button" name="closeSendInButton" class="button1" onclick="closeNoteSendInNote('<s:property value="#note.id"/>');" value="<s:text name="bbscs.close"/>"/>
                          </td>
                        </tr>

                      </table>
                      </form>
                    </div>
                    <div id="needRe<s:property value="#note.id"/>" style="display:none"><s:property value="#note.needRe"/></div>
                  </div>
                </td>
我们先看loadNoteReadInbox()函数:
function loadNoteReadInbox(noteId,page) {

needRe_span = document.getElementById("needRe"+noteId);//是否需要回复!
var needRe_num_val = needRe_span.innerHTML;
var needRe_int_val = parseInt(needRe_num_val);
if (needRe_int_val == 1) {
    autoRe(noteId);//调用回复!见下
}
displayElement("noteDiv"+noteId);//显示note在noteDiv+noteId处!
var urls = getActionMappingURL("/note");
var pars = "action=readinbox&ajax=shtml&id=" + noteId + "&page=" + page;
var myAjax = new Ajax.Updater("noteDetail"+noteId, urls, {method: 'get', parameters: pars});//更新的是noteDetail处div,注意另外一个noteSend的div还没显示出来!
$('noteIsNew'+noteId).innerHTML = "<img src="images/note_old.gif"/>";
}
-->
function autoRe(noteId) {
var cRe = confirm(confirmNoteRe); //var confirmNoteRe = "<s:text name="js.confirmNoteRe"/>";
if (cRe) {
    var oNoteAutoReOjbAjax = new NoteAutoReOjbAjax(noteId);
    oNoteAutoReOjbAjax.autore();
}
else {
    return false;
}
}
-->
ar NoteAutoReOjbAjax = Class.create();

NoteAutoReOjbAjax.prototype = {
initialize: function(noteId) {
   this.noteId = noteId;
},

autore: function() {

    var url = getActionMappingURL("/note");
    var pars = "action=autore&ajax=xml&id=" + this.noteId;
    var myAjax = new Ajax.Request(url, {method: 'get', parameters: pars, onComplete: this.autoreCompleted.bind(this)});
},

autoreCompleted: function(res) {
   resText = res.responseText;
   var jsonMsgObj = new JsonMsgObj(resText);
   var codeid = jsonMsgObj.getCodeid();
   alert(jsonMsgObj.getMessage());
   if (codeid == "0") {
    refreshBoxNum("outbox",1);//增加发件箱note数
/**
function refreshBoxNum(boxName,num) {
var num_span;
if (boxName == "inbox") {
    num_span = document.getElementById("inboxNumDiv");
}
else {
    num_span = document.getElementById("outboxNumDiv");
}
var num_val = num_span.innerHTML;
var int_val = parseInt(num_val);
var new_int_val = int_val + num;
num_span.innerHTML = new_int_val;
}
*/
    document.getElementById("needRe"+this.noteId).innerHTML = "0";//不需要回复了!
   }
}
};
好,我们看noteInbox.jsp的底部相关JSP代码:
<tr>
          <td colspan="3" class="bgColor3">
            <table width="100%" border="0" cellpadding="0" cellspacing="0">
              <tr>
                <td width="67%"><s:text name="bbscs.pagebreak"/>: <bbscs:pages value="%{pageList.pages}" javaScript="loadNoteInboxUrl"/> <a href="javascript:;" onclick="delAllInBox();"><s:text name="note.delall"/></a></td>
                <td width="33%">
                  <div align="right"><s:text name="note.selected"/>:
                    <select name="noteOp" class="select1">
                      <option value="1" selected="selected"><s:text name="bbscs.del"/></option>
                      <option value="2"><s:text name="note.getout"/></option>
                    </select>
                    <input name="Submit" type="submit" class="button1" onclick="noteOpInBox();" value="<s:text name="bbscs.exe"/>"/>
                  </div>
                  <div id="cpage" style="display:none"><s:property value="%{pageList.pages.page}"/></div> //当前页
                </td>
              </tr>
我们看js:
function delAllInBox() {
var del = confirm(confirm_del);
if (del) {
    var url = getActionMappingURL("/note");
    var pars = "action=delallinbox";
    var myAjax = new Ajax.Request(url, {method: 'get', parameters: pars, onComplete: delAllInBoxComplete});
}
else {
    return false;
}
}
function noteOpInBox() {
var noteOpSelectObj = document.getElementById("noteOp");

if (noteOpSelectObj.options[noteOpSelectObj.selectedIndex].value == "1") {
deleteIdsInboxNote(); //删除选择ids的note
}
//if (noteOpSelectObj.options[noteOpSelectObj.selectedIndex].value == "2") {

//} //晕,还没有实现呢~~~
}
-->
function deleteIdsInboxNote() {
var del = confirm(confirm_del);
if (del) {
    var pageNum = document.getElementById("cpage").innerHTML;//获得当前页信息
    var ids = document.getElementsByName("ids");
    var noteNum = 0;

    var data = "";
    for (var i = 0; i < ids.length; i++) {
      if (ids[i].checked) {
        data += "&ids=";
        data += ids[i].value;//data=&ids=XX&ids=XX
        noteNum++;//note删除数!
      }
    }
    if (noteNum > 0) {
     var oNoteDelIdsInboxAjax = new NoteDelIdsInboxAjax(pageNum,noteNum,data);
     oNoteDelIdsInboxAjax.dels();
    }
    else {
    return false;
    }
}
else {
    return false;
}
我们看看NoteDelIdsInboxAjax(pageNum,noteNum,data);
var NoteDelIdsInboxAjax = Class.create();
NoteDelIdsInboxAjax.prototype = {
initialize: function(pageNum,noteNum,data) {
   this.pageNum = pageNum;
   this.noteNum = noteNum;
   this.data = data;
},
dels: function() {

    var url = getActionMappingURL("/note");
    var pars = "action=delidsinbox&ajax=xml" + this.data;
    var myAjax = new Ajax.Request(url, {method: 'post', parameters: pars, onComplete: this.delsCompleted.bind(this)});
},
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!
}


原创粉丝点击