轻量级Java Web企业应用实战 PDF 清晰版

  • 更新时间:
  • 9484人关注
  • 点击下载

轻量级Java Web企业应用实战》是一本关于Java相关的电子书资源,介绍了关于Java、Web、企业应用方面的内容,本书是由电子工业出版社出版,格式为PDF,资源大小85 MB,李刚编写,目前豆瓣、亚马逊、当当、京东等综合评分为:7.7分,一起来看下具体内容。

编辑推荐

《轻量级Java Web企业应用实战――Spring MVC Spring MyBatis整合开发》不是一份“X天精通Java EE开发”的“心灵鸡汤”,这是一本令人生畏的“砖头”书。

1. 内容实际,针对性强

本书介绍的Java EE应用示例,采用了目前企业流行的开发架构,严格遵守Java EE开发规范,而不是将各种技术杂乱地糅合在一起号称Java EE。读者参考本书的架构,完全可以身临其境地感受企业实际开发。

2.框架源代码级的讲解,深入透彻

本书针对Spring MVC、Spring、MyBatis框架核心部分的源代码进行了讲解,不仅能帮助读者真正掌握框架的本质,而且能让读者参考优秀框架的源代码快速提高自己的技术功底。

本书介绍的源代码解读方法还可消除开发者对阅读框架源代码的恐惧,让开发者在遇到技术问题时能冷静分析问题,从框架源代码层次找到问题根源。

3.丰富、翔实的代码,面向实战

本书是面向实战的技术图书,坚信所有知识点必须转换成代码才能*终变成有效的生产力,因此本书为所有知识点提供了对应的可执行的示例代码。代码不仅有细致的注释,还结合理论对示例进行了详细的解释,真正让读者做到学以致用。

内容简介

本书介绍了Java EE开发非常流行的三个开源框架:Spring MVC、Spring和MyBatis,其中Spring MVC、Spring用的是5.1版本,MyBatis用的是3.5版本。本书重点介绍了如何整合Spring MVC Spring MyBatis进行开发,内容主要包括三部分。*部分介绍Java EE开发的基础知识,以及如何搭建开发环境。第二部分详细讲解MyBatis、Spring和Spring MVC三个框架的用法,并从Eclipse IDE的使用上手,一步步带领读者深入三个框架的核心。这部分是本书的核心内容,因此也是重点部分。这部分并不是简单地讲授三个框架的基本用法,而是真正剖析它们在实际开发场景中面临的挑战及*实践,并对其诸多关键技术实现提供了源代码解读,这样既能加深读者对框架本质的理解,也能直接提升读者的Java功底。第三部分示范开发了一个包含7个表,表之间具有复杂的关联映射、继承映射等关系,且业务也相对复杂的工作流案例,帮助读者理论联系实际,将三个框架真正运用到实际开发中。该案例采用目前非常流行、规范的Java EE架构,整个应用分为领域对象层、Mapper(DAO)。层、业务逻辑层、MVC层和视图层,各层之间分层清晰,层与层之间以松耦合的方式组织在一起。该案例既提供了与IDE无关的、基于Ant管理的项目源代码,也提供了基于Eclipse IDE的项目源代码,*限度地满足读者的需求。本书配有读者答疑交流群,读者可通过扫描本书封面勒口上的二维码,按照指引加入,本书作者将通过交流群提供线上不定期答疑服务。

作者简介

李刚,十余年软件开发从业经验,疯狂软件教育中心教学总监。疯狂Java实训营创始人,疯狂Java体系原创图书作者。广东技术师范学院计算机科学系兼职副教授,CSDN特邀讲师。培训的学生已在腾讯、阿里、华为、IBM、网易、唯品会、电信盈科等名企就职。国内知名高端IT技术图书作家,已出版《疯狂Java讲义》《疯狂Android讲义》《轻量级Java EE企业应用实战》《疯狂前端开发讲义》《疯狂HTML5/CSS3/JavaScript讲义》等著作。其中疯狂Java体系图书均已沉淀多年,赢得极高的市场认同,多次重印,多部著作印刷数量超过10万册,并被多所“985”“211”院校选作教材,部分图书已被翻译成繁体中文版,授权到中国台湾地区。

