您的位置:首页 > 编程语言 > Java开发

Java路径问题最终解决方案使用演示

2006-12-03 14:32 751 查看
Java路径问题最终解决方案使用演示

前言
在《Java路径问题最终解决方案—可定位所有资源的相对路径寻址》一文中,我给大家提供了一个助手类ClassLoaderUtil ,和它的public static URL getExtendResource(String relativePath)方法。这个方法能够接受“../”这样的参数,允许我们用相对路径来定位classpath外面的资源。这样,我们就可以使用相对于classpath的路径,定位所有位置的资源!
本文中,我给大家提供了一个在JavaEE程序中使用这个便利方法寻找相对路径的代码实例。
在《JavaEE路径陷阱之getRealPath》一文中,探讨了JavaEE程序中资源寻址的问题,有兴趣的读者可以看看那篇文章。

Java路径问题最终解决方案使用演示
示例背景
使用ClassLoaderUtil.getExtendResource()方法进行寻址的这个示例,是一个JavaEE程序,使用了SpringMVC框架进行前台开发。上传文件部分,使用了Apache的commons upload技术。
这个模块的功能是,向服务器上传一个JBoss的工作流引擎Jbpm的工作流定义文件。然后把它部署到服务器上。同时,把上传的工作流定义文件保存到服务器的 Web应用程序根目录/WEB-INF/jbpm/upload/目录下,以备查阅!

源代码:
[align=left]import java.io.File;[/align]
[align=left]import java.net.URI;[/align]
[align=left]import java.util.Date;[/align]
[align=left] [/align]
[align=left]import javax.servlet.http.HttpServletRequest;[/align]
[align=left]import javax.servlet.http.HttpServletResponse;[/align]
[align=left] [/align]
[align=left]import org.springframework.web.multipart.MultipartFile;[/align]
[align=left]import org.springframework.web.servlet.ModelAndView;[/align]
[align=left] [/align]
[align=left]import com.withub.common.base.BaseController;[/align]
[align=left]import com.withub.common.util.ClassLoaderUtil;[/align]
[align=left]import com.withub.common.util.IDeployProcessDefinition;[/align]
[align=left] [/align]
[align=left]import com.withub.wcms.UrlMap;[/align]
[align=left]import com.withub.wcms.manage.deployProcessDefinition.jbpm.bean.FileUploadBean;[/align]
[align=left] [/align]
[align=left]/**[/align]
[align=left] *@author沈东良shendl_s@hotmail.com[/align]
[align=left] *Nov27,2006 1:31:25PM[/align]
[align=left] *这个类负责上传并部署Jbpm工作流定义文件[/align]
[align=left] *并且把已上传的文件copy到Web应用程序根目录/WEB-INF/jbpm/upload/目录下,以备查阅![/align]
[align=left] *[/align]
[align=left] */[/align]
[align=left]publicclass UploadAndDeployJbpmProcessDefinition extends BaseController {[/align]
[align=left] /**[/align]
[align=left] *Service,部署本地上传的xml业务程序定义文件到服务器端的数据库![/align]
[align=left] *本Bean是单例。 运行时,不set这个变量。只在初始化载入Spring容器时调用set方法。注意同步资源![/align]
[align=left] */[/align]
[align=left] private IDeployProcessDefinition deployProcessDefinition;[/align]
[align=left] /**[/align]
[align=left] *这个方法,直接返回上传、部署工作流定义页面。这是为了用.page控制上传页面的访问权。[/align]
[align=left] *@paramrequest[/align]
[align=left] *@paramresponse[/align]
[align=left] *@return[/align]
[align=left] *@throwsException[/align]
[align=left] */[/align]
[align=left] public ModelAndView list(HttpServletRequest request,HttpServletResponse response) throws Exception{[/align]
[align=left] [/align]
[align=left] returnnew ModelAndView(UrlMap.map("manage.deployProcessDefinition.list"));[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] *[/align]
[align=left] *@paramrequest[/align]
[align=left] *@paramresponse[/align]
[align=left] *@paramcommand[/align]
[align=left] *@return[/align]
[align=left] *@throwsException[/align]
[align=left] */[/align]
[align=left] public ModelAndView onSubmit(HttpServletRequest request,HttpServletResponse response,FileUploadBean command) throws Exception {[/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left]// let's see if there's content there[/align]
[align=left] MultipartFile file = command.getFile();[/align]
[align=left]if (file == null) {[/align]
[align=left]// hmm, that's strange, the user did not upload anything[/align]
[align=left]thrownew RuntimeException("上传文件出错!未能成功上传文件!");[/align]
[align=left][/align]
[align=left] }else{[/align]
[align=left]//部署上传的文件[/align]
[align=left]this.getDeployProcessDefinition().deployProcessDefinitionTransaction(file.getInputStream());[/align]
[align=left] File destFile=null;[/align]
[align=left]/**[/align]
[align=left]*使用自定义的方法,实现了相对于classpath的相对路径寻址。[/align]
[align=left]*/[/align]
[align=left] String uploadPath=ClassLoaderUtil.getExtendResource("../jbpm/upload/").toString();[/align]
[align=left] String uploadFile=uploadPath+String.valueOf(new Date().getTime())+"_"+file.getOriginalFilename();[/align]
[align=left] destFile=new File(new URI(uploadFile));[/align]
[align=left] file.transferTo(destFile);[/align]
[align=left][/align]
[align=left] }[/align]
[align=left][/align]
[align=left]// well, let's do nothing with the bean for now and return[/align]
[align=left]//return super.onSubmit(request, response, command, errors);[/align]
[align=left]returnnew ModelAndView(UrlMap.map("manage.deployProcessDefinition.success"));[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] *@paramargs[/align]
[align=left] */[/align]
[align=left] publicstaticvoid main(String[] args) {[/align]
[align=left] /**[/align]
[align=left] *[/align]
[align=left] */[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] *@returnthedeployProcessDefinition[/align]
[align=left] */[/align]
[align=left] public IDeployProcessDefinition getDeployProcessDefinition() {[/align]
[align=left] returndeployProcessDefinition;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] *@paramdeployProcessDefinitionthedeployProcessDefinitiontoset[/align]
[align=left] */[/align]
[align=left] publicvoid setDeployProcessDefinition([/align]
[align=left] IDeployProcessDefinition deployProcessDefinition) {[/align]
[align=left] this.deployProcessDefinition = deployProcessDefinition;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left]}[/align]

后记
这里,我使用了自己实现的ClassLoaderUtil.getExtendResource()方法,实现了相对于classpath的相对路径寻址。
没有使用ServletContext接口提供的寻址方法。这样的代码,不依赖于JavaEE环境,依赖的是标准的JavaSE,可以用在任何Java程序中!
如果你要使用ServletContext接口提供的寻址方法,那么请一定不要使用getRealPath(“/”)方法,而应该使用getResource()方法或者getResourceAsStream()方法寻址。参数应该是“/”开头的相对路径,相对的是Web应用程序根目录的相对路径,而不是classpath的相对路径。具体原因,在《JavaEE路径陷阱之getRealPath》一文中作了详细的解释。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: