当前位置: 首页 > news >正文

理解java Web项目中的路径问题

理解java Web项目中的路径问题

本文以项目部署在tomcat服务器为例,其他相信也是一样的。

先说明请求页面的写法,在web中,页面路径主要写的有以下几种

  1、请求重定向

  2、浏览器的请求被服务器请求到新页面(我称为“转发”)

  3、超链接

  4、form表单提交的action

为了演示路径写法,首先先建一个项目(项目名WebPath),并建立一个servlet(PathServlet)

目录结构如下

以访问目录中index.jsp文件为例,jxf.path.PathServlet.jave中对以上四种路径的写法(红色部分)

复制代码
 1 package jxf.path;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 
 6 import javax.servlet.ServletException;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 public class PathServlet extends HttpServlet {
12     public void doGet(HttpServletRequest request, HttpServletResponse response)
13             throws ServletException, IOException {
14         //1、重定向
15         response.sendRedirect("/WebPath/index.jsp");
16         
17         //2、转发
18         //request.getRequestDispatcher("/index.jsp").forward(request, response);
19         
20         //3、超链接
21         //response.setContentType("text/html");
22         //response.getWriter().write("<thml><head></head><body><a href='/WebPath/index.jsp'>index.jsp<a></body></html>");
23     
24         //4、表单提交
25         //response.setContentType("text/html");
26         //response.getWriter().write("<thml><head></head><body><form action='/WebPath/index.jsp'><input type='submit' value='to index.jsp'/></form></body></html>");
27     }
28 
29 }
复制代码

路径的写法主要注意以两点:

  1、路径是谁发起的(浏览器,服务器)

  2、路径开头直接 “/” 表示当前路径(主要就是这个当前路径,搞清楚就明白了)

首先来分析“路径是由谁发起的”,以上四种写法,除了“2、转发”是服务器发起的,其他都是由浏览器发起的。

用过tomcat服务器的都应该明白一点,平常我们开发时候在浏览器中输入“http://localhost:端口号/项目名/xxx文件”请求需要的资源,并且根据tomcat的项目都是在%tomcat根目录%/webapps文件夹下,可得知,此时由浏览器发起的请求,代码中的“/”表示的当前路径就应该表示的是webapps的根目录

而代码中的“转发”,是由浏览器向服务器发起请求,而服务器根据请求的内容帮助其访问项目中的其他资源,并返回给浏览器。整个 “资源路径” 是由服务器来发起的,可以查看web项目在tomcat部署后的结构,对比MyEclipse中的项目结构,可理解为“/”表示当前目录是MyEclipse中项目的WebRoot的根目录(也可理为%tomcat%/webapps/WebPath根目录)。既然是“/”表示为WebRoot的根目录,那么访问这个index.jsp文件的写法应该为“/index.jsp”

 总结:   

  1、由浏览器发起的路径,“/”表示%tomcat根目录%/webapps根目录

  2、由服务器发起的路径,“/”表示项目中的WebRoot根目录

根据请求的资源的文件与“/”代表的路径的相对位置,即可写对访问的资源路径。

顺便提起src中的资源的访问路径

新建一个txt文件,随便写点内容,新建一个servlet,名为SourcePath,文件目录结构如下

jxf.path.SourcePath.java

复制代码
 1 public class SourcePath extends HttpServlet {
 2 
 3     public void doGet(HttpServletRequest request, HttpServletResponse response)
 4             throws ServletException, IOException {
 5         response.setContentType("text/html;charset=UTF-8");
 6         //String path = request.getRealPath("/WEB-INF/classes/demo.txt");
 7         //InputStream inputStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/demo.txt");
 8         String path = this.getServletContext().getRealPath("/WEB-INF/classes/demo.txt");
 9         File file = new File(path);
10         FileInputStream inputStream = new FileInputStream(file);
11         byte[] bytes = new byte[1024];
12         StringBuilder sb = new StringBuilder();
13         int len = 0;
14         while((len = inputStream.read(bytes))!=-1){
15             sb.append(new String(bytes,0,len));
16         }
17         inputStream.close();
18         response.getWriter().write(sb.toString());
19     }
20 
21 }
复制代码

web项目中加载资源文件有以下方法:   

  request对象.getRealPath("/WEB-INF/classes/demo.txt");//返回该文件绝对路径的字符串,不过在java Servlet API 2.1版本以后去除了,不推荐使用

  Context对象.getResourceAsStream("/WEB-INF/classes/demo.txt");//返回该文件绝对路径创建的InputStream

  Context对象.getRealPath("/WEB-INF/classes/demo.txt");//返回该文件绝对路径的字符串

而这些方法中的路径写法和上面的url原理是一样的,此时也是由服务器发起的,所以“/”代表的是WebRoot根目录,而src下的所有资源,项目部署后,都会自动放在/WEB-INF/classes目录下。所以应写为"/WEB-INF/classes/demo.txt"

posted on 2016-06-18 23:12 Haagen′Dazs 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/zchu2012/p/5597145.html

相关文章:

  • react 中千万不要在render里调用this.setState
  • 系统界面图片
  • HDU 3068 回文串-Manacher
  • reactJS的props.children.map函数来遍历会收到异常提示,为什么?应该如何遍历?
  • Elasticsearch 2.3.3 搜索引擎的elasticsearch-jdbc插件安装
  • Redux中同步 action 与异步 action 最大的区别是什么
  • setTimeout和setInterval的区别
  • shell脚本编程
  • 数组常用的处理方法 map,forEach,filter, every,some, set, concat, find 等
  • 阿里云自定义监控配置实例
  • Import 和 link引入的区别
  • 菜鸟如何才能快速提高自己的编程技术
  • css使子元素在父元素居中的各种方法/ 子元素居中有哪些方案
  • display:inline-block的用法
  • IE盒模型和W3C盒模型有什么不同?
  • 2017前端实习生面试总结
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Javascript基础之Array数组API
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 计算机常识 - 收藏集 - 掘金
  • 算法---两个栈实现一个队列
  • 一个项目push到多个远程Git仓库
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • #前后端分离# 头条发布系统
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (全注解开发)学习Spring-MVC的第三天
  • (五)c52学习之旅-静态数码管
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)用.Net的File控件上传文件的解决方案
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET CORE Aws S3 使用
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .netcore如何运行环境安装到Linux服务器
  • .NET开发人员必知的八个网站
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .sdf和.msp文件读取
  • @Data注解的作用
  • @RequestBody的使用
  • [20190113]四校联考
  • [AIGC] MySQL存储引擎详解
  • [Android] Upload package to device fails #2720
  • [ASP]青辰网络考试管理系统NES X3.5
  • [C++] Windows中字符串函数的种类
  • [CISCN2019 华东南赛区]Web4