目录

  • 第1章 Java EE应用和开发环境 1
  • 1.1 Java EE应用概述 2
  • 1.1.1 Java EE应用的分层模型 2
  • 1.1.2 Java EE应用的组件 3
  • 1.1.3 Java EE应用的结构和优势 4
  • 1.1.4 常用的Java EE服务器 4
  • 1.2 轻量级Java EE应用相关技术 5
  • 1.2.1 JSP、Servlet 4.x和JavaBean及替代技术 5
  • 1.2.2 Spring MVC及替代技术 6
  • 1.2.3 MyBatis及替代技术 6
  • 1.2.4 Spring及替代技术 7
  • 1.3 Tomcat的下载和安装 8
  • 1.3.1 安装Tomcat服务器 8
  • 1.3.2 配置Tomcat的服务端口 9
  • 1.3.3 进入控制台 10
  • 1.3.4 部署Web应用 12
  • 1.3.5 配置Tomcat的数据源 13
  • 1.4 Eclipse的安装和使用 15
  • 1.4.1 Eclipse的下载和安装 15
  • 1.4.2 在线安装Eclipse插件 15
  • 1.4.3 从本地压缩包安装插件 17
  • 1.4.4 手动安装Eclipse插件 18
  • 1.4.5 使用Eclipse开发Java Web应用 18
  • 1.4.6 导入Eclipse项目 21
  • 1.4.7 导入非Eclipse项目 22
  • 1.5 Ant的安装和使用 23
  • 1.5.1 Ant的下载和安装 24
  • 1.5.2 使用Ant工具 25
  • 1.5.3 定义生成文件 26
  • 1.5.4 Ant的任务(task) 30
  • 1.6 Maven的安装和使用 32
  • 1.6.1 下载和安装Maven 33
  • 1.6.2 设置Maven 34
  • 1.6.3 创建、构建简单的项目 35
  • 1.6.4 Maven的核心概念 39
  • 1.6.5 依赖管理 44
  • 1.6.6 POM文件的元素 46
  • 1.7 使用Git进行软件配置管理(SCM) 47
  • 1.7.1 下载和安装Git、TortoiseGit 47
  • 1.7.2 创建本地资源库 49
  • 1.7.3 添加文件和文件夹 51
  • 1.7.4 提交修改 52
  • 1.7.5 查看文件或文件夹的版本变更 53
  • 1.7.6 删除文件或文件夹 54
  • 1.7.7 从以前版本重新开始 55
  • 1.7.8 克隆项目 56
  • 1.7.9 创建分支 56
  • 1.7.10 沿着分支开发 57
  • 1.7.11 合并分支 58
  • 1.7.12 使用Eclipse作为Git客户端 59
  • 1.7.13 配置远程中央资源库 61
  • 1.7.14 推送项目 64
  • 1.7.15 获取项目和拉取项目 64
  • 1.8 本章小结 66
  • 第2章 MyBatis的基础用法 67
  • 2.1 MyBatis是ORM框架吗 68
  • 2.1.1 何谓ORM 68
  • 2.1.2 ORM的映射方式 69
  • 2.1.3 MyBatis的映射方式 70
  • 2.2 MyBatis入门 71
  • 2.2.1 MyBatis的下载和安装 72
  • 2.2.2 MyBatis的数据库操作 72
  • 2.2.3 使用MyBatis执行CRUD 78
  • 2.2.4 利用Mapper对象 80
  • 2.2.5 在Eclipse中使用MyBatis 84
  • 2.3 MyBatis核心API及作用域 90
  • 2.3.1 SqlSessionFactoryBuilder的作用域 90
  • 2.3.2 SqlSessionFactory的作用域 91
  • 2.3.3 SqlSession及其作用域 92
  • 2.3.4 Mapper组件的作用域 94
  • 2.4 MyBatis配置详解 94
  • 2.4.1 属性配置 95
  • 2.4.2 设置配置 98
  • 2.4.3 为类型配置别名 101
  • 2.4.4 对象工厂 103
  • 2.4.5 加载Mapper 105
  • 2.5 类型处理器 106
  • 2.5.1 内置的类型处理器 106
  • 2.5.2 自定义类型处理器 107
  • 2.5.3 枚举的类型处理器 111
  • 2.5.4 存储枚举值的序号 112
  • 2.5.5 同时存储枚举值的名称和序号 113
  • 2.6 数据库环境配置 116
  • 2.6.1 环境配置与默认环境配置 116
  • 2.6.2 事务管理器 117
  • 2.6.3 数据源配置 121
  • 2.6.4 配置第三方C3P0数据源 122
  • 2.7 支持不同类型的数据库 124
  • 2.8 Mapper基础 127
  • 2.8.1 select的用法 128
  • 2.8.2 insert的用法 130
  • 2.8.3 使用useGeneratedKeys返回 自增长的主键值 131
  • 2.8.4 使用selectKey生成主键值 132
  • 2.8.5 update和delete元素的用法 134
  • 2.8.6 使用sql元素定义可复用的SQL片段 134
  • 2.8.7 参数处理 136
  • 2.8.8 参数的额外声明 142
  • 2.8.9 字符串替换 142
  • 2.9 MyBatis代码生成器 144
  • 2.9.1 提供配置文件 145
  • 2.9.2 运行MBG 146
  • 2.10 本章小结 149
  • 第3章 深入使用MyBatis 151
  • 3.1 结果集映射 152
  • 3.1.1 简单resultMap映射 152
  • 3.1.2 构造器映射 154
  • 3.1.3 自动映射 157
  • 3.2 调用存储过程 159
  • 3.2.1 调用返回结果集的存储过程 159
  • 3.2.2 调用带out模式参数的存储过程 160
  • 3.2.3 调用传出参数为游标引用的存储过程 162
  • 3.3 关联映射 165
  • 3.3.1 基于嵌套select的一对一映射 165
  • 3.3.2 基于嵌套select映射策略的性能缺陷 171
  • 3.3.3 延迟加载的原理 175
  • 3.3.4 基于多表连接查询的一对一映射 176
  • 3.3.5 基于多结果集的一对一映射 182
  • 3.3.6 基于嵌套select的一对多映射 184
  • 3.3.7 基于多表连接查询的一对多映射 191
  • 3.3.8 基于多结果集的一对多映射 192
  • 3.3.9 多对多映射的三种策略 194
  • 3.4 基于辨别者列的继承映射 201
  • 3.4.1 继承映射的简单示例 201
  • 3.4.2 继承映射的复杂示例 205
  • 3.5 动态SQL 210
  • 3.5.1 if元素的用法 210
  • 3.5.2 在update更新列中使用if 216
  • 3.5.3 在insert动态插入列中使用if 219
  • 3.5.4 choose、when、otherwise元素的 用法 222
  • 3.5.5 where与trim的用法 225
  • 3.5.6 set与trim的用法 228
  • 3.5.7 使用trim实现动态插入 230
  • 3.5.8 foreach元素的基本用法 232
  • 3.5.9 foreach实现批量插入 234
  • 3.5.10 foreach实现批量更新 236
  • 3.5.11 bind元素的用法 239
  • 3.6 缓存 240
  • 3.6.1 一级缓存 240
  • 3.6.2 一级缓存的脏数据与避免方法 243
  • 3.6.3 二级缓存 246
  • 3.6.4 二级缓存的脏数据与避免方法 248
  • 3.6.5 整合Ehcache实现二级缓存 252
  • 3.7 用插件扩展MyBatis 254
  • 3.7.1 拦截器接口及作用原理 254
  • 3.7.2 可拦截的目标 256
  • 3.7.3 为MyBatis开发分页插件 260
  • 3.8 本章小结 266
  • 第4章 Spring的基础用法 267
  • 4.1 Spring简介和Spring 5的变化 268
  • 4.1.1 Spring简介 268
  • 4.1.2 Spring 5.x的变化 269
  • 4.2 Spring入门 269
  • 4.2.1 Spring的下载和安装 270
  • 4.2.2 使用Spring管理Bean 270
  • 4.2.3 在Eclipse中使用Spring 274
  • 4.3 Spring的核心机制:依赖注入 276
  • 4.3.1 理解依赖注入 277
  • 4.3.2 设值注入 278
  • 4.3.3 构造注入 282
  • 4.3.4 两种注入方式的对比 284
  • 4.4 使用Spring容器 284
  • 4.4.1 Spring容器 284
  • 4.4.2 使用ApplicationContext 286
  • 4.4.3 ApplicationContext的国际化支持 287
  • 4.4.4 ApplicationContext的事件机制 289
  • 4.4.5 让Bean获取Spring容器 292
  • 4.5 Spring容器中的Bean 294
  • 4.5.1 Bean的基本定义和Bean别名 294
  • 4.5.2 容器中Bean的作用域 295
  • 4.5.3 配置依赖 299
  • 4.5.4 设置普通属性值 300
  • 4.5.5 配置合作者Bean 302
  • 4.5.6 使用自动装配注入合作者Bean 302
  • 4.5.7 注入嵌套Bean 305
  • 4.5.8 注入集合值 306
  • 4.5.9 组合属性 311
  • 4.5.10 Spring的Bean和JavaBean 312
  • 4.6 Spring的Java配置管理 313
  • 4.7 创建Bean的三种方式 316
  • 4.7.1 使用构造器创建Bean 316
  • 4.7.2 使用静态工厂方法创建Bean 317
  • 4.7.3 使用实例工厂方法创建Bean 319
  • 4.8 深入理解容器中的Bean 321
  • 4.8.1 抽象Bean与子Bean 322
  • 4.8.2 Bean继承与Java继承的区别 323
  • 4.8.3 容器中的工厂Bean 323
  • 4.8.4 获得Bean本身的id 326
  • 4.8.5 强制初始化Bean 327
  • 4.9 容器中Bean的生命周期 327
  • 4.9.1 依赖关系注入之后的行为 328
  • 4.9.2 Bean销毁之前的行为 330
  • 4.9.3 协调作用域不同步的Bean 332
  • 4.10 高级依赖关系配置 336
  • 4.10.1 获取其他Bean的属性值 336
  • 4.10.2 获取Field值 339
  • 4.10.3 获取方法的返回值 341
  • 4.11 基于XML Schema的简化配置方式 344
  • 4.11.1 使用p:命名空间简化配置 344
  • 4.11.2 使用c:命名空间简化配置 345
  • 4.11.3 使用util:命名空间简化配置 347
  • 4.12 Spring表达式语言 349
  • 4.12.1 使用Expression接口进行表达式求值 350
  • 4.12.2 Bean定义中的表达式语言支持 352
  • 4.12.3 SpEL语法详述 353
  • 4.13 本章小结 358
  • 第5章 深入使用Spring 359
  • 5.1 两种后处理器 360
  • 5.1.1 Bean后处理器 360
  • 5.1.2 Bean后处理器的用处 364
  • 5.1.3 容器后处理器 364
  • 5.1.4 属性占位符配置器 366
  • 5.1.5 重写占位符配置器 367
  • 5.2 “零配置”支持 368
  • 5.2.1 搜索Bean类 368
  • 5.2.2 指定Bean的作用域 371
  • 5.2.3 使用@Resource、@Value配置依赖 372
  • 5.2.4 使用@PostConstruct和@PreDestroy定制生命周期行为 373
  • 5.2.5 @DependsOn和@Lazy 374
  • 5.2.6 自动装配和精确装配 374
  • 5.2.7 Spring 5新增的注解 379
  • 5.3 资源访问 380
  • 5.3.1 Resource实现类 381
  • 5.3.2 ResourceLoader接口和 ResourceLoaderAware接口 385
  • 5.3.3 使用Resource作为属性 388
  • 5.3.4 在ApplicationContext中使用资源 389
  • 5.4 Spring的AOP 392
  • 5.4.1 为什么需要AOP 393
  • 5.4.2 使用AspectJ实现AOP 394
  • 5.4.3 AOP的基本概念 401
  • 5.4.4 Spring的AOP支持 402
  • 5.4.5 基于注解的“零配置”方式 403
  • 5.4.6 基于XML配置文件的管理方式 418
  • 5.5 Spring的缓存机制 424
  • 5.5.1 启用Spring缓存 425
  • 5.5.2 使用@Cacheable执行缓存 427
  • 5.5.3 使用@CacheEvict清除缓存数据 431
  • 5.6 Spring的事务 433
  • 5.6.1 Spring支持的事务策略 433
  • 5.6.2 使用XML Schema配置事务策略 436
  • 5.6.3 使用@Transactional 442
  • 5.7 Spring整合MyBatis 443
  • 5.7.1 整合MyBatis的关
