
DWR框架是一个可以允许你去创建AJAX WEB站点的JAVA开源库。它可以让你在浏览器的JavaScript代码中调用Web服务器的Java代码,就像Java代码在浏览器中一样。DWR工作原理是通过动态把Java类生成JavaScript,让使用者感觉调用就像发生在浏览器端。当我们的业务需要在页面不提交的情况下访问服务器端并实现页面数据局部刷新时,我们就可以使用DWR。 下面对如何使用DWR进行了归纳: 1首先把dwr的类库jar包放入项目的lib路径下,这是废话。 2在webxml增加一段配置,因为dwr是靠一个Servlet来接收来至javascript的请求的 <servlet><servlet-name>dwr</servlet-name><servlet-class>orgdirectwebremotingservletDwrServlet</servlet-class></servlet><servlet-mapping><servlet-name>dwr</servlet-name><url-pattern>/dwr/</url-pattern></servlet-mapping> 3在WEB-INF下面添加一个名为dwrxml的配置文件,在这里配置需要在js里面访问的Java类和方法。下面以检查邮件地址是否占用的 *** 作为例,<allow>标记表示了那些类需要转换为Ajax方式调用,create="new"指定dwr引擎以何种方式创建要调用的类,还有jsf,struts,spring,none等选项,new 是比较适中的也是默认的创建方式。javascript="CheckEmailService"指定该java类生成的js文件的名字(或者说在js里该类的名字)。如果你需要在js调用Java时传递对象如VO,可以如下指定一个<convert>,这表示你允许dwr帮你把Java类转换为js里模拟的对象,js里调用时可以传递这个VO<dwr><allow><create creator="new" javascript="CheckEmailService"><param name="class"value="comxxxCheckEmailService" /></create><convert converter="bean" match="comxxxCallbackVo" /></allow></dwr>4在项目里编写Java类:一个VO类,一个用来AJAX执行的类,注意方法的参数可以是对象哦!!! import comxxxEmailVo;public class CheckEmailService{public String checkEmail(EmailVo email){//do something}}public class EmailVo{private String mail;//getter,setter,以及其他属性}5接下来就在jsp里面导入js文件了。任何使用dwr的jsp必须导入以下两个dwr已有的js: <script type='text/javascript' src="/dwr/enginejs"/><script type='text/javascript' src="/dwr/utiljs"/> 当然还必须导入dwr从CheckEmailService类生成而来的js文件,比如:<script type='text/javascript' src="/dwr/interface/CheckEmailServicejs"/> 注意了,这个地方有的人会迷惑,这些js在哪里?实际上你是找不到的,因为dwr把这些js文件输出到浏览器缓存里,文件系统没有。(如果你用firefox浏览器,可以安装JS Viewer插件来查看缓存里的js)。 6好了,在jsp里面要以AJAX方式检查邮件是否占用可以这么写: <script>var emailVo={mail:documentgetElementById("mailInputText"),};CheckEmailServicecheckEmail(emailVo,callback(returnValue){alert("邮件被占用!");}});</script> 看到了没,先以{ 属性1:属性值1, 属性2:属性值2}方式创建一个数组来模拟对象,然后传给执行检查的checkEmail方法,checkEmail的第二个参数是一个js函数,用来回调。也就是服务器端Java类的checkEmail执行完返回后,来调用这个回调的函数处理结果。 7总结:我这里给出了一个解释原理的示意性例子,要会用dwr,主要是理解其原理。其原理就是通过Java反射机制生成对应于Java类的js文件,在客户端模拟Java调用;由enginejs里的execute()函数向服务器发送,提交到Servlet后转给Java类执行。理解,切记。共勉!
可以对页面上的表格动态输出内容,用于网页监控等功能。是通过DWR技术(AJAX)把java和html结合起来实现。
下面具体描述这一技术(以行调程序为例):
完成这一功能需要以下要素:
1warn_listjsp:包含表格的内容和js的一些函数。
2WarnListjava:在DWR中注册的bean,用于获取表格数据的集合。必须继承DynTableSupport抽象类。
3WarnListBeanjava:保存表格数据的bean,一行存为一个对象。
==============================
jsp文件中包含以下js代码:
//该对象数组的对象应和WarnListBean中的变量保持一致
var WarnListBean = { lcxxBh:null,passTime:null,tczName:null,trainType:null,totalCarNum:0,
totalAxisNum:0,speed:0,envTemp:0,carPos:0,axisPos:0,
leftHotLevel:null,rightHotLevel:null};
//该函数数组用于向表中填充
var cellFuncs = [
getLcxxBh = function(WarnListBean) { return WarnListBeanlcxxBh },
getPassTime = function(WarnListBean) { return WarnListBeanpassTime },
getTczName = function(WarnListBean) { return WarnListBeantczName },
getTrainType = function(WarnListBean) { return WarnListBeantrainType },
getTotalCarNum = function(WarnListBean) { return WarnListBeantotalCarNum },
getTotalAxisNum = function(WarnListBean) { return WarnListBeantotalAxisNum },
getSpeed = function(WarnListBean) { return WarnListBeanspeed },
getEnvTemp = function(WarnListBean) { return WarnListBeanenvTemp },
getCarPos = function(WarnListBean) { return WarnListBeancarPos },
getAxisPos = function(WarnListBean) { return WarnListBeanaxisPos },
getLeftHotLevel = function(WarnListBean) { return WarnListBeanleftHotLevel },
getRightHotLevel = function(WarnListBean) { return WarnListBeanrightHotLevel }
];
function update() {
//利用DWR中注册的bean,生成动态数据,其中fillTable是把函数结果发向的目的地函数
warnListgetTable(fillTable);
}
function fillTable(warn) {
//用DWRUtil的addRows方法向网页中id为warn_body的tbody标签填充行数据
DWRUtiladdRows("warn_body", warn, cellFuncs,{
//创建行对象,在这里可以对行的风格进行调整
rowCreator:function(options) {
var row = documentcreateElement("tr");
var index = optionsrowIndex 50;
// rowstylecolor = "rgb(" + index + ",0,0)";
return row;
},
//创建列数据,在这里可以对列的风格进行调整
cellCreator:function(options) {
var td = documentcreateElement("td");
if (optionsrowIndex % 2 == 1){
tdstylebackgroundColor = "rgb(204,204,204)";
}
//options可以表示每列数据的内容,所在位置等,下面语句的意思是根据报的热轴情况,对表格背景进行着色
if (optionscellNum == 10 || optionscellNum == 11){
if (optionsdata == "微热1"){
tdstylebackgroundColor = "rgb(255,255,0)";
}
if (optionsdata == "微热2"){
tdstylebackgroundColor = "rgb(255,255,0)";
}
if (optionsdata == "微热3"){
tdstylebackgroundColor = "rgb(255,255,0)";
}
if (optionsdata == "强热"){
tdstylebackgroundColor = "rgb(255,125,0)";
}
if (optionsdata == "激热"){
tdstylebackgroundColor = "rgb(255,0,0)";
}
}
return td;
}
});
}
jap的网页部分如下:
<table id="__01" bgcolor="#ffffff" width="100%" border="0" cellpadding="0" cellspacing="0">
<thead>
<tr height="30" bgcolor="#91c8c8" class="bodytitleBold" align="center" valign="middle">
<th background="//images/linebgjpg">列车信息编号</th>
<th background="//images/linebgjpg">过车时间</th>
<th background="//images/linebgjpg">探测站名称</th>
<th background="//images/linebgjpg">客货类型</th>
<th background="//images/linebgjpg">总辆数</th>
<th background="//images/linebgjpg">总轴数</th>
<th background="//images/linebgjpg">平均速度(Km/h)</th>
<th background="//images/linebgjpg">环温(℃)</th>
<th background="//images/linebgjpg" style="color:orange">辆位</th>
<th background="//images/linebgjpg" style="color:orange">轴位</th>
<th background="//images/linebgjpg" style="color:orange">左热级</th>
<th background="//images/linebgjpg" style="color:orange">右热级</th>
</tr>
</thead>
<tbody id="warn_body" align="center" class="bodytext">
</tbody>
</table>
其中表头用thead表示,表体用tbody表示,其id必须和js部分fillTable函数中的表体对象id相同。
==========================
WarnList对象继承DynTableSupport抽象类
该抽象类定义如下:
public abstract class DynTableSupport {
//存储表体内容的数据结构
List tableModel = new ArrayList();
//获取表体内容,被DWR调用的函数
abstract public Collection getTable();
//内部用于构造每一个表行的函数
abstract protected void formatBean(List draft);
}
WarnList对象在getTable方法中获取表体数据(访问第三方数据资源),并调用formatBean方法,构造若干个WarnListBean对象,每个对象都是一个表行,并装入tableModel结构,最后返回该结构。如下代码所示:
public Collection getTable() {
//访问数据库的结构
WarnListModule wlm = new WarnListModule();
List draft = wlmgetQueryResult(6000);//test 100 minute
if (draft != null){
thisformatBean(draft); //from draft to tablemodel
}
return thistableModel;
}
protected void formatBean(List draft) {
thistableModelclear();
for (Iterator it = draftiterator(); ithasNext(); ) {
Object[] o = (Object[]) itnext();
WarnListBean wlb = new WarnListBean();
wlbsetLcxxBh((String)o[0]);
wlbsetPassTime(DataAdaptergetTimeString((Date)o[1]));
wlbsetTczName((String)o[2]);
wlbsetTrainType(((Integer)o[3])intValue()==72"货车":"客车");
wlbsetTotalCarNum(((Integer)o[4])intValue());
wlbsetTotalAxisNum(((Integer)o[5])intValue());
wlbsetSpeed(((Integer)o[6])intValue());
double d = DataAdapterround(((BigDecimal)o[7])doubleValue(),2);
wlbsetEnvTemp(new Double(d)floatValue());
wlbsetCarPos(((Integer)o[8])intValue());
wlbsetAxisPos(((Integer)o[9])intValue());
wlbsetLeftHotLevel(thisgetHotLevel(((Integer)o[10])intValue()));
wlbsetRightHotLevel(thisgetHotLevel(((Integer)o[11])intValue()));
thistableModeladd(wlb);
}
}
只要把这些要素拼装起来就可以实现动态的非刷新的表格访问。
这不很简单吗
if(data==false)
{
alert("数据库中没有该图书的编号");
//这不就表明数据库没有记录,你在这里再写个提交方法啊
}else{
//这不就表明数据库有记录,你在这里告诉他不要重复提交
}
以上就是关于如何使用DWR框架全部的内容,包括:如何使用DWR框架、dwr如何做表格显示数据、高分请教一个关于DWR的小问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)