??xml version="1.0" encoding="utf-8" standalone="yes"?>无码亚洲成a人在线观看,国产亚洲人成网站在线观看不卡,亚洲Av无码一区二区二三区 http://www.tkk7.com/juhongtao/category/6041.htmlzh-cn Thu, 20 Dec 2007 06:45:24 GMT Thu, 20 Dec 2007 06:45:24 GMT 60 request.getParameter("变量?)获取的字W串中原来的加号变成了空|url传? http://www.tkk7.com/juhongtao/archive/2007/12/19/168639.htmljavaGrowing javaGrowing Wed, 19 Dec 2007 01:02:00 GMT http://www.tkk7.com/juhongtao/archive/2007/12/19/168639.html http://www.tkk7.com/juhongtao/comments/168639.html http://www.tkk7.com/juhongtao/archive/2007/12/19/168639.html#Feedback 0 http://www.tkk7.com/juhongtao/comments/commentRss/168639.html http://www.tkk7.com/juhongtao/services/trackbacks/168639.html 原因Q ?url中有些字W被转义Q比如空D~码成加P于是传的参数明明是加P获取的值却成了I格。如何解军_Q如果是通过url传递参敎ͼ应该对其q行必要的编码?br />解决办法Q?br /> 在javascript中加入 ?function URLencode(sStr) { return escape(sStr).replace(/\+/g, '%2B').replace(/\"/g,'%22').replace(/\'/g, '%27').replace(/\//g,'%2F'); } 对字W串q行处理.如:var str=URLencode("abc+") ]]> JSP文g下蝲及出现getOutputStream() has already been called for this response的解x?转蝲) http://www.tkk7.com/juhongtao/archive/2006/11/10/80386.htmljavaGrowing javaGrowing Fri, 10 Nov 2006 06:25:00 GMT http://www.tkk7.com/juhongtao/archive/2006/11/10/80386.html http://www.tkk7.com/juhongtao/comments/80386.html http://www.tkk7.com/juhongtao/archive/2006/11/10/80386.html#Feedback 0 http://www.tkk7.com/juhongtao/comments/commentRss/80386.html http://www.tkk7.com/juhongtao/services/trackbacks/80386.html 1、web.xml文g中增?br /> < mime-mapping > < extension > doc </ extension > < mime-type > application/vnd.ms-word </ mime-type > </ mime-mapping > 2、程序如下:
二、采用文件流输出的方式下?br /> 1、web.xml文g中增?br /> < mime-mapping > < extension > doc </ extension > < mime-type > application/vnd.ms-word </ mime-type > </ mime-mapping > 2、程序如下:
]]>用jsp面~存 http://www.tkk7.com/juhongtao/archive/2006/11/08/79846.htmljavaGrowing javaGrowing Wed, 08 Nov 2006 06:42:00 GMT http://www.tkk7.com/juhongtao/archive/2006/11/08/79846.html http://www.tkk7.com/juhongtao/comments/79846.html http://www.tkk7.com/juhongtao/archive/2006/11/08/79846.html#Feedback 0 http://www.tkk7.com/juhongtao/comments/commentRss/79846.html http://www.tkk7.com/juhongtao/services/trackbacks/79846.html response.setHeader("Cache-Control","no-cache"); //HTTP 1.1
response.setHeader("Pragma","no-cache"); //HTTP 1.0
response.setDateHeader ("Expires", 0); //prevents caching at the proxy server
]]>javabean实现文g上传 http://www.tkk7.com/juhongtao/archive/2006/11/03/78900.htmljavaGrowing javaGrowing Fri, 03 Nov 2006 05:12:00 GMT http://www.tkk7.com/juhongtao/archive/2006/11/03/78900.html http://www.tkk7.com/juhongtao/comments/78900.html http://www.tkk7.com/juhongtao/archive/2006/11/03/78900.html#Feedback 0 http://www.tkk7.com/juhongtao/comments/commentRss/78900.html http://www.tkk7.com/juhongtao/services/trackbacks/78900.html 要实现文件上载,我们必须先了解上载文件的HTTPh。下面这个简单的应用C了如何上载文件以及把HTTPh的原始数据写入文件?
用文本编辑器查看该文件即可了解请求的格式Q在此基上我们就可以提取Z载文件的名字、文件内容以及原本合在一L其他信息? q个单的应用是开发真正文件上载JavaBean的准备工作。它׃个文件构成:HTML文gmain.htmlQJSP面Jsp1.jspQJavaBean文gSimpleBean.java? main.html提供一个表单,用户从这里选择文gq把文g上蝲到服务器。main.html的代码如下: <html> <head> <title>文g上蝲</title> </head> <body> <form action="jsp1.jsp" enctype="MULTIPART/FORM-DATA" method=post> 作? <input type="text" name="author" /> <br /> 公司: <input type="text" name="company" /> <br /> 选择要上载的文g <input type="file" name="filename" /> <br /> <input type="submit" value="上蝲" /> </form> </body> </html> 可以看到Q?lt;form>标记有一个enctype属性,属性值是"MULTIPART/FORM-DATA"。包括提交按钮在内,表单里面共有4个输入元素。前面两个输入元素是普通的text元素Q即author和company。第三个输入元素的type属性是fileQ这个输入元素就是用来选择文g的元素? 表单的action属性值是Jsp1.jspQ这意味着hQ包括上载的文gQ将发送给Jsp1.jsp文g。Jsp1.jsp单地调用名ؓSimpleBean的JavaBean? <jsp:useBean id="TheBean" scope="page" class="SimpleBean " /> <% TheBean.doUpload(request); %> 下面是SimpleBean的实C码: import java.io.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletInputStream; public class FileUploadBean { public void doUpload(HttpServletRequest request) throws IOException { PrintWriter pw = new PrintWriter( new BufferedWriter(new FileWriter("Demo.out"))); ServletInputStream in = request.getInputStream(); int i = in.read(); while (i != -1) { pw.print((char) i); i = in.read(); } pw.close(); } } q个JavaBean把HttpServletRequest对象的表单原始数据写入Demo.out文g。应用的用户界面由main.html文g提供Q如下图所C? 我们选择上蝲的文件是abisco.html。选择上蝲HTML文g是ؓ了便于观察上载后的格式,因ؓHTML文g本质上是文本文gQ我们可以方便地览其内宏Vabisco.html文g的内容如下: <html> <head> <title>Abisco</title> </head> </html> 点击“上载”按钮之后,表单发送给了Jsp1.jsp文gQ一起发送的q有abisco.html文g。Jsp1.jsp文g不会向浏览器发送Q何应{内容,但它会生成一个Demo.out文g? 打开Demo.out文gQ我们可以看到如下内容: -----------------------------7d15340138 Content-Disposition: form-data; name="Author" A. Christie -----------------------------7d15340138 Content-Disposition: form-data; name="Company" Abisco -----------------------------7d15340138 Content-Disposition: form-data; name="Filename"; filename="C:123dataabisco.html" Content-Type: text/html <html> <head> <title>Abisco</title> </head> </html> -----------------------------7d15340138-- 可以看到QHTTPh体内包含了所有的表单输入Q包括上载的文g。这些输入数据的分隔׃个分隔符实现。分隔符׃pd的?”字W和一个随机数字构成。在上面的例子中Q分隔符为?----------------------------7d15340138”。最后一个分隔符l束h体,q个分隔W的后面多出两个?”符受? 对于非文件类型的输入数据Q分隔符后面跟着下面q行内容QContent-Disposition: form-data; name=inputName。其中inputName是表单元素的名字。例如:Content-Disposition: form-data; name="Author"。在q行内容的后面,紧跟着两个q箋的回车换行符和表单元素倹{? 而对于文件型输入域,分隔W的后面有两行内宏V第一行内容包含输入元素的名字以及上蝲文g在客L的完整\径,如上例中q行内容是“Content-Disposition: form-data; name="Filename"; filename="C:123dataabisco.html"”。这行内Ҏ出文件输入元素的名字是filenameQ文件的路径是“C:123dataabisco.html”。注意Windows览器会讄文g路径Q而Unix/Linux以及Mac览器只发送文件名字? W二行包含了文g的内容类型,因此它的具体内容和上载的文g有关。本例中W二行的内容是“Content-Type: text/html”? 和非文g输入元素一P文g内容在两个连l的回R换行W之后正式开始? 上蝲文g 众所周知QJavaBean是Javaq_的Y件组Ӟ下面要实现的上蝲功能是用JavaBean实现Q所以它可以方便地应用到M需要文件上载功能的应用之中? 代码清单如下Q? package com.brainysoftware.web; import javax.servlet.http.HttpServletRequest; import javax.servlet.ServletInputStream; import java.util.Dictionary; import java.util.Hashtable; import java.io.PrintWriter; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class FileUploadBean { private String savePath, filepath, filename, contentType; private Dictionary fields; public String getFilename() { return filename; } public String getFilepath() { return filepath; } public void setSavePath(String savePath) { this.savePath = savePath; } public String getContentType() { return contentType; } public String getFieldValue(String fieldName) { if (fields == null || fieldName == null) return null; return (String) fields.get(fieldName); } private void setFilename(String s) { if (s==null) return; int pos = s.indexOf("filename=""); if (pos != -1) { filepath = s.substring(pos+10, s.length()-1); // Windows览器发送完整的文g路径和名? // 但Linux/Unix和Mac览器只发送文件名? pos = filepath.lastIndexOf("\"); if (pos != -1) filename = filepath.substring(pos + 1); else filename = filepath; } } private void setContentType(String s) { if (s==null) return; int pos = s.indexOf(": "); if (pos != -1) contentType = s.substring(pos+2, s.length()); } public void doUpload(HttpServletRequest request) throws IOException { ServletInputStream in = request.getInputStream(); byte[] line = new byte[128]; int i = in.readLine(line, 0, 128); if (i < 3) return; int boundaryLength = i - 2; String boundary = new String(line, 0, boundaryLength); //-2丢弃换行字符 fields = new Hashtable(); while (i != -1) { String newLine = new String(line, 0, i); if (newLine.startsWith("Content-Disposition: form-data; name="")) { if (newLine.indexOf("filename="") != -1) { setFilename(new String(line, 0, i-2)); if (filename==null) return; //文g内容 i = in.readLine(line, 0, 128); setContentType(new String(line, 0, i-2)); i = in.readLine(line, 0, 128); //I i = in.readLine(line, 0, 128); newLine = new String(line, 0, i); PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter((savePath==null? "" : savePath) + filename))); while (i != -1 && !newLine.startsWith(boundary)) { // 文g内容的最后一行包含换行字W? // 因此我们必须查当前行是否是最 // 后一? i = in.readLine(line, 0, 128); if ((i==boundaryLength+2 || i==boundaryLength+4) && (new String(line, 0, i).startsWith(boundary))) pw.print(newLine.substring(0, newLine.length()-2)); else pw.print(newLine); newLine = new String(line, 0, i); } pw.close(); } else { // 普通表单输入元? // 获取输入元素名字 int pos = newLine.indexOf("name=""); String fieldName = newLine.substring(pos+6, newLine.length()-3); i = in.readLine(line, 0, 128); i = in.readLine(line, 0, 128); newLine = new String(line, 0, i); StringBuffer fieldValue = new StringBuffer(128); while (i != -1 && !newLine.startsWith(boundary)) { // 最后一行包含换行字W? // 因此我们必须查当前行是否是最后一? i = in.readLine(line, 0, 128); if ((i==boundaryLength+2 || i==boundaryLength+4) && (new String(line, 0, i).startsWith(boundary))) fieldValue.append(newLine.substring(0, newLine.length()-2)); else fieldValue.append(newLine); newLine = new String(line, 0, i); } fields.put(fieldName, fieldValue.toString()); } } i = in.readLine(line, 0, 128); } } } 代码的第一行是包声明,如果你不惌该类从属于Q何包Q可以删除这行代码。接下来的几行代码声明了该JavaBean所要引用的各个cd接口? FileUploadBeancL5个私有的属性(域)Q?个公用的ҎQ?个私有的Ҏ? 属? FileUploadBeancȝ5个域都是U有的,它们是: private String savePath 该域指定了文件上载后保存到服务器的哪一个\径。savePath的值用setSavePathҎ讄。这个值应该在调用doUploadҎ之前讄Q如没有讄Q上载后的文件将保存到服务器的默认目录? private String filepath 该域指定了上载文件在客户端的完整路径。filepath的值由doUploadҎ讄Q在JSP面或者Servlet中调用getFilepathҎ可以获取filepath域的倹{对于非Windows下的览器,该值等于filename? private String filename 该域是上载文件的名字。filename的值由setFilenameҎ讄。在JSP或者Servlet中调用getFilenameҎ可以获取filename域的倹{? private String contentType 该域是上载文件的内容cd。contentType的值由doUploadҎ讄Q你可以用getContentTypeҎ获得contentType域的倹{? private Dictionary fields fields域保存了用户在表单中输入数据的名?值对。调用getFieldValueҎ可以获取表单输入元素的倹{? Ҏ 前面四个publiccd的方法用于返回FileUploadBean对象的私有域Q它们是QgetFilepathQgetFilenameQgetContentType以及getFieldValue? public String getFilepath() q回filepathU有域的倹{? public String getFilename() q回filenameU有域的倹{? public String getContentType() q回contentTypeU有域的倹{? public String getFieldValue(String fieldName) q回HTML表单中指定输入元素的|元素的名字通过fieldName参数指定? public void setSavePath(String savePath) 用该Ҏ指定服务器上保存上蝲文g的目录的名字? public void doUpload(HttpServletRequest request) throws IOException doUpload是FileUploadBeancM最重要的一个方法。它的Q务有二个Q第一Q它从HTML表单提取入域的名字和值ƈ保存到Dictionary对象Q第二,doUploadҎ提取Z载的文gQ把q个文g保存到savePath指定的\径,q分别把文g的名字、\径、内容类型赋lfilename、filepath和contentType域? private void setContentType(String s) 由doUploadҎ调用。setContentTypeҎ从原始字节数据提取出上蝲文g的内容类型? private void setFilename(String s) 由doUploadҎ调用。setFilenameҎ从原始字节数据提取出文g路径和名字? doUploadҎ的参数是Servlet/JSP容器创徏的HttpServletRequest对象。HttpServletRequest对象描述了程序ؓ了提取出HTML表单元素名字-值对以及上蝲文g必须处理的HTTPh。doUploadҎ首先通过HttpServletRequest对象的getInputStreamҎ获得ServletInputStream对象? 如前所qͼ每一个表单元素由分界W和一l回车换行符分隔。因此,我们可以一行一行地dHttpServletRequest对象的内宏V下面这行代码定义了一个名为line的byte数组Q? byte[] line = new byte[128]; 然后Q我们用ServletInputStream对象的readLineҎdHttpServletRequest对象内容的第一行: int i = in.readLine(line, 0, 128); W一行应该是分界W,而且如果没有错误的话Q它的长度应该大?。如果它的长度小?Q我们可以认为出C错误QdoUploadҎ应该立即q回Q? if (i < 3) return; 分界W和分界W的长度都非帔R要,从本文后面你可以看到q一炏V分界符׃l回车换行符l束Q因此它的实际长度要比readLineҎq回的字节数?? int boundaryLength = i - 2; 丢弃byte数组line的最?个回车换行符卛_获得分界W: String boundary = new String(line, 0, boundaryLength); 接下来,fields域被实例化成Hashtable对象。这个Hashtable对象用来保存HTML表单元素的名?值对? fields = new Hashtable(); ׃已经有了分界W,接下来我们就可以开始提取出表单元素的倹{具体方法是用一个while循环按行dHttpServletRequest对象的内容,直至遇到内容l束readLineҎq回-1为止。所有的表单元素都以分界W开始,后面跟上“Content-Disposition”行Q这一行由下面q些字符开始: Content-Disposition: form-data; name= 表单元素有两U类型:文gQ非文gQ普通的表单元素Q如TEXT或者HIDDEN元素Q。这两种表单元素的区别在于文件元素包含字W串“filename="filename"”。由此,我们可以利用该信息把文g和非文g的表单输入元素区别开来,代码如下Q? if (newLine.startsWith("Content-Disposition: form-data; name="")) { if (newLine.indexOf("filename="") != -1) { // 文g型表单输入元? // q里加上提取文g的代? . . . } else { // 普通表单输入元? // q里加上提取表单元素的代? . . . } } 现在Q我们首先来看看提取文g内容的代码? 文g路径包含在“Content-Disposition”的后面。ؓ提取文g路径和文件名字,doUploadҎ调用了setFilenameU有Ҏ。setFilenameҎ提取出文件\径和文g名字信息Q然后把它们赋值给filepath和filename域。调用setFilenameҎ之后Qfilename域应该不再是null。如果此时filename域仍旧是nullQ则说明遇到了问题,doUploadҎ直接q回? if (filename==null) return; “Content-Disposition”行之后的下一行是内容cd行。因此,doUploadҎ接着调用readLineҎQ然后调用setContentTypeU有Ҏ。setContentTypeҎ和setFilenameҎ怼Q它从原始字节数据中提取Z载文件的内容cdq保存到contentType域? 紧接内容cd行的下一行是IQ因此程序再调用了一ơreadLineҎ? i = in.readLine(line, 0, 128); 接下来开始了真正的文件内宏V我们先应该做好通过PrintWriter对象把文件写入磁盘的准备? PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(( savePath==null? "" : savePath ) + filename))); 上蝲文g保存到哪个位|取决于savePath域是否已l设|。如果savePath域没有设|,它的值是nullQ则文g被保存到默认目录;如果savePath域已l设|,它的g是nullQ则上蝲的文件被保存到它所指定的目录? 然后我们可以提取文件的内容。具体方法是使用while循环Q每ơ@环读入一行内容ƈ通过PrintWriter的输出方法把它写入磁盘。但我们知道Q文件的最后一行包含两个回车换行符P所以保存到盘的字节数据不应该包含q两个字W。因此,如果d的行不是文g的最后一行,我们把所有读到的字节数据写入盘Q如果读入的行已l是文g的最后一行,写入盘的字节数据要减去最后两个字W? 然而,我们q不知道文g的大,我们只知道紧接文件内容的下一行又是一个分界符Q或者,如果文g是最后一个HTML表单元素Q接下来的一行是分界W加上两个短划线字符。因此,只要查下一行内Ҏ否是分界W,我们q道了何时应该l束while循环。这是前面说分界符很重要的原因Q在q里我们必须用到分界W? 虽然我们可以d下一行内容然后用startsWithҎ查它是否是一个分界符Q然而,׃字符串操作的开销非常大,Z减少字符串操作,我们比较readLined的字节数l的长度。后者应该等于boundaryLength + 2Q或者,如果它是HttpServletRequest对象中的最后一行,׃多出了最后两个短划线字符Q它应该{于boundaryLength + 4。由于一行内容即使不是分界符也可以和分界W一样长Q当长度匚w之后我们又将它与分界W比较。这是前面提到boundaryLength很重要的原因了? 整个处理q程的实C码如下: while (i != -1 && !newLine.startsWith(boundary)) { i = in.readLine(line, 0, 128); if ((i==boundaryLength+2 || i==boundaryLength+4) && (new String(line, 0, i).startsWith(boundary))) pw.print(newLine.substring(0, newLine.length()-2)); else pw.print(newLine); newLine = new String(line, 0, i); } 把文件内容保存到盘之后Q我们关闭了PrintWriter? pw.close(); 非文件的表单元素也可以用cM的方法提取。不同之处在于,此时我们不再把数据写入磁盘,而是把名?值对保存到Dictionary对象? fields.put(fieldName, fieldValue.toString()); 应用实例 ~译好Bean之后Q我们就可以从Servlet或者JSP面中用它了。可能你在Tomcat之类的Servlet/JSP环境下用BeanQ部|Bean最单的Ҏ是把class文g压羃成jar文gQ然而把jar文g攑ֈTomcat的lib目录下。要让Tomcat装入jar文gQ你必须重新启动Tomcat? 下面是一个HTML文g和一个JSP文gQ它们示范了q个Bean的应用。HTML文g包含一个表单以及几个输入元素: <html> <head> <title>文g上蝲</title> </head> <body> <form action=jsp1.jsp enctype="MULTIPART/FORM-DATA" method=post> 作? <input type=text name=author> <br> 公司: <input type=text name=company> <br> 说明: <textarea name=comment></textarea> <br> 选择要上载的文g<input type=file name=filename> <br> 文g描述: <input type=text name=description> <br> <input type=submit value="Upload"> </form> </body> </html> 用户提交上述表单之后Q该HTTPh由Jsp1.jsp处理。Jsp1.jspq用FileUploadq个Bean来处理请求。Jsp1.jsp的代码如下: <%@ page contentType="text/html;charset=gb2312"%> <jsp:useBean id="TheBean" scope="page" class="com.brainysoftware.web.FileUploadBean" /> <% TheBean.doUpload(request); out.println("Filename:" + TheBean.getFilename()); out.println("<BR>内容cd:" + TheBean.getContentType()); out.println("<BR>作?" + TheBean.getFieldValue("Author")); out.println("<BR>公司:" + TheBean.getFieldValue("Company")); out.println("<BR>说明:" + TheBean.getFieldValue("Comment")); %> ]]> 使用XMLHTTP Request Object获取服务器数? http://www.tkk7.com/juhongtao/archive/2006/07/29/60703.htmljavaGrowing javaGrowing Sat, 29 Jul 2006 03:46:00 GMT http://www.tkk7.com/juhongtao/archive/2006/07/29/60703.html http://www.tkk7.com/juhongtao/comments/60703.html http://www.tkk7.com/juhongtao/archive/2006/07/29/60703.html#Feedback 0 http://www.tkk7.com/juhongtao/comments/commentRss/60703.html http://www.tkk7.com/juhongtao/services/trackbacks/60703.html 同时让我们高兴得是xmlhttpq不是IEҎ的东西,虽然目前q不?a >W3C的标准,不过IE, Netscape/Mozilla, 和Safari都支持。在IE中我们用new ActiveXObject('MSXML2.XMLHTTP')或者new ActiveXObject("Microsoft.XMLHTTP")来获得的xmlhttp对象实例Q用前者还是后者和客户端机器安装的MSXML版本有关。在Netscape/Mozilla和Safari中,使用new XMLHttpRequest()来获得xmlhttp对象实例。比如在IE中,我们通常q样使用Q?
var xmlhttp = null ; try { xmlhttp = new ActiveXObject( " MSXML2.XMLHTTP " ); } catch (e) { try { xmlhttp = new ActiveXObject( " Microsoft.XMLHTTP " ); } catch (e2){} }
使用xmlhttp对象其实是ƈ不是什么困隄事,它一共就6个方?个属性。不q它最主要的是提供了两U执行模式:同步模式和异步模式。同步模式可以比较精的控制E序程Q可是如果服务器的Response太慢Qbrowser会有L失去相应的问题;而用异步模式由于是事g触发方式控制程Q会l程序运行带来一些不可与预计的问题,因ؓ你不知道客户端等待服务器Response的过E中Q用户会在browser里做什么操?img height="19" src="http://www.cnblogs.com/Emoticons/emsad.gif" width="19" align="absMiddle" border="0" />。? 下面是一个同步方式获取服务器数据的简单示例:
function GetRemoteData(url) { var xmlhttp = new ActiveXObject( " Microsoft.XMLHTTP " ); try { xmlhttp.open ('GET', url, false ); if ( xmlhttp.status == 200 ) { return xmlhttp.responseText; } throw ''; } catch (e) { return ''; } } XMLHTTP对象的属性和Ҏ列表(来自IXMLHTTPRequest接口)Q?
Name Type Description onreadystatechange N/A 指定当就l状态发生改变时调用的事件处理函敎ͼ仅用于异步操作? readyState Long 异步操作的状态:未初始化(0)Q正在加?1)Q已加蝲(2)Q交?3)Q已完成(4) responseBody Variant 响应信息正文作为unsigned byte数组q回 responseStream Variant 响应信息正文作Z个ADO Stream对象q回 responseText String 响应信息正文作Z个文本字W串q回 responseXML Object 通过XMLDom响应信息正文解析ؓXMLDocument对象 status Long 服务器返回的HTTP状态码 statusText String 服务器HTTP响应行状?/td>
Name Desciption abort 取消当前 HTTP h getAllResponseHeaders 从响应信息中索所有的标头字段 getResponseHeader 从响应信息正文中获得一?HTTP 标头?/td> open(method, url, boolAsync, bstrUser, bstrPassword) 打开一个与 HTTP 服务器的q接 send(varBody) 讑֮一个请求的标头字段 setRequestHeader(bstrHeader, bstrValue) ?HTTP 服务器发送请求。可包含正文?/td>
q里面显然就openҎ比较ȝQ带了一大堆参数Q它们的含义分别是:
Parameter Description method HTTP的通信方式Q比如GET, HEAD, POST, PUT, DELETE, CONNECT{?/td> url 接收数据的服务器的URL地址QURL可带QueryString boolAsync 一个布标识,说明h是否为异步的。如果是异步通信方式Q客L׃{待服务器的响应Q如果是同步方式Q客h会等到服务器q回消息后才L行其它操?/td> bstrUser 用户IDQ用于服务器w䆾验证 bstrPassword 用户密码Q用于服务器w䆾验证
异步通讯的示例: xmlhttp.open (" GET " , " default.aspx " , true ); xmlhttp.onreadystatechange = function () { if ( xmlhttp.readyState == 4 ) { alert(xmlhttp.responseText); } } xmlhttp.send( null ); 其实使用xmlhttpp么简单,复杂的是服务器端数据的组l方式,而且需要开发h员同时熟悉Client和Server端的开发,才能事半功倍。可是好像说了半天这个玩意儿和xml没有什么关pdQ怎么叫xmlhttp呢?我们注意到response的数据类型中有一个responseXMLQ不q它解析q回的XMLDocument属于XMLDOM 的内容了Q和使用xmlhttp来和服务器通讯的关pdƈ不大Q以后再来细说?
]]>servlet 获取out对象 http://www.tkk7.com/juhongtao/archive/2006/06/14/52865.htmljavaGrowing javaGrowing Wed, 14 Jun 2006 15:15:00 GMT http://www.tkk7.com/juhongtao/archive/2006/06/14/52865.html http://www.tkk7.com/juhongtao/comments/52865.html http://www.tkk7.com/juhongtao/archive/2006/06/14/52865.html#Feedback 0 http://www.tkk7.com/juhongtao/comments/commentRss/52865.html http://www.tkk7.com/juhongtao/services/trackbacks/52865.html
javax.servlet.jsp.JspWriter out; javax.servlet.jsp.PageContext pageContext
=
javax.servlet.jsp.JspFactory.getDefaultFactory().getPageContext(
this
, request, response,
null
,
true
,
8192
,
true
); out
=
pageContext.getOut();
]]> 利用Jakarta Commonslgbeanutils、dbutils化JDBC数据库操作(一Q? http://www.tkk7.com/juhongtao/archive/2005/12/29/25961.htmljavaGrowing javaGrowing Thu, 29 Dec 2005 14:41:00 GMT http://www.tkk7.com/juhongtao/archive/2005/12/29/25961.html http://www.tkk7.com/juhongtao/comments/25961.html http://www.tkk7.com/juhongtao/archive/2005/12/29/25961.html#Feedback 0 http://www.tkk7.com/juhongtao/comments/commentRss/25961.html http://www.tkk7.com/juhongtao/services/trackbacks/25961.html 关键字:beanutils、dbutils、JDBC 数据?BR>摘要Q本文简单介l了Jakarta Commons旗下beanutils、dbutils在基于JDBC API数据库存取操作中的运用?BR> 虽然现在出现了很多ORM框架Q可是还是有很多朋友也许q在使用JDBCQ就像我现在一P除了学习的时候在使用Hibernate、SpringcMq些优秀的框Ӟ工作时一直都在用JDBC。本文就单介l一下利用Jakarta Commons旗下beanutils、dbutils化JDBC数据库操作,以抛砖引玉,希望对像我一样在使用JDBC的朋友有所帮助?BR> 下面分两部分简单介lbeanutils、dbutils在基于JDBC API数据库存取操作中的运用。第一部分显介lbeanutils在JDBC数据库存取操作中的运用,W二部分介绍dbutils在JDBC数据库存取操作中的运用,最后看看他们的优缺点,谈谈本h在项目运用过E中对他们的一点心得体会,仅供参考,其中有错误的地方希望大虾不吝赐教Q大家多多交共同进步?BR>一、Jakarta Commons beanutils Beanutils是操作Bean的锐利武器,其提q的BeanUtils工具cd以简单方便的d或设|Bean的属性,利用DynapdQ还可以在运行期创徏BeanQ符合懒人的习惯Q正如LazyDynaBeanQLazyDynaClass一P呵呵。这些用法已l有很多文章提及Q也可以参考apache的官Ҏ档?BR>对于直接利用JDBC API讉K数据库时Q这里针对的是返回结果集ResultSet的查询selectQ,大多数都是采用两U方式,一U是取出q回的结果集的数据存于Map中,另一U方式是Bean里。针对第二种方式QBeanutils里提供了ResultSetDynaClassl合DynaBean以及RowSetDynaClassl合DynaBean来简化操作。下面用以个单的例子展示一下beanutils的这两个cdJDBC数据库操作中的运用?BR>请在本机建立数据库publishQ我用的是MySQLQ在publish数据库中建立表book,脚本如下Q?BR>CREATE TABLE book( id int(11) NOT NULL auto_increment, title varchar(50) character set latin1 NOT NULL, authors varchar(50) character set latin1 default NULL, PRIMARY KEY (id) ) 然后用你喜欢的编辑器建立一个类BeanutilsJDBCTestQ我们先用ResultSetDynaClass来处理,然后再用RowSetDynaClass来实现同Lc,之后看看他们之间有什么不同,用ResultSetDynaClass处理的源代码如下所C? 然后用你喜欢的编辑器建立一个类BeanutilsJDBCTestQ我们先用ResultSetDynaClass来处理,然后再用RowSetDynaClass来实现同Lc,之后看看他们之间有什么不同,用ResultSetDynaClass处理的源代码如下所C? package cn.qtone.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Iterator; import org.apache.commons.beanutils.DynaBean; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.beanutils.ResultSetDynaClass; public class BeanutilsJDBCTest{ public static void main(String[] args) { Connection con = null; Statement st = null; ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK"; con = DriverManager.getConnection(url, "root", "hyys"); st = con.createStatement(); rs = st.executeQuery("select * from book"); ResultSetDynaClass rsDynaClass = new ResultSetDynaClass(rs); Iterator itr = rsDynaClass.iterator(); System.out.println("title-------------authors"); while (itr.hasNext()) { DynaBean dBean = (DynaBean) itr.next(); System.out.println(PropertyUtils.getSimpleProperty(dBean,"title") + "-------------"+ PropertyUtils.getSimpleProperty(dBean, "authors")); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } if (con != null) { con.close(); } } catch (Exception e) { e.printStackTrace(); } } } } 用RowSetDynaClass处理的源代码如下所C? package cn.qtone.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Iterator; import java.util.List; import org.apache.commons.beanutils.DynaBean; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.beanutils.RowSetDynaClass; public class BeanutilsJDBCTest{ public static void main(String[] args) { List rsDynaClass = rsTest(); System.out.println("title ------------- authors "); Iterator itr = rsDynaClass.iterator(); while (itr.hasNext()) { DynaBean dBean = (DynaBean) itr.next(); try { System.out.println(PropertyUtils.getSimpleProperty(dBean,"name") + "-------------"+ PropertyUtils.getSimpleProperty(dBean, "mobile")); } catch (Exception e) { // TODO 自动生成 catch ?BR> e.printStackTrace(); } } } private static List rsTest() { Connection con = null; Statement st = null; ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK"; con = DriverManager.getConnection(url, "root", "hyys"); st = con.createStatement(); rs = st.executeQuery("select * from book"); RowSetDynaClass rsdc = new RowSetDynaClass(rs); return rsdc.getRows(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (rs != null) { rs.close(); } if (st != null) { st.close(); } if (con != null) { con.close(); } } catch (Exception e) { e.printStackTrace(); } } return null; } } q两个方法输出的l果应该是一L。但是很昄W二U方式比W一U方式要好,它把数据讉K部分抽取出来攑ֈ一个方法中Q显得简单清晰?BR>其实在利用ResultSetDynaClassӞ必须在ResultSet{数据库资源关闭之前Q处理好那些数据Q你不能在资源关闭之后用DynaBeanQ否则就会抛出异常,异常是说不能在ResultSet之后存取数据Q具体的异常名我也忘了)Q当然你也可以采用以前的方式一个一个的把数据放到Map里,如果你一定要那样做,q是别用BeanutilsQ因没带l你什么好处。M利用ResultSetDynaClass你的E序的扩展性非帔R好?BR>从第二中方式可以看出Q利用RowSetDynaClass可以很好的解决上qResultSetDynaClass遇到的问题,RowSetDynaClass的getRows()ҎQ把每一行封装在一个DynaBean对象里,然后Q把说有的行攑ֈ一个List里,之后你就可以对返回的List里的每一个DynaBeanq行处理Q此外对于DynaBean你还可以采用标准的get/set方式处理Q当然你也可以用PropertyUtils. getSimpleProperty(Object bean, String name)q行处理?BR>从上面的分析中,你应该可以决定你应该使用ResultSetDynaClassq是RowSetDynaClass了?/FONT> ]]> 利用Jakarta Commonslgbeanutils、dbutils化JDBC数据库操作(二) http://www.tkk7.com/juhongtao/archive/2005/12/29/25959.htmljavaGrowing javaGrowing Thu, 29 Dec 2005 14:39:00 GMT http://www.tkk7.com/juhongtao/archive/2005/12/29/25959.html http://www.tkk7.com/juhongtao/comments/25959.html http://www.tkk7.com/juhongtao/archive/2005/12/29/25959.html#Feedback 0 http://www.tkk7.com/juhongtao/comments/commentRss/25959.html http://www.tkk7.com/juhongtao/services/trackbacks/25959.html 二、Jakarta Commons dbutilsQ?BR> 用JDBC API时最令h讨厌的就是异常处理,也很烦琐Q而且很容易出错,本h曾考虑q利用模板进行处理,后来看到了dbutilsQ之后就采用那个dbutilsQ采用模板的方式各位朋友可以参考SpringQSpring的JdbcTemplate不灵z而强大,呵呵Q说句闲话,实在太佩服Rod Johnson了,Rod Johnson真的很o人尊敬?BR> Dbutils的QueryRunner把大多数与关闭资源相关的装hQ另外,你也可以使用DbUtilsq行关闭Q当然DbUtils提供的功能当然不止这些,它提q了几个常用的静态方法,除了上述的关闭资源外QDbUtils. commitAndClose(Connection conn)q提供事务提及等操作?BR>q是以一个例子来说说吧,毕竟我不是搞业务的,嘴巴吧嗒吧哒不h啊,呵呵?BR> Z和采用Beanutils更好的进行对比,q个例子q是实现同样的功能,数据库同样采用前一文章中提到的publish?BR>同样的,用你喜欢的编辑器建立一个类DbutilsJDBCTestQ示例代码如下所C? package cn.qtone.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.List; import java.util.Map; import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.MapListHandler; public class DbutilsJDBCTest{ public static void main(String[] args) { Connection conn = null; String jdbcURL = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK"; String jdbcDriver = "com.mysql.jdbc.Driver"; try { DbUtils.loadDriver(jdbcDriver); // Username "root". Password "root" conn = DriverManager.getConnection(jdbcURL, "root", "root"); QueryRunner qRunner = new QueryRunner(); System.out.println("***Using MapListHandler***"); //以下部分代码采用Map存储方式Q可以采用Bean的方式代替进行处?BR> List lMap = (List) qRunner.query(conn, "select title,authors from books", new MapListHandler()); //以下是处理代码,可以抽取出来 System.out.println("title ------------- authors "); for (int i = 0; i < lMap.size(); i++) { Map vals = (Map) lMap.get(i); System.out.println(vals.get("title")+"-------------"+ vals.get("authors")); } } catch (SQLException ex) { ex.printStackTrace(); } finally { DbUtils.closeQuietly(conn); } } } 怎么?是不是比采用Beanutils的ResultSetDynaTrial和RowSetDynaClass好多了?采用Beanutils令h隄的是关闭那些资源以及处理那些异常Q而这里采用Dbutils昄代码量减了很多?BR>上例在处理结果集Ӟ它把数据库中的每一行映成一个MapQ其中列名作为KeyQ该列对应的g为Value存放Q查询的所有的数据一h在一个List里,然后q行处理Q当Ӟ一个更明智的处理是直接q回List然后再单独进行处理?BR>事实上上例返回的l果集中的每一行不必放在一个Map里,你可以放在一个Bean里,当然如果你真的很懒,你也可以使用Beanutils的LazyDynaClass和LazyDynaBeanQ不q也许没有必要那么做Q至于原因请看下文?BR> 如果使用Bean而不是用MapQ那么,你也讔R要徏立一个BeanQ如下: package cn.qtone.test; public class Book { public int id; public String title; public String authors ; public StudentBean() { } public String getAuthors() { return authors; } public void setAuthors(String authors) { this.authors = authors; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } 然后单修改一下DbutilsJDBCTest 中的部分代码卛_Q代替之后的源代码如下: package cn.qtone.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.List; import java.util.Map; import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanListHandler; public class DbutilsJDBCTest{ public static void main(String[] args) { Connection conn = null; String jdbcURL = "jdbc:mysql://127.0.0.1:3306/publish?useUnicode=true&characterEncoding=GBK"; String jdbcDriver = "com.mysql.jdbc.Driver"; try { DbUtils.loadDriver(jdbcDriver); // Username "root". Password "root" conn = DriverManager.getConnection(jdbcURL, "root", "root"); QueryRunner qRunner = new QueryRunner(); System.out.println("***Using BeanListHandler ***"); //以下部分代码采用Map存储方式Q可以采用Bean的方式代替进行处?BR>List lBeans = (List) qRunner.query(conn," select title,authors from books ", new BeanListHandler(Book.class)); //以下是处理代码,可以抽取出来 System.out.println("title ------------- authors "); for (int i = 0; i < lBeans.size(); i++) { Book vals = (Book) lBeans.get(i); System.out.println(vals.getTitle ()+"-------------"+ vals. getAuthors ()); } } catch (SQLException ex) { ex.printStackTrace(); } finally { DbUtils.closeQuietly(conn); } } } q两U法输出的结果应该是一L。两U处理方式都差不多,但我更愿意采用第一U,因ؓW一U少写一个beanQ而且我测试过采用Map的方式即W一U方式性能要好的多Q采用Bean性能比较低可能是因ؓ采用反射的缘故,采用反射的东东性能和不采用反射的还是有点差距。也是这个原因,不推荐采用LazyDynaClass和LazyDynaBeanQ因为采用这二者是在运行期动态创建BeancdBean属性,然后再创建Bean对象的,其性能可想而知了(不过我没有测试过啊,所以我说这个话可说是没有根据的Q感兴趣的朋友自己测试一下,记得告诉我结果哦Q呵呵)Q除了MapListHandler以及BeanListHandler之外QDButilsq提供了其他的HandlerQ如果这些不能满你的需求,你也可以自己实现一个Handler?BR> 最后,也是最大的体会,也许是最大的收获吧,那就?对于每一个项?在根据每一个需求获取相应解x案时,先寻扑ּ源组?看是否已l有满某些功能需求的开源组?如果没有,再考虑自主开发或者向W三方购乎ͼ否则量采用开源组? 请尽量n用开源的力Q尽情的拥抱开源吧?BR> 好了Q终于写完了Q有什么问题请联系我,大家互相交流交流?BR> ]]>
վ֩ģ壺
AV߹ۿ |
4444˾Ʒ |
ѹۿ |
Ʒվ |
Ұ¾þø |
պëƬƵ |
VV |
ٸ̫߳ˬ߹ۿ |
ƷŮͬһѲ |
AVƬ߹ۻ |
AAƬٸAAƬֱ |
ݾ߹ۿվ |
Ƶһ |
Ƶۿ |
þþƷѿ |
ޱר |
ɫۺվ |
ֻ߹ۿƵ
|
۵Ӱ߹ۿ |
ԶƵ߹ۿѲ |
Ƭһ |
պ |
þþþþ77777 |
AV߹ۿ |
뾫Ʒ123ѿ |
һ |
˳77777߲վ |
պƵۿ |
69ʽƵ |
Ѿþˬˬav |
ҹӰ |
AVպۺһ |
ŷ߹ۿ |
Ļߵ |
Ļѹۿ |
õĻ2019
|
99þѹ㽶鶹 |
һѹۿ |
һѿ |
һۺ |
ۺС˵ͼƬͼ |