tomdaweiwlg tomdaweiwlg
关注数: 36 粉丝数: 17 发帖数: 393 关注贴吧数: 31
prototype ajax封装 var url = '/aaa'; var params = 'aaa=' + aaa + "&bbb=" +bb; var ajaxCall = new Ajax.Updater( 'tagID', url, { method: 'post', parameters: params } ); var params = 'aa=' + aa + '' + '&bb=' + bb; var url = '/aaa?' + params; var ajaxCall = new Ajax.Request( url, { method: 'post', parameters: params, onComplete: update } ); var resultLeft = oriReq.responseXML.getElementsByTagName("left"); var resultRight = oriReq.responseXML.getElementsByTagName("right"); var i = 0; var obj; var clientid; var clientName; var industryName; var updatetime; var resultLeftClients; var resultRightClients; if(resultLeft.length > 0) { resultLeftClients = resultLeft[0].getElementsByTagName("client"); for(i = 0; i < resultLeftClients.length; i++) { clientid = resultLeftClients[i].getElementsByTagName("clientid")[0].firstChild.nodeValue; obj = resultLeftClients[i].getElementsByTagName("date")[0].firstChild; if(obj == null) { updatetime = " "; } else { updatetime = resultLeftClients[i].getElementsByTagName("date")[0].firstChild.nodeValue; } obj = resultLeftClients[i].getElementsByTagName("clientname")[0].firstChild; if(obj == null) { clientName = " "; } else { clientName = resultLeftClients[i].getElementsByTagName("clientname")[0].firstChild.nodeValue; } obj = resultLeftClients[i].getElementsByTagName("industryname")[0].firstChild; if(obj == null) { industryName = " "; } else { industryName = resultLeftClients[i].getElementsByTagName("industryname")[0].firstChild.nodeValue; } dataLeftList[i] = {clientid: clientid, updatetime: updatetime, clientname: clientName, industryname: industryName}; } } function updateClients(oriReq) { dataLeftList = new Array(); dataRightList = new Array(); var resultLeft = oriReq.responseXML.getElementsByTagName("left"); var resultRight = oriReq.responseXML.getElementsByTagName("right"); var i = 0; var obj; var clientid; var clientName; var industryName; var updatetime; var resultLeftClients; var resultRightClients; if(resultLeft.length > 0) { resultLeftClients = resultLeft[0].getElementsByTagName("client"); for(i = 0; i < resultLeftClients.length; i++) { clientid = resultLeftClients[i].getElementsByTagName("clientid")[0].firstChild.nodeValue; obj = resultLeftClients[i].getElementsByTagName("date")[0].firstChild; if(obj == null) { updatetime = " "; } else { updatetime = resultLeftClients[i].getElementsByTagName("date")[0].firstChild.nodeValue; } obj = resultLeftClients[i].getElementsByTagName("clientname")[0].firstChild; if(obj == null) { clientName = " "; } else { clientName = resultLeftClients[i].getElementsByTagName("clientname")[0].firstChild.nodeValue; } obj = resultLeftClients[i].getElementsByTagName("industryname")[0].firstChild; if(obj == null) { industryName = " "; } else { industryName = resultLeftClients[i].getElementsByTagName("industryname")[0].firstChild.nodeValue; } dataLeftList[i] = {clientid: clientid, updatetime: updatetime, clientname: clientName, industryname: industryName}; } } var j = 0; if(resultRight.length > 0) { resultRightClients = resultRight[0].getElementsByTagName("client"); for(j = 0; j < resultRightClients.length; j++) { clientid = resultRightClients[j].getElementsByTagName("clientid")[0].firstChild.nodeValue; obj = resultRightClients[j].getElementsByTagName("date")[0].firstChild; if(obj == null) { updatetime = " "; } else { updatetime = resultRightClients[j].getElementsByTagName("date")[0].firstChild.nodeValue; } obj = resultRightClients[j].getElementsByTagName("clientname")[0].firstChild; if(obj == null) { clientName = " "; } else { clientName = resultRightClients[j].getElementsByTagName("clientname")[0].firstChild.nodeValue; } obj = resultRightClients[j].getElementsByTagName("industryname")[0].firstChild; if(obj == null) { industryName = " "; } else { industryName = resultRightClients[j].getElementsByTagName("industryname")[0].firstChild.nodeValue; } dataRightList[j] = {clientid: clientid, updatetime: updatetime, clientname: clientName, industryname: industryName}; } } dispListBox(dataLeftList, dataRightList); } // end updateClients <?xml version="1.0" encoding="UTF-8"?> <clients> <left> <client> <clientid>556</clientid> <date>2010年8月4日</date> <clientname>広告主_556</clientname> <industryname>分类不能</industryname> </client> </left> <right> <client> <clientid>556</clientid> <date>2010年8月4日</date> <clientname>広告主_556</clientname> <industryname>分类不能</industryname> </right> </left> </clients> <script type="text/javascript"> <!-- // ajax script var xmlHttp; function createXMLHttpRequest() { if (window.ActiveXObject) { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } else if (window.XMLHttpRequest) { xmlHttp = new XMLHttpRequest(); } else {/**TODO*/} } // end createXMLHttpRequest function refreshData(str) { var url = '/associate/templateheightsearch?templatewidth='+templatewidth; createXMLHttpRequest(); xmlHttp.onreadystatechange = handleStateChange; xmlHttp.open("GET", url, true); xmlHttp.send(null); } // end refreshData function handleStateChange() { if(xmlHttp.readyState == 4) { // 要请完了 if(xmlHttp.status == 200) { // 成功 updateFrameHeightCombo(); } } } // end handleStateChange function updateFrameHeightCombo() { clearFrameHeightCombo(); var hcombo = document.getElementById("selcomboheight"); var result = xmlHttp.responseXML.getElementsByTagName("height"); } // end updateFrameHeightCombo function clearFrameHeightCombo() { var hcombo = document.getElementById("selcomboheight"); while(hcombo.childNodes.length > 0) hcombo.removeChild(hcombo.childNodes[0]); } // end clearFrameHeightCombo //--> </script>
VC socket通信例子 转自http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Ftopic.csdn.net%2Ft%2F20021215%2F18%2F1262988.html&urlrefer=768033f4d0af246cfa472265853929f5 //client #include <winsock2.h> #include <winbase.h> #include <iostream> #define PORT 5000 void main(void) { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsaData); if(err != 0) { return; } if(LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { WSACleanup(); return; } /* //get local ip address char name[32]; int rtnvl_gethostname; rtnvl_gethostname = gethostname(name, sizeof(name)); if(rtnvl_gethostname == SOCKET_ERROR) { std::cout < < "get host name fail ! " < <std::endl; } struct hostent FAR * hostent; hostent = gethostbyname(name); printf( "ip address is %s\n ", inet_ntoa(*((struct in_addr *)hostent-> h_addr))); */ SOCKET sock; sock = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in server; server.sin_family = AF_INET; server.sin_port = htons(PORT); server.sin_addr.S_un.S_addr = inet_addr( "10.96.128.149 "); int rtnvl_connect; rtnvl_connect = connect(sock, (struct sockaddr FAR*)&server, sizeof(struct sockaddr_in)); if(rtnvl_connect == SOCKET_ERROR) { int erro = WSAGetLastError (); std::cout < < "connect fail ! " < <std::endl; Sleep(3000); closesocket(sock); WSACleanup(); return ; } char buffer[1024]; int count; count = recv(sock, buffer, sizeof(buffer), MSG_PEEK); if(count == SOCKET_ERROR) { closesocket(sock); WSACleanup(); return ; } std::cout < <buffer < <std::endl; Sleep(3000); closesocket(sock); WSACleanup(); } ---------------------------------------- //server #include <winsock2.h> #include <winbase.h> #include <iostream> #include <fstream> #define PORT 5000 #define MAXLISTEN 5 void main(void) { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsaData); if(err != 0) { return; } if(LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { WSACleanup(); return; } SOCKET sock; sock = socket(AF_INET, SOCK_STREAM, 0); if(sock == INVALID_SOCKET) { std::cout < < "socket fail ! " < <std::endl; Sleep(3000); return ; } struct sockaddr_in localaddr; localaddr.sin_family = AF_INET; localaddr.sin_port = htons(PORT); localaddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); int rtnvl_bind; rtnvl_bind = bind(sock, (struct sockaddr *)&localaddr, sizeof(struct sockaddr_in)); if(rtnvl_bind == SOCKET_ERROR) { std::cout < < "bind fail ! " < <std::endl; Sleep(3000); return ; } int rtnvl_listen; rtnvl_listen = listen(sock, MAXLISTEN); if(rtnvl_listen == SOCKET_ERROR) { std::cout < < "listen fail ! " < <std::endl; Sleep(3000); return ; } while(true) { SOCKET newsocket; struct sockaddr_in clientaddr; int length; length = sizeof(struct sockaddr_in); newsocket = accept(sock, (struct sockaddr FAR *)&clientaddr, &length); if(newsocket == INVALID_SOCKET) { std::cout < < "accept fail ! " < <std::endl; Sleep(3000); int error = WSAGetLastError(); std::cout < <error < <std::endl; Sleep(3000); break ; } //send file char buffer[] = "this is the server ! "; int rtnvl_send; rtnvl_send = send(newsocket, buffer, sizeof(buffer), MSG_DONTROUTE); if(rtnvl_send == SOCKET_ERROR) { std::cout < < "send fail ! " < <std::endl; Sleep(3000); break ; } // closesocket(newsocket); } closesocket(sock); WSACleanup(); }
堆栈等 天书夜读里面可以找到C语音对应的汇编程序 for循环 一般是 mov dword ptr [i],0 jmp xxxxxxh imul一般会联系到结构体数组,是一个特征 X386 CPU使用的堆栈方式是递减堆栈(DecendingStack):当堆栈由高地址向低地址生成时,称为递减堆栈。 Fulldescending 满递减堆栈 : 堆栈首部是高地址,堆栈向低地址增长。栈指针总是指向堆栈最后一个元素(最后一个元素是最后压入的数据)。 push esp -4 pop esp+4 call esp - 4 ret esp + 4 (ret n???) 数据传送指令 mov 指令 不能使用寄存器加减法,所以有lea edi, [ebp-0cch],但不能使用mov edi, ebp - 0cch;两者似乎是相等(mov这样用会出错) xor 异或 xor eax, eax 清零 = mov eax, 0 lea 取地址操作 lea edi, [ebp-0cch] 后 edi = ebp - 0cch 方括号表示存储器 stos:串存储指令 将eax中的数据放到edi所指的地址中,同时edi会自增4字节 rep重复ecx中次数 mov ecx,30h mov eax,0cccccccch rep stos dword ptr es:[edi] 这段代码的作用是堆栈中的30h*4字节初始化为cch,也就是int 3指令,如果发生执行堆栈地址就立刻会中断 stosd 4字节,stosb 1字节, stosw 2字节 跳转指令 jmp 无条件跳转 jg 大于是跳转,通常前面有一条比较指令 jl 小于跳转 jge 大于等于跳转 比较指令 cmp 比较指令 之后往往是jg jl jge等 c调用方式: _cdecl 1 保存ebp.ebp保存这个函数执行之前的esp。执行完毕我们用ebp恢复esp,先把ebp压栈,返回之前弹出 2 保存esp到ebp中 push ebp mov ebp, esp 此时ebp和esp都指向这次函数调用时栈顶 3 在堆栈中腾出一个区域保存局部变量,局部变量保存在栈空间 4 保存ebx esi edi 到堆栈中,调用完毕后恢复 sub esp, 0cch push ebx push esi push edi 5 把局部区域初始化cch(int 3) lea edi, [ebp - 0cch] mov ecx, 33h mov eax, 0cccccccch rep stos dword ptr[edi] 6 做参数该做的事情 ebp+12 是第二个参数 ebp+8是第一个参数 ebp+4要返回的地址 7 恢复edi,esi,ebx,esp ebp push edi push esi push ebx mov esp, ebp pop ebp ret ------------------------------------------- 驱动程序和系统其他组件之间的交互是通过给设备发送或者接受发送给设备的请求来交互的。 也就是说,一个没有任何设备的驱动是不能按照规范方式和系统交互的,当然也不会受到任何IRP请求,分发函数也就失去了意义 但这样的驱动程序是存在的。例如一个驱动程序只是Hook某些内核函数或者做其他的一些小动作,则可以不生成任何设备,也不用设置分发函数 如果驱动程序要和应用程序之间通信,则必须生成设备,此外还必须为设备生成应用程序可以访问的符号链接。 创建设备API IoCreateDevice创建的设备,必须拥有管理员权限的用户才能使用 IoCreateDeviceSecure,普通用户也可以使用 驱动程序创建的线程始终在System进程中 在windows中,不同类型设备驱动有不同的安装方式,这些方式被写成一个脚本,也就是inf文件,但是对于完全“非任何类型”的驱动程序,可以简单的当做一个服务安装;但是由于有现成的工具“服务安装卸载工具”,检索这个可以找到该软件。安装驱动程序后输入下面命令 net stgart 服务名
C#配置SQL Server2005以允许远程访问 1、以“window身份验证”打开sql server 2005的管理器(microsoft sql server manager studio)2、打开数据库组属性选中“sql server 和 windows身份验证模式”:3、设置一个账号的访问权限,以 sa 为例4、打开sql server 的配置管理器在配置管理器中启用TCP/IP:5、打开外围应用程序配置:点击“服务和连接的外围应用配置器”:设置远程连接的选项:先关闭“Database Engine”的服务,然后重新启动6、重新启动sql server 和sql server browser:最好将sql server browser启动模式设置为“自动 ”,以避免电脑重启后需手动再开启sql server browser7、配置防火墙 7-1、如果选择关闭防火墙,那么sql server2005已经允许远程访问了,但这样就会有一些安全隐患。 7-2、如果选择不关闭,那么操作方式如下图: 点击“添加程序”,弹出下图右边的对话框点击“浏览”来选择需要打开远程访问的SQL Server 2005 实例, sqlserver2000路径为:C:\Program Files\Microsoft SQL Server\MSSQL\Binn\sqlservr.exe sqlexpress路径为:C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\sqlservr.exe在以同样方式添加sql server browser:路径为C:\Program Files\Microsoft SQL Server\90\Shared\sqlbrowser.exe 至此所有操作完成,远程访问设置成功,注意要将sql serser browser 启动方式设置为“自动”,否则重启电脑后,远程访问将失败。我在防火墙中添加了sqlserver端口号1433,不过好像没起什么作用。
JQuery学习笔记02-选择器把需要的东西揪出来(基础) 学习了功能超级强大的jQuery选择器,真的不知道如何用语言描述这些功能了,比葫芦画瓢写了个程序,来说明各种选择器的功能。。。<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.w3.org%2FTR%2Fxhtml1%2FDTD%2Fxhtml1-transitional.dtd&urlrefer=e9b2a1e0c6d358d677c4ee0138b67400"> <html xmlns="http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml&urlrefer=d0f4243b5ce5e5fa54fdafc10831c319"> <head> <title></title> <script type="text/javascript" src="http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fjquery%2F1.4.2%2Fjquery.min.js&urlrefer=1c1a6e212cb6373ca95dc6797037fd7b"></script> <script type="text/javascript"> $(function() { $("#sub").click( function() { $("*").removeClass("selitem"); $($("#sel").val()).addClass("selitem"); $("#msg").html('当前使用的选择器:$("' + $("#sel").val() + '")'); } ) }) </script> <style type="text/css"> * { font-size: 14px; padding: 2px; margin: 1px; font-family: 宋体; font-size: 12px; } #msg { height: 24px; background-color: Yellow; font-weight: bold; padding: 6px; } ul { padding-left: 8px; margin-left: 10px; list-style-type: decimal; } .level02 { padding-left: 16px; } .level03 { padding-left: 24px; } .selitem { border: solid 1px #F00; } </style> </head> <body> <div>输入:<input id="sel" type="text" /><input id="sub" type="button" value="确定" /></div> <div id="msg"></div> <div> <ul id="listAll" class="level01"> <li> <div> 上海市内</div> <ul id="listShanghai" class="level02"> <li><div><a href="jingan.htm">静安区</a></div></li> <li><div><a href="minhang.htm">闵行区</a></div> <ul id="listMinhang" class="level03"> <li><div>梅陇镇</div></li> <li><div><a href="xinzhuang.htm">莘庄镇</a></div></li> <li><div><a href="qibao.htm">七宝镇</a></div></li> <li><div>虹桥镇</div></li> </ul> </li> <li><div>浦东区</div></li> <li><div>松江区<a href="songjiang.htm">详细</a></div></li> </ul> </li> <li> <div>国内其他地区</div> <ul id="listguonei" class="level02"> <li><div>河南省<a href="henan.htm">详细</a></div></li> <li><div>河北省<a href="hebei.htm">详细</a></div></li> <li><div>东北省</div></li> <li><div>浙江省</div></li> <li><div>江苏省</div></li> </ul> </li> <li><div>国外</div></li> </ul> </div> </body> </html>1.基本的CSS选择器以上用法与CSS兼容,不仅如此jQuery还进行了扩展(也许符合下一代的CSS) E>F 匹配标签名为F为E的直接子节点的所有元素E+F 匹配前面是邻近兄弟节点E的所有元素F(E和F紧挨) E~F 匹配前面是邻近兄弟节点E的所有元素F(E和F可以不紧挨)例子没有做好 无法区分E+F和E~F的区别。 E:has(F)匹配标签名称为E,至少有一个标签名称过为F的后代节点的所有元素,(可以间接包含)E[A]匹配带有特征A的所有元素E(不管A的值) E[A=V]匹配带有特征A的所有元素E,并且A的属性等于V E[A^=V]匹配带有特征A的所有元素E,并且A的属性以V开头 E[A$=V]匹配带有特征A的所有元素E,并且A的属性以V结束 E[A*=V]匹配带有特征A的所有元素E,并且A的属性包含V通过位置来选择元素 :first 页面的最先的匹配(所有节点中的第一个) :last 页面的最后的匹配:first-child 最先的子元素(兄弟节点中的第一个) :last-child 最后的子元素:only-child 返回没有兄弟节点的所有元素:nth-child(n)返回第n个节点:nth-child(even|odd)返回偶数或奇数的子节点(针对兄弟节点来说) :even偶数(页面范围内,与:nth-child(even)不同) :odd奇数(页面范围内,与:nth-child(odd)不同):nth-child(xn+y)根据公式计算返回的节点:eq(n)整个页面 第n个匹配的元素(n从0开始) :gt(n)整个页面 第n个匹配的元素(不包含)之后的元素(n从0开始) :lt(n)整个页面 第n个匹配的元素(不包含)之前的元素(n从0开始)
JQuery学习笔记01-JQuery初接触 jQuery是一个Javascript库,用于简化Web相关的Javascript开发 一、下载 官方网址是http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fjquery.com%2F&urlrefer=de8f2dc7b836d4d6d1a0d992f3355d03 官方下载地址:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fdocs.jquery.com%2FDownloading_jQuery&urlrefer=50e5f639c199d4d84238fe9c4ea885a2 里边有当前版本和历史版本的下载,可以下载下来部署在自己的服务器上 上面也有Google\Microsoft\jQuery的CDN(Content Delivery Network)地址,由于目前jQuery的广泛使用,选择CDN地址可以充分利用缓存和这些互联网大佬们的带宽和服务器资源。 官网上下载有两种版本Compressed(Minified version)和Uncompressed(Source version) 前者体积小70k左右,还不到未压缩版本的一半大小。 但是未压缩版本更容易阅读源代码,以及调试 二、安装 安装jQuery非常简单 只需在HTML中引用你下载的那个js文件即可 比如 <script type="text/javascript" src="/jslibs/jquery.min.js"></script> 如果使用CDN 就直接引用<script type="text/javascript" src="http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fjquery%2F1.4.2%2Fjquery.min.js%2522%253E%253C%2Fscript%3E&urlrefer=41e9010c3fde09e8e7e41fb40a5cdf8d 三、第一个程序<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.w3.org%2FTR%2Fxhtml1%2FDTD%2Fxhtml1-transitional.dtd&urlrefer=e9b2a1e0c6d358d677c4ee0138b67400"> <html xmlns="http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml&urlrefer=d0f4243b5ce5e5fa54fdafc10831c319"> <head> <title></title> <script type="text/javascript" src="http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fjquery%2F1.4.2%2Fjquery.min.js&urlrefer=1c1a6e212cb6373ca95dc6797037fd7b"></script> <script type="text/javascript"> $(function() { alert("hello"); }) </script> </head> <body> </body> </html>刷新页面后 就可以执行了。 刚开始可能对$有点不适应,其实用不了多久就会习惯,并且喜欢它的简洁。如果实在吃不消,“$”也可以用“jQuery”代替 $(function() { alert("hello"); }) 相当于 $(document).ready(function() { alert("hello"); }) 也基本相当于 document.onready = function() {alert("hello");} 也就是说当浏览器把文档结构完全解析后,就可以执行下面的语句了。 与document.onload的区别在于,onload不但需要解析完文档结构,还要等待所有需要加载的内容加载完毕(比如图片等) 因为$(document).ready(fn)的频繁使用,所以可以简化为$(fn)
安装配置Tomcat,MySQL软件 下载JDBC驱动程序mysql-connector-java-5.1.10-bin.jar,复制到Tomcat安装目录的common\lib文件夹下。 首先,使用Tomcat的Web管理应用配置数据源。 启动Tomcat服务器,打开浏览器,输入http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Flocalhost%3A8080%2Fadmin%2F&urlrefer=b0f14b33457a78496565f40b3565c0b2(其中localhost是名称服务器或称为主机)。如果你的Tomcat是6.0版本以上,需要自己下载admin的插件包,并进行配置。 进入管理界面的登陆页面,这时候请输入原来安装时要求输入的用户名和密码,登陆到管理界面。如果忘记密码可以到Tomcat安装目录下conf文件夹下的tomcat-users.xml中查看。 选择Resources-Data sources进入配置数据源界面,选择Data Source Actions ->选择Create New Data Source,进入配置详细信息界面,内容如下: JNDI Name: jdbc/mysql Data Source URL: jdbc:mysql://localhost:3306/dem (dem是数据库名) JDBC Driver Class: com.mysql.jdbc.Driver User Name: root(数据库用户名) Password: ********(密码) Max. Active Connections: 4 Max. Idle Connections: 2 Max. Wait for Connection: 5000 Validation Query: 最后点击Save和Commit Change. 然后,修改web.xml和%TOMCAT_HOME%\conf\Catalina\localhost下对应你的引用的配置文件。 打开%TOMCAT_HOME%\conf\web.xml,在</web-app>的前面添加以下内容: <resource-ref> <description>DB Connection</description> <res-ref-name>jdbc/mysql</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> 注意res-ref-name填写的内容要与在上文提到的JNDI Name名称一致。 进入%TOMCAT_HOME%\conf\Catalina\localhost下,找到你的web应用对应的.xml文件),如 myweb.xml,并在此文件的下添入代码: <ResourceLink name="jdbc/mysql" global="jdbc/mysql" type="javax.sql.DataSourcer"/> 到这里,配置工作就基本完成了。 测试JSP文件: <% String driverName = "com.mysql.jdbc.Driver";// 驱动程序名 String userName = "root"; // 数据库用户名 String userPassword = "111111"; // 密码 String dbName = "dem"; // 数据库名 // 连接字符串 String url = "jdbc:mysql://localhost:3306/" + dbName + "?user=" + userName + "&password=" + userPassword; Class.forName(driverName).newInstance(); Connection conn = DriverManager.getConnection(url); out.println("数据库连接成功"); conn.close(); %>
1 下一页