展开阅读
精选笔记1:基于JAVA文件中获取路径及WEB应用程序获取路径的方法

20小时52分钟前回答

1. 基本概念的理解

`绝对路径`:你应用上的文件或目录在硬盘上真正的路径,如:URL、物理路径

例如:

c:/xyz/test.txt代表了test.txt文件的绝对路径;

http://www.sun.com/index.htm也代表了一个URL绝对路径;

`相对路径`:相对与某个基准目录的路径,包含Web的相对路径(HTML中的相对目录)。

例如:

在Servlet中,"/"代表Web应用的根目录,和物理路径的相对表示。

例如:

"./"代表当前目录,"../"代表上级目录。这种类似的表示,也是属于相对路径。

2. 关于JSP/Servlet中的相对路径和绝对路径。

2.1 服务器端的地址

`服务器端的相对地址`:指的是相对于你的web应用的地址,这个地址是在服务器端解析的(不同于html和javascript中的相对地址,他们是由客户端浏览器解析的)也就是说这时候在jsp和servlet中的相对地址应该是相对于你的web应用,即相对于http://192.168.0.1/webapp/的。

其用到的地方有:

`forward:servlet中的request.getRequestDispatcher(address);`这个address是在服务器端解析的,所以,你要forward到a.jsp应该这么写:

