﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-和爪哇一起走过的日子-随笔分类-Spring</title><link>http://www.blogjava.net/lq410/category/3119.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:52:48 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:52:48 GMT</pubDate><ttl>60</ttl><item><title>关于Spring AOP FrameWork的几种Advice- -</title><link>http://www.blogjava.net/lq410/archive/2005/11/02/17844.html</link><dc:creator>扑扑</dc:creator><author>扑扑</author><pubDate>Wed, 02 Nov 2005 09:19:00 GMT</pubDate><guid>http://www.blogjava.net/lq410/archive/2005/11/02/17844.html</guid><wfw:comment>http://www.blogjava.net/lq410/comments/17844.html</wfw:comment><comments>http://www.blogjava.net/lq410/archive/2005/11/02/17844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lq410/comments/commentRss/17844.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lq410/services/trackbacks/17844.html</trackback:ping><description><![CDATA[&nbsp;Advice：之前我有解释过，其实就是对你关注的pointcut采取的措施或者说执行的干预吧。 
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Spring的AOP FrameWork中Advice主要分为以下五种类型：</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、MethodBeforeAdvice。 此Advice指的是对于被切者方法执行之前的干预。此Advice除了在抛出异常时能对被切者方法执行作出干预外，其他情况下该被切者的方法仍照常执行。</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、MethodInterceptor。此Advice指的是对于被切者方法执行过程进行干预，可使得被切者方法在某些条件下不执行，并且可以改变被切者方法执行后返回的类型。</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、AfterReturningAdvice。此Advice指的是对于被切者方法执行之后的干预。此Advice和MethodBeforeAdvice相同。</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、ThrowingAdvice。此Advice指的是当被切者方法抛出异常时进行的干预。</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、IntroductionInterceptor。此Advice可干预被切者，并可改变别切者，比如让被切者实现一个接口等等。</DIV><img src ="http://www.blogjava.net/lq410/aggbug/17844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lq410/" target="_blank">扑扑</a> 2005-11-02 17:19 <a href="http://www.blogjava.net/lq410/archive/2005/11/02/17844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Aop简单实例入门</title><link>http://www.blogjava.net/lq410/archive/2005/10/14/15472.html</link><dc:creator>扑扑</dc:creator><author>扑扑</author><pubDate>Fri, 14 Oct 2005 01:05:00 GMT</pubDate><guid>http://www.blogjava.net/lq410/archive/2005/10/14/15472.html</guid><wfw:comment>http://www.blogjava.net/lq410/comments/15472.html</wfw:comment><comments>http://www.blogjava.net/lq410/archive/2005/10/14/15472.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/lq410/comments/commentRss/15472.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lq410/services/trackbacks/15472.html</trackback:ping><description><![CDATA[AOP正在成为软件开发的下一个圣杯。使用AOP，你可以将处理aspect的代码注入主程序，通常主程序的主要目的并不在于处理这些aspect。AOP可以防止代码混乱。 <BR>为了理解AOP如何做到这点，考虑一下记日志的工作。日志本身不太可能是你开发的主程序的主要任务。如果能将“不可见的”、通用的日志代码注入主程序中，那该多好啊。AOP可以帮助你做到。 <BR>Spring framework是很有前途的AOP技术。作为一种非侵略性的，轻型的AOP framework，你无需使用预编译器或其他的元标签，便可以在Java程序中使用它。这意味着开发团队里只需一人要对付AOP framework，其他人还是象往常一样编程。 <BR>AOP是很多直觉难以理解的术语的根源。幸运的是，你只要理解三个概念，就可以编写AOP模块。这三个概念是：advice，pointcut和advisor。advice是你想向别的程序内部不同的地方注入的代码。pointcut定义了需要注入advice的位置，通常是某个特定的类的一个public方法。advisor是pointcut和advice的装配器，是将advice注入主程序中预定义位置的代码。 
<P>既然我们知道了需要使用advisor向主要代码中注入“不可见的”advice，让我们实现一个Spring AOP的例子。在这个例子中，我们将实现一个before advice，这意味着advice的代码在被调用的public方法开始前被执行。以下是这个before advice的实现代码： </P>
<P>代码: <BR>package com.company.springaop.test; </P>
<P>import java.lang.reflect.Method; <BR>import org.springframework.aop.MethodBeforeAdvice; </P>
<P>public class TestBeforeAdvice implements MethodBeforeAdvice { </P>
<P>public void before(Method m, Object[] args, Object target) <BR>throws Throwable { <BR>System.out.println("Hello world! (by " <BR>+ this.getClass().getName() <BR>+ ")"); <BR>} <BR>} <BR></P>
<P><BR>接口MethodBeforeAdvice只有一个方法before需要实现，它定义了advice的实现。before方法共用三个参数，它们提供了相当丰富的信息。参数Method m是advice开始后执行的方法。方法名称可以用作判断是否执行代码的条件。Object[] args是传给被调用的public方法的参数数组。当需要记日志时，参数args和被执行方法的名称，都是非常有用的信息。你也可以改变传给m的参数，但要小心使用这个功能；编写最初主程序的程序员并不知道主程序可能会和传入参数的发生冲突。Object target是执行方法m对象的引用。 </P>
<P>在下面的BeanImpl类中，每个public方法调用前，都会执行advice： </P>
<P>代码: <BR>package com.company.springaop.test; </P>
<P>public class BeanImpl implements Bean { </P>
<P>public void theMethod() { <BR>System.out.println(this.getClass().getName() <BR>+ "." + new Exception().getStackTrace()[0].getMethodName() <BR>+ "()" <BR>+ " says HELLO!"); <BR>} <BR>} </P>
<P><BR>类BeanImpl实现了下面的接口Bean： </P>
<P>代码: <BR>package com.company.springaop.test; </P>
<P>public interface Bean { <BR>public void theMethod(); <BR>} </P>
<P></P>
<P>虽然不是必须使用接口，但面向接口而不是面向实现编程是良好的编程实践，Spring也鼓励这样做。 </P>
<P>pointcut和advice通过配置文件来实现，因此，接下来你只需编写主方法的Java代码： <BR>代码: </P>
<P><BR>package com.company.springaop.test; </P>
<P>import org.springframework.context.ApplicationContext; <BR>import org.springframework.context.support.FileSystemXmlApplicationContext; </P>
<P>public class Main { </P>
<P>public static void main(String[] args) { <BR>//Read the configuration file <BR>ApplicationContext ctx <BR>= new FileSystemXmlApplicationContext("springconfig.xml"); </P>
<P>//Instantiate an object <BR>Bean x = (Bean) ctx.getBean("bean"); </P>
<P>//Execute the public method of the bean (the test) <BR>x.theMethod(); <BR>} <BR>} </P>
<P></P>
<P>我们从读入和处理配置文件开始，接下来马上要创建它。这个配置文件将作为粘合程序不同部分的“胶水”。读入和处理配置文件后，我们会得到一个创建工厂ctx。任何一个Spring管理的对象都必须通过这个工厂来创建。对象通过工厂创建后便可正常使用。 </P>
<P>仅仅用配置文件便可把程序的每一部分组装起来。 <BR>代码: </P>
<P>&lt;?xml version="1.0" encoding="UTF-8"?&gt; <BR>&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt; </P>
<P>&lt;beans&gt; <BR>&lt;!--CONFIG--&gt; <BR>&lt;bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean"&gt; <BR>&lt;property name="proxyInterfaces"&gt; <BR>&lt;value&gt;com.company.springaop.test.Bean&lt;/value&gt; <BR>&lt;/property&gt; <BR>&lt;property name="target"&gt; <BR>&lt;ref local="beanTarget"/&gt; <BR>&lt;/property&gt; <BR>&lt;property name="interceptorNames"&gt; <BR>&lt;list&gt; <BR>&lt;value&gt;theAdvisor&lt;/value&gt; <BR>&lt;/list&gt; <BR>&lt;/property&gt; <BR>&lt;/bean&gt; </P>
<P>&lt;!--CLASS--&gt; <BR>&lt;bean id="beanTarget" class="com.company.springaop.test.BeanImpl"/&gt; </P>
<P>&lt;!--ADVISOR--&gt; <BR>&lt;!--Note: An advisor assembles pointcut and advice--&gt; <BR>&lt;bean id="theAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"&gt; <BR>&lt;property name="advice"&gt; <BR>&lt;ref local="theBeforeAdvice"/&gt; <BR>&lt;/property&gt; <BR>&lt;property name="pattern"&gt; <BR>&lt;value&gt;com\.company\.springaop\.test\.Bean\.theMethod&lt;/value&gt; <BR>&lt;/property&gt; <BR>&lt;/bean&gt; </P>
<P>&lt;!--ADVICE--&gt; <BR>&lt;bean id="theBeforeAdvice" class="com.company.springaop.test.TestBeforeAdvice"/&gt; <BR>&lt;/beans&gt; <BR></P>
<P><BR>四个bean定义的次序并不重要。我们现在有了一个advice，一个包含了正则表达式pointcut的advisor，一个主程序类和一个配置好的接口，通过工厂ctx，这个接口返回自己本身实现的一个引用。 </P>
<P>BeanImpl和TestBeforeAdvice都是直接配置。我们用一个唯一的ID创建一个bean元素，并指定了一个实现类。这就是全部的工作。 </P>
<P>advisor通过Spring framework提供的一个RegexMethodPointcutAdvisor类来实现。我们用advisor的一个属性来指定它所需的advice-bean。第二个属性则用正则表达式定义了pointcut，确保良好的性能和易读性。 </P>
<P>最后配置的是bean，它可以通过一个工厂来创建。bean的定义看起来比实际上要复杂。bean是ProxyFactoryBean的一个实现，它是Spring framework的一部分。这个bean的行为通过一下的三个属性来定义： </P>
<P></P>
<P><BR>属性proxyInterface定义了接口类。 </P>
<P>属性target指向本地配置的一个bean，这个bean返回一个接口的实现。 </P>
<P>属性interceptorNames是唯一允许定义一个值列表的属性。这个列表包含所有需要在beanTarget上执行的advisor。注意，advisor列表的次序是非常重要的。 </P>
<P></P>
<P>Spring工具 </P>
<P>虽然你可以手工修改Ant构建脚本，但使用SpringUI（译注：SpringUI现在是Spring framework的一部分，并改名为spring-ide），使用Spring AOP变得很简单，只要点点鼠标即可。你可以把SpringUI安装成Eclipse的一个plug-in。然后，你只需在你的project上右击鼠标，并选择“add Spring Project Nature”。在project属性中，你可以在“Spring Project”下添加Spring配置文件。在编译前把下面的类库加入project：aopalliance.jar，commons-logging.jar，jakarta-oro-2.0.7.jar和spring.jar。运行程序时你会看到下面的信息： </P>
<P>... (logging information) <BR>Hello world! (by com.company.springaop.test.TestBeforeAdvice) <BR>com.company.springaop.test.BeanImpl.theMethod() says HELLO! </P>
<P><BR>优点和缺点 </P>
<P>Spring比起其他的framework更有优势，因为除了AOP以外，它提供了更多别的功能。作为一个轻型framework，它在J2EE不同的部分都可以发挥作用。因此，即使不想使用Spring AOP，你可能还是想使用Spring。另一个优点是，Spring并不要求开发团队所有的人员都会用它。学习Spring应该从Spring reference的第一页开始。读了本文后，你应该可以更好地理解Spring reference了。Spring唯一的缺点是缺乏更多的文档，但它的mailing list是个很好的补充，而且会不断地出现更多的文档</P><img src ="http://www.blogjava.net/lq410/aggbug/15472.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lq410/" target="_blank">扑扑</a> 2005-10-14 09:05 <a href="http://www.blogjava.net/lq410/archive/2005/10/14/15472.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用spring MVC框架进行文件上传</title><link>http://www.blogjava.net/lq410/archive/2005/09/02/11819.html</link><dc:creator>扑扑</dc:creator><author>扑扑</author><pubDate>Fri, 02 Sep 2005 03:04:00 GMT</pubDate><guid>http://www.blogjava.net/lq410/archive/2005/09/02/11819.html</guid><wfw:comment>http://www.blogjava.net/lq410/comments/11819.html</wfw:comment><comments>http://www.blogjava.net/lq410/archive/2005/09/02/11819.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/lq410/comments/commentRss/11819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lq410/services/trackbacks/11819.html</trackback:ping><description><![CDATA[<P>使用spring MVC框架进行文件上传，步骤如下：</P>
<P>1：配置web.xml文件。定义DispatcherServlet，DispatcherServlet处理的请求（.htm）也在同一个web.xml文件里使用url-mapping定义映射。</P>
<P>&nbsp;&lt;servlet&gt;<BR>&nbsp;&nbsp;&lt;servlet-name&gt;upload&lt;/servlet-name&gt;<BR>&nbsp;&nbsp;&lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet<BR>&nbsp;&nbsp;&lt;/servlet-class&gt;<BR>&nbsp;&nbsp;&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<BR>&nbsp;&lt;/servlet&gt;<BR>&nbsp;<BR>&nbsp;&lt;servlet-mapping&gt;<BR>&nbsp;&nbsp;&lt;servlet-name&gt;upload&lt;/servlet-name&gt;<BR>&nbsp;&nbsp;&lt;url-pattern&gt;*.htm&lt;/url-pattern&gt;<BR>&nbsp;&lt;/servlet-mapping&gt;<BR>2：定义upload-servlet.xml文件。<BR>&lt;bean id="multipartResolver"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.web.multipart.commons.CommonsMultipartResolver"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- set the max upload size100MB --&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="maxUploadSize"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;104857600&lt;/value&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/property&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;property name="maxInMemorySize"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;4096&lt;/value&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/property&gt;<BR>&nbsp;&nbsp; &lt;/bean&gt;<BR>&nbsp;&lt;bean id="urlMapping" <BR>&nbsp;&nbsp;class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&lt;property name="mappings"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&lt;props&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&lt;prop key="/upload.htm"&gt;uploadController&lt;/prop&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&lt;/props&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&lt;/property&gt;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&lt;/bean&gt;<BR>&nbsp;&nbsp;&nbsp; &nbsp;&lt;bean id="uploadController" class="FileUploadController"&gt;<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;property name="commandClass"&gt;&lt;value&gt;FileUploadBean&lt;/value&gt;&lt;/property&gt;<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;property name="uploadDir"&gt;&lt;value&gt;E:/&lt;/value&gt;&lt;/property&gt;<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;property name="formView"&gt;&lt;value&gt;fail&lt;/value&gt;&lt;/property&gt;<BR>&nbsp;&nbsp;&lt;property name="successView"&gt;&lt;value&gt;confirmation&lt;/value&gt;&lt;/property&gt;<BR>&lt;/bean&gt;&nbsp;&nbsp; <BR>3：定义控制类，commandClass及方法。控制类中最重要的方法是initBinder()它给spring注册了一个编辑器对<BR>request中的multipart实体进行处理，如果没有这个方法，上传将不能进行。<BR>&lt;--------------------------控制类-------------------&gt;<BR>public class FileUploadController extends SimpleFormController {<BR>&nbsp;&nbsp;&nbsp; private static Log log =<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LogFactory.getLog(FileUploadController.class);<BR>&nbsp;&nbsp;&nbsp; private String uploadDir;//上传文件路径</P>
<P>&nbsp;&nbsp;&nbsp; protected ModelAndView onSubmit(HttpServletRequest request,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response, Object cmd, BindException errors)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws Exception {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileUploadBean bean = (FileUploadBean) cmd;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] bytes = bean.getFile();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //cast to multipart file so we can get additional information<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CommonsMultipartFile file = (CommonsMultipartFile) multipartRequest.getFile("file");</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String uploadDir = this.getUploadDir();</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File dirPath = new File(uploadDir);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!dirPath.exists()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dirPath.mkdirs();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String sep = System.getProperty("file.separator");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (log.isDebugEnabled()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug("uploading to: " + uploadDir + sep +<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file.getOriginalFilename());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File uploadedFile = new File(uploadDir + sep<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + file.getOriginalFilename());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileCopyUtils.copy(bytes, uploadedFile);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("********************************");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(uploadedFile.getAbsolutePath());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(bytes.length);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("********************************");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new ModelAndView(getSuccessView() + ".jsp");<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp; protected void initBinder(HttpServletRequest request,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletRequestDataBinder binder) throws ServletException {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; binder.registerCustomEditor(byte[].class,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new ByteArrayMultipartFileEditor());<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; public void setUploadDir(String uploadDir){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.uploadDir = uploadDir;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; public String getUploadDir(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.uploadDir;<BR>&nbsp;&nbsp;&nbsp; }<BR>}<BR>&lt;--------------------------控制类-------------------------&gt;<BR>&lt;---------------------定义commandClass--------------------&gt;<BR>public class FileUploadBean {</P>
<P>&nbsp;&nbsp;&nbsp; private byte[] file;</P>
<P>&nbsp;&nbsp;&nbsp; public void setFile(byte[] file) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.file = file;<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp; public byte[] getFile() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return file;<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>}<BR>&lt;---------------------定义commandClass--------------------&gt;<BR>4：定义一个form表单index.jsp<BR>&lt;form method="post" action="upload.htm" enctype="multipart/form-data"&gt;<BR>&lt;input type="file" name="file"/&gt;<BR>&lt;input type="submit"/&gt;<BR>5：定义confirmation.jsp及fail.jsp<BR>confirmation.jsp如下：<BR>&lt;%@ page contentType="text/html; charset=GBK" %&gt;<BR>&lt;html&gt;<BR>&lt;head&gt;<BR>&lt;title&gt;<BR>successView<BR>&lt;/title&gt;<BR>&lt;/head&gt;<BR>&lt;body bgcolor="#ffffff"&gt;<BR>&lt;h1&gt;<BR>Upload Successful<BR>&lt;/h1&gt;<BR>&lt;/body&gt;<BR>&lt;/html&gt;</P>
<P>fail.jsp如下：<BR>&lt;html&gt;<BR>&lt;head&gt;<BR>&lt;title&gt;Upload a file please&lt;/title&gt;<BR>&lt;/head&gt;<BR>&lt;body&gt;<BR>&lt;h1&gt;no file,Please upload a file&lt;/h1&gt;<BR>&lt;form method="post" action="uploadfile.htm" enctype="multipart/form-data"&gt;<BR>&lt;input type="file" name="file"/&gt;<BR>&lt;input type="submit"/&gt;<BR>&lt;/form&gt;<BR>&lt;/body&gt;<BR>&lt;/html&gt;<BR>6：运行tomcat。<BR>预览&nbsp;ie里面:http://localhost/springmvc/index.jsp<BR>注：<BR>a：文件目录为tomcat-HOME/webapps/springmvc/<BR>.jsp文件都放在根目录下，.class文件放在/WEB-INF/classes/中</P>
<P>其他文件放在/WEB-INF/里面。<BR>b：如果连上面的你都有疑问，那还是去看看spring的基础知识吧。</P><img src ="http://www.blogjava.net/lq410/aggbug/11819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lq410/" target="_blank">扑扑</a> 2005-09-02 11:04 <a href="http://www.blogjava.net/lq410/archive/2005/09/02/11819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>