??xml version="1.0" encoding="utf-8" standalone="yes"?>无码亚洲成a人在线观看,国产亚洲人成网站在线观看不卡,亚洲Av无码一区二区二三区http://www.tkk7.com/juhongtao/category/6041.htmlzh-cnThu, 20 Dec 2007 06:45:24 GMTThu, 20 Dec 2007 06:45:24 GMT60request.getParameter("变量?)获取的字W串中原来的加号变成了空|url传? http://www.tkk7.com/juhongtao/archive/2007/12/19/168639.htmljavaGrowingjavaGrowingWed, 19 Dec 2007 01:02:00 GMThttp://www.tkk7.com/juhongtao/archive/2007/12/19/168639.htmlhttp://www.tkk7.com/juhongtao/comments/168639.htmlhttp://www.tkk7.com/juhongtao/archive/2007/12/19/168639.html#Feedback0http://www.tkk7.com/juhongtao/comments/commentRss/168639.htmlhttp://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+")


javaGrowing 2007-12-19 09:02 发表评论
]]>
JSP文g下蝲及出现getOutputStream() has already been called for this response的解x?转蝲)http://www.tkk7.com/juhongtao/archive/2006/11/10/80386.htmljavaGrowingjavaGrowingFri, 10 Nov 2006 06:25:00 GMThttp://www.tkk7.com/juhongtao/archive/2006/11/10/80386.htmlhttp://www.tkk7.com/juhongtao/comments/80386.htmlhttp://www.tkk7.com/juhongtao/archive/2006/11/10/80386.html#Feedback0http://www.tkk7.com/juhongtao/comments/commentRss/80386.htmlhttp://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、程序如下:

   
<%@page language="java" import="java.net.*" pageEncoding="gb2312"%>
<%
 
response.setContentType(
"application/x-download");//讄Z载application/x-download
    String filenamedownload = "/pȝ解决Ҏ.doc";//卛_下蝲的文件的相对路径
    String filenamedisplay = "pȝ解决Ҏ.doc";//下蝲文g时显C的文g保存名称
    filenamedisplay = URLEncoder.encode(filenamedisplay,"UTF-8");
    response.addHeader(
"Content-Disposition","attachment;filename=" + filenamedisplay);
    
    
try
    
{
        RequestDispatcher dispatcher 
= application.getRequestDispatcher(filenamedownload);
        
if(dispatcher != null)
        
{
            dispatcher.forward(request,response);
        }

        response.flushBuffer();
    }

    
catch(Exception e)
    
{
        e.printStackTrace();
    }

    
finally
    
{
    
    }

%>



二、采用文件流输出的方式下?br />
1、web.xml文g中增?br />
  <mime-mapping>
    
<extension>doc</extension>
    
<mime-type>application/vnd.ms-word</mime-type>
  
</mime-mapping>



2、程序如下:

   
<%@page language="java" contentType="application/x-msdownload" import="java.io.*,java.net.*" pageEncoding="gb2312"%>
<%

//关于文g下蝲旉用文件流输出的方式处理:
    
//加上response.reset()Qƈ且所有的Q?gt;后面不要换行Q包括最后一个;
    
//因ؓApplication Server在处理编译jsp时对于%>?lt;Q之间的内容一般是原样输出Q而且默认是PrintWriterQ?br />    //而你却要q行输出:ServletOutputStreamQ这样做相当于试囑֜Servlet中用两U输出机Ӟ
    
//׃发生QgetOutputStream() has already been called for this response的错?br />    //详细误《More Java Pitfill》一书的W二部分 Web层Item 33Q试囑֜Servlet中用两U输出机制?70
    
//而且如果有换行,对于文本文g没有什么问题,但是对于其它格式Q比如AutoCAD、Word、Excel{文?br />    //下蝲下来的文件中׃多出一些换行符0x0d?x0aQ这样可能导致某些格式的文g无法打开Q有些也可以正常打开?/span>

    response.reset();
//可以加也可以不加
    response.setContentType("application/x-download");//讄Z载application/x-download
    
// /../../退WEB-INF/classes两到应用的根目录下去,注意Tomcat与WebLogic下面q一句得到的路径不同QWebLogic中\径最后没?
    System.out.println(this.getClass().getClassLoader().getResource("/").getPath());
    String filenamedownload 
= this.getClass().getClassLoader().getResource("/").getPath() + "/../../pȝ解决Ҏ.doc";
    String filenamedisplay 
= "pȝ解决Ҏ.doc";//pȝ解决Ҏ.txt
    filenamedisplay = URLEncoder.encode(filenamedisplay,"UTF-8");
    response.addHeader(
"Content-Disposition","attachment;filename=" + filenamedisplay);

    OutputStream output 
= null;
    FileInputStream fis 
= null;
    
try
    
{
        output  
= response.getOutputStream();
        fis 
= new FileInputStream(filenamedownload);

        
byte[] b = new byte[1024];
        
int i = 0;

        
while((i = fis.read(b)) > 0)
        
{
            output.write(b, 
0, i);
        }

        output.flush();
    }

    
catch(Exception e)
    
{
        System.out.println(
"Error!");
        e.printStackTrace();
    }

    
finally
    
{
        
if(fis != null)
        
{
            fis.close();
            fis 
= null;
        }

        
if(output != null)
        
{
            output.close();
            output 
= null;
        }

    }

%>



javaGrowing 2006-11-10 14:25 发表评论
]]>
用jsp面~存http://www.tkk7.com/juhongtao/archive/2006/11/08/79846.htmljavaGrowingjavaGrowingWed, 08 Nov 2006 06:42:00 GMThttp://www.tkk7.com/juhongtao/archive/2006/11/08/79846.htmlhttp://www.tkk7.com/juhongtao/comments/79846.htmlhttp://www.tkk7.com/juhongtao/archive/2006/11/08/79846.html#Feedback0http://www.tkk7.com/juhongtao/comments/commentRss/79846.htmlhttp://www.tkk7.com/juhongtao/services/trackbacks/79846.htmlresponse.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



javaGrowing 2006-11-08 14:42 发表评论
]]>
javabean实现文g上传http://www.tkk7.com/juhongtao/archive/2006/11/03/78900.htmljavaGrowingjavaGrowingFri, 03 Nov 2006 05:12:00 GMThttp://www.tkk7.com/juhongtao/archive/2006/11/03/78900.htmlhttp://www.tkk7.com/juhongtao/comments/78900.htmlhttp://www.tkk7.com/juhongtao/archive/2006/11/03/78900.html#Feedback0http://www.tkk7.com/juhongtao/comments/commentRss/78900.htmlhttp://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"));
%>

javaGrowing 2006-11-03 13:12 发表评论
]]>
使用XMLHTTP Request Object获取服务器数?http://www.tkk7.com/juhongtao/archive/2006/07/29/60703.htmljavaGrowingjavaGrowingSat, 29 Jul 2006 03:46:00 GMThttp://www.tkk7.com/juhongtao/archive/2006/07/29/60703.htmlhttp://www.tkk7.com/juhongtao/comments/60703.htmlhttp://www.tkk7.com/juhongtao/archive/2006/07/29/60703.html#Feedback0http://www.tkk7.com/juhongtao/comments/commentRss/60703.htmlhttp://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?

   
NameTypeDescription
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>
   
NameDesciption
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它们的含义分别是:
   
ParameterDescription
methodHTTP的通信方式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以后再来细说?



javaGrowing 2006-07-29 11:46 发表评论
]]>
servlet 获取out对象http://www.tkk7.com/juhongtao/archive/2006/06/14/52865.htmljavaGrowingjavaGrowingWed, 14 Jun 2006 15:15:00 GMThttp://www.tkk7.com/juhongtao/archive/2006/06/14/52865.htmlhttp://www.tkk7.com/juhongtao/comments/52865.htmlhttp://www.tkk7.com/juhongtao/archive/2006/06/14/52865.html#Feedback0http://www.tkk7.com/juhongtao/comments/commentRss/52865.htmlhttp://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();



javaGrowing 2006-06-14 23:15 发表评论
]]>
利用Jakarta Commonslgbeanutils、dbutils化JDBC数据库操作(一Q?http://www.tkk7.com/juhongtao/archive/2005/12/29/25961.htmljavaGrowingjavaGrowingThu, 29 Dec 2005 14:41:00 GMThttp://www.tkk7.com/juhongtao/archive/2005/12/29/25961.htmlhttp://www.tkk7.com/juhongtao/comments/25961.htmlhttp://www.tkk7.com/juhongtao/archive/2005/12/29/25961.html#Feedback0http://www.tkk7.com/juhongtao/comments/commentRss/25961.htmlhttp://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>


javaGrowing 2005-12-29 22:41 发表评论
]]>
利用Jakarta Commonslgbeanutils、dbutils化JDBC数据库操作(二)http://www.tkk7.com/juhongtao/archive/2005/12/29/25959.htmljavaGrowingjavaGrowingThu, 29 Dec 2005 14:39:00 GMThttp://www.tkk7.com/juhongtao/archive/2005/12/29/25959.htmlhttp://www.tkk7.com/juhongtao/comments/25959.htmlhttp://www.tkk7.com/juhongtao/archive/2005/12/29/25959.html#Feedback0http://www.tkk7.com/juhongtao/comments/commentRss/25959.htmlhttp://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>

javaGrowing 2005-12-29 22:39 发表评论
]]>
վ֩ģ壺 AV߹ۿ| 4444޹˾Ʒ| ѹۿ| ޾Ʒվ| Ұ¾þø| պëƬƵ| VV| ٸ̫߳ˬ߹ۿ| ƷŮͬһѲ| ޳AVƬ߹ۻ| AAƬٸAAƬֱ| ݾ߹ۿվ| Ƶһ| Ƶۿ| þþƷѿ| ޱר| ޳ɫۺվ| ֻ߹ۿƵ | ۵Ӱ߹ۿ| ԶƵ߹ۿѲ| Ƭһ| պ| ޾þþþþ77777| AV߹ۿ| 뾫Ʒ123ѿ| һ| ˳77777߲վ| պƵۿ| 69ʽƵ| Ѿþˬˬav| ҹӰ| AVպۺһ| ŷ߹ۿ| Ļߵ| Ļѹۿ| õĻ2019 | 99þѹ㽶鶹| һѹۿ| һѿ| һۺ| ۺС˵ͼƬͼ|