`request.getRequestDispatcher(“/user/a.jsp”)`这个/相对于当前的web应用webapp,其绝对地址就是:http://192.168.0.1/webapp/user/a.jsp。

2.2 客户端的地址

`所有的html页面中的相对地址`都是相对于服务器根目录(http://192.168.0.1/)的,而不是(根目录下的该Web应用的目录)http://192.168.0.1/webapp/的。

`Html中的form表单的action属性的地址`应该是相对于服务器根目录(http://192.168.0.1/)的,所以,如果提交到a.jsp为:action="/webapp/user/a.jsp"或action="/user/a.jsp",提交到servlet为action="/webapp/handleservlet"。

Javascript也是在客户端解析的,所以其相对路径和form表单一样。

因此,一般情况下,在JSP/HTML页面等引用的CSS,Javascript,Action等属性前面最好都加上webapp应用名称,以确保所引用的文件都属于Web应用中的目录。

另外,应该尽量避免使用类似".","./","../../"等类似的相对该文件位置的相对路径,这样当文件移动时,很容易出问题。

3. JSP/Servlet中获得当前应用的相对路径和绝对路径

3.1 JSP中获得当前应用的相对路径和绝对路径

根目录所对应的绝对路径:`request.getRequestURI();`

文件的绝对路径:`application.getRealPath(request.getRequestURI());`

当前web应用的绝对路径:`application.getRealPath("/");`

取得请求文件的上层目录:`newFile(application.getRealPath(request.getRequestURI())).getParent();`

3.2 Servlet中获得当前应用的相对路径和绝对路径

根目录所对应的绝对路径:`request.getServletPath();`

文件的绝对路径:`request.getSession().getServletContext().getRealPath();`

当前web应用的绝对路径:`servletConfig.getServletContext().getRealPath("/");`

ServletContext对象获得几种方式:

javax.servlet.http.HttpSession.getServletContext()
javax.servlet.jsp.PageContext.getServletContext()
javax.servlet.ServletConfig.getServletContext()

4. java的Class中获得相对路径,绝对路径的方法

4.1 单独的Java类中获得绝对路径

根据java.io.File的Doc文挡,可知:`默认情况下newFile("/")代表的目录为:System.getProperty("user.dir");`。

以下程序获得执行类的当前路径:

package org.cheng.file; 
import java.io.File; 
public class FileTest{ 
 public static void main(String[]args)throws Exception{ 
  System.out.println(Thread.currentThread().getContextClassLoader().getResource("")); 
  System.out.println(FileTest.class.getClassLoader().getResource("")); 
  System.out.println(ClassLoader.getSystemResource("")); 
  System.out.println(FileTest.class.getResource("")); 
  System.out.println(FileTest.class.getResource("/"));//Class文件所在路径 
  System.out.println(newFile("/").getAbsolutePath()); 
  System.out.println(System.getProperty("user.dir")); 
 } 
}

4.2 服务器中的Java类获得当前路径(来自网络)

(1).Weblogic

WebApplication的系统文件根目录是你的weblogic安装所在根目录。

例如:如果你的weblogic安装在c:eaweblogic700.....

那么,你的文件根路径就是c:.

所以,有两种方式能够让你访问你的服务器端的文件:

a.使用绝对路径:

比如将你的参数文件放在c:yourconfig/yourconf.properties,

直接使用newFileInputStream("yourconfig/yourconf.properties");

b.使用相对路径:

相对路径的根目录就是你的webapplication的根路径,即WEB-INF的上一级目录,将你的参数文件放在yourwebapp/yourconfig/yourconf.properties,

这样使用:

newFileInputStream("./yourconfig/yourconf.properties");

这两种方式均可,自己选择。

(2).Tomcat

在类中输出System.getProperty("user.dir");显示的是%Tomcat_Home%/bin

(4).如何读相对路径哪?

在Java文件中getResource或getResourceAsStream均可

例:`getClass().getResourceAsStream(filePath);` // filePath可以是"/filename",这里的/代表web发布根路径下WEB-INF/classes

默认使用该方法的路径是:WEB-INF/classes。已经在Tomcat中测试。

5.读取文件时的相对路径,避免硬编码和绝对路径的使用。

5.1采用Spring的DI机制获得文件,避免硬编码。

Java中使用的路径,分为两种:绝对路径和相对路径。具体而言,又分为四种:

(1)URI形式的绝对资源路径

如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b

URL是URI的特例。URL的前缀/协议,必须是Java认识的。URL可以打开资源,而URI则不行。

URL和URI对象可以互相转换,使用各自的toURI(),toURL()方法即可!

(2)本地系统的绝对路径

D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b

Java.io包中的类,需要使用这种形式的参数。但是,它们一般也提供了URI类型的参数,而URI类型的参数,接受的是URI样式的String。因此,通过URI转换,还是可以把URI样式的绝对路径用在java.io包中的类中。

(3)相对于classpath的相对路径

如:相对于 file:/D:/java/eclipse32/workspace/jbpmtest3/bin/这个路径的相对路径。其中,bin是本项目的classpath。所有的Java源文件编译后的.class文件复制到这个目录中。

(4)相对于当前用户目录的相对路径

就是相对于System.getProperty("user.dir")返回的路径。

对于一般项目,这是项目的根路径。对于JavaEE服务器,这可能是服务器的某个路径。这个并没有统一的规范!

所以,绝对不要使用“相对于当前用户目录的相对路径”。

然而:默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。

这就是说,在使用java.io包中的类时,最好不要使用相对路径。否则,虽然在J2SE应用程序中可能还算正常,但是到了J2EE程序中,一定会出问题!而且这个路径,在不同的服务器中都是不同的!

`相对路径最佳实践`:推荐使用相对于当前classpath的相对路径,因此,我们在使用相对路径时,应当使用相对于当前classpath的相对路径。

`ClassLoader类的getResource(String name),getResourceAsStream(String name)等方法`,使用相对于当前项目的classpath的相对路径来查找资源。

读取属性文件常用到的`ResourceBundle类的getBundle(String path)`也是如此。

通过查看ClassLoader类及其相关类的源代码,它实际上还是使用了URI形式的绝对路径。通过得到当前classpath 的URI形式的绝对路径,构建了相对路径的URI形式的绝对路径。(这个实际上是猜想,因为JDK内部调用了SUN的源代码,而这些代码不属于JDK,不 是开源的。)

`相对路径本质上还是绝对路径`,因此,归根结底,Java本质上只能使用绝对路径来寻找资源。所有的相对路径寻找资源的方法,都不过是一些便利方法。不过是API在底层帮助我们构建了绝对路径,从而找到资源的!

下面是一些得到classpath和当前类的绝对路径的一些方法。你可能需要使用其中的一些方法来得到你需要的资源的绝对路径。

1. `FileTest.class.getResource("")`:得到的是当前类FileTest.class文件的URI目录。不包括自己!

如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/com/test/

2. `FileTest.class.getResource("/")`:得到的是当前的classpath的绝对URI路径。

如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

3. `Thread.currentThread().getContextClassLoader().getResource("")`:得到的也是当前ClassPath的绝对URI路径。

如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

4. `FileTest.class.getClassLoader().getResource("")`:得到的也是当前ClassPath的绝对URI路径。

如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

5. `ClassLoader.getSystemResource("")`:得到的也是当前ClassPath的绝对URI路径。

如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

`推荐使用`:Thread.currentThread().getContextClassLoader().getResource("")来得到当前的classpath的绝对路径的URI表示法。

Web应用程序中资源的寻址

上文中说过,当前用户目录,即相对于System.getProperty("user.dir")返回的路径。对于JavaEE服务器,这可能是服务器的某个路径,这个并没有统一的规范!而不是我们发布的Web应用程序的根目录!这样,在Web应用程序中,我们绝对不能使用相对于当前用户目录的相对路径。

在Web应用程序中,我们一般通过`ServletContext.getRealPath("/")`方法得到Web应用程序的根目录的绝对路径。这样,我们只需要提供相对于Web应用程序根目录的路径,就可以构建出定位资源的绝对路径。

这是我们开发Web应用程序时一般所采取的策略。

通用的相对路径解决办法

Java中各种相对路径非常多,不容易使用,非常容易出错。因此,编写了一个便利方法,帮助更容易的解决相对路径问题。

Web应用程序中使用JavaSE运行的资源寻址问题

在JavaSE程序中,我们一般使用classpath来作为存放资源的目的地。但是,在Web应用程序中,我们一般使用classpath外面的WEB-INF及其子目录作为资源文件的存放地。

在Web应用程序中,我们一般通过ServletContext.getRealPath("/")方法得到Web应用程序的根目录的绝对路径。这样,我们只需要提供相对于Web应用程序根目录的路径,就可以构建出定位资源的绝对路径。

Web应用程序,可以作为Web应用程序进行发布和运行。但是,我们也常常会以JavaSE的方式来运行Web应用程序的某个类的main方法。或者,使用JUnit测试。这都需要使用JavaSE的方式来运行。

这样,我们就无法使用ServletContext.getRealPath("/")方法得到Web应用程序的根目录的绝对路径。

而JDK提供的ClassLoader类,它的getResource(String name),getResourceAsStream(String name)等方法,使用相对于当前项目的classpath的相对路径来查找资源。

读取属性文件常用到的ResourceBundle类的getBundle(String path)也是如此。

它们都只能使用相对路径来读取classpath下的资源,无法定位到classpath外面的资源。

Classpath外配置文件读取问题

如,我们使用测试驱动开发的方法,开发Spring、Hibernate、iBatis等使用配置文件的Web应用程序,就会遇到问题。

尽管Spring自己提供了FileSystem(也就是相对于user.dir目录)来读取Web配置文件的方法,但是终究不是很方便。而且与Web程序中的代码使用方式不一致!

至于Hibernate,iBatis就更麻烦了!只有把配置文件移到classpath下,否则根本不可能使用测试驱动开发!

这怎么办?

通用的相对路径解决办法

面对这个问题,编写一个助手类`ClassLoaderUtil`,提供一个便利方法[public static URL getExtendResource(String relativePath)]。在Web应用程序等一切Java程序中,需要定位classpath外的资源时,都使用这个助手类的便利方法,而不使用 Web应用程序特有的ServletContext.getRealPath("/")方法来定位资源。

利用classpath的绝对路径,定位所有资源

这个便利方法的实现原理,就是“利用classpath的绝对路径,定位所有资源”。

ClassLoader类的getResource("")方法能够得到当前classpath的绝对路径,这是所有Java程序都拥有的能力,具有最大的适应性!

而目前的JDK提供的ClassLoader类的getResource(String 相对路径)方法,只能接受一般的相对路径。这样,使用ClassLoader类的getResource(String 相对路径)方法就只能定位到classpath下的资源。

如果,它能够接受“../”这样的参数,允许我们用相对路径来定位classpath外面的资源,那么我们就可以定位位置的资源!

当然,我无法修改ClassLoader类的这个方法,于是,我编写了一个助手类ClassLoaderUtil类,提供了[public static URL getExtendResource(String relativePath)]这个方法。它能够接受带有“../”符号的相对路径,实现了自由寻找资源的功能。

以上这篇基于JAVA文件中获取路径及WEB应用程序获取路径的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。

展开阅读

Java相关资源

  • 征服Ajax:Web.2.0快速入门与项目实践(Java)

    征服Ajax:Web.2.0快速入门与项目实践(Java)

    大小:29.85MBAjax

    立即下载
  • Java Web开发就该这样学

    Java Web开发就该这样学

    《 Java Web开发就该这样学 》基于建构主义教育思想,通过大量循序渐进的案例,让学生在体验中掌握Java Web 相关知识,同时获得编程能力、排错能力和学习能力,《Java Web开发就该这样学》多

    大小:47.3 MBJava

    立即下载
  • Java Web从入门到精通

    Java Web从入门到精通

    这本书通过通俗易懂的语言、丰富多彩的实例,详细介绍了进行Java Web应用程序开发应该掌握的各方面技术,所有知识都结合具体实例进行介绍,涉及的程序代码给出了详细的注释,可作为初学者的自学用书

    大小:156.8 MBjava web开发

    立即下载
  • Three.js开发指南:WebGL的JavaScript 3D库

    Three.js开发指南:WebGL的JavaScript 3D库

    大小:180.1 MBThree.js

    立即下载
  • Java高手真经高级编程卷:Java Web高级开发技术

    Java高手真经高级编程卷:Java Web高级开发技术

    Java高手真经:JavaWeb高级开发技术(高级编程卷EJB+消息通信+分布式+开源框架) 作者:刘中兵Java研究室编著 出版时间:2009-9-1 【图书简介】 JavaWeb高级开发技术(EJB+消息通信+分布式+开源框架)》讲解JavaWeb开发中的高级开发技术,包括企业级的开发技术EJB、各种JavaEE的分布式开发技术、JavaWeb的各种开源技术与框架,这3部分内容层层递进,涵盖了JavaEE开发中的各种分布式与业务核心技术。讲解的主要内容包括如下。JavaWeb企业级开发技术EJB:包括

    大小:124.23MBJava编程

    立即下载
  • Java Web开发实例大全:基础卷

    Java Web开发实例大全:基础卷

    本书筛选、汇集了Java Web开发从基础知识到高级应用各个层面约600个实例及源代码,主要内容有开发环境搭建、Java语言基础、HTML/CSS技术、JSP基础与内置对象、JavaBean技术、Servlet技术、过滤器与监听器技术、JSTL标签库

    大小:175.2 MBJava

    立即下载

学习笔记

12小时24分钟前回答

详解Java Web项目启动执行顺序

一、web.xml配置节点简介 (1) context-param 格式定义 context-param param-namecontextConfigLocation/param-name param-valueclasspath:spring/spring-mybatis.xml/param-value/context-param 作用: 该元素用来声明应用范围(整个WEB项目)内的上下文初始化参数。 param-name 设定上下文的参数名称。必须是唯一名称 param-value 设定的参数名称的值,这里的例子是指定spring配置文件的位置 (2) listener 格式定义 //listen-class 指定监听类,该类继承ServletContextListener 包含初始化方法contextInitialized(ServletContextEvent event) 和销毁方法contextDestoryed(ServletContextEvent event)listener listener-classorg.springframework.web.context.ContextLoaderListener/listener-class/listener 作用:该元素用来注……

19小时24分钟前回答

java web服务器实现跨域访问

一、CORS概述 跨源资源共享标准通过新增一系列 HTTP 头,让服务器能声明那些来源可以通过浏览器访问该服务器上的各类资源(包括CSS、图片、JavaScript 脚本以及其它类资源)。另外,对那些会对服务器数据造成破坏性影响的 HTTP 请求方法(特别是 GET 以外的 HTTP 方法,或者搭配某些MIME类型的POST请求),标准强烈要求浏览器必须先以 OPTIONS 请求方式发送一个预请求(preflight request),从而获知服务器端对跨源请求所支持 HTTP 方法。在确认服务器允许该跨源请求的情况下,以实际的 HTTP 请求方法发送那个真正的请求。服务器端也可以通知客户端,是不是需要随同请求一起发送信用信息(包括 Cookies 和 HTTP 认证……

16小时3分钟前回答

java使用webuploader实现跨域上传详解

前言 项目中使用webuploader进行文件上传,需要用到跨域,查看webuploader的issues发现是支持上传的,但是他们写的回复都是不清不白的,有点迷糊;想了半天才知道咋回事,也可能是我比较笨,再次记录下java中详细的处理。 webuploader进行上传,会执行2个请求;一个option请求,一个post(根据你的webuploader的配置method 值决定),需要在option请求中对响应头进行处理,post响应头也进行响应的处理。 以servlet为例: @WebServlet(description = "文件上传",value = {"/file/upload"})public class FileUpload extends HttpServlet { public FileUpload() { super(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOExcept……