您的位置:首页 > 其它

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

2008-07-14 11:34 417 查看
我们看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> </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!
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: