论坛首页 Java企业应用论坛

Struts2中的路径问题总结

浏览 18442 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-02-16   最后修改:2011-02-16

     Struts2 中路径问题是一个棘手的问题,初学时经常被路径问题搞得很烦,通过网上查找资料和自己实战中遇到的问题今天来对 Struts2 中的路径问题来一个总结,当然可能不会很完整,不过后续会进行补充:

1.   Struts2 一个要匹配路径的地方就是在处理完请求之后对页面进行分发的时候,也就是 result 元素里面的内容。

假设项目名为 Struts2

在地址栏中访问 action URL 基本是以 http://localhost:8080/Struts 开头

比如 <action name="home" class="test.HomeAction" namespace="/">

        <result name="success"> 要访问的 jsp 页面 /result>

</action>

这里有两种方式来写要访问的 jsp 页面,一种加“ / ”,另一种是不加“ / ”。

1) jsp 页面写成 /Pages/path.jsp, 那么就会从项目的根路径中开始找也就是,也就是 Struts 所在的根目录,在一层一层的下去找。

2) jsp 页面写成 Pages/path.jsp, 那么就会从当前路径开始找 ( 注意当前路径是指当前访问者请求的目录 ) ,在这个例子中的我们是通过请求 action ,进而间接访问到 jsp 文件的,所以当前路径应该就是 action 所在的路径,在本例中也就是 http://localhost:8080/Struts ,从这里可以看到当前路径就是根路径,所以两种方式都可以访问到 jsp 页面,如果当前路径不是根路径那么情况就不同了。

 

总结:为了不出错,建议加上“ / ”。

 

 

2. 在页面中涉及到匹配路径的问题,在这里我们要弄清楚一个小知识点:在 jsp 页面中“ / ”指的是整个站点根路径也就是这里的“ http://localhost:8080/ , 而不是 webapps 所在的根路径。

在页面中涉及到的路径问题,看似很复杂,但是解决起来很简单。就是统一用绝对路径,

jsp 文件中可以这样写来统一路径:

<%

String contextPath=request.getContextPath();

String basePath=requset.getScheme()+"://"+requset.getServerName()+":"+

request.getServerPort()+path+"/";

%>

 

<head></head> 中写成这样

<base herf="<%=basePath>">

这说明在该页面中的所有路径都是于项目的 WebRoot 为相对路径,如项目的 WebRoot 下的 Images/xxx.jpg , 在页面中就直接这样访问。

在页面中的路径问题看似很复杂,但是解决起来相当的简单。

注意:路径最后有“ / ”。

比如

在地址栏中输入 http://localhost:8080/Struts2/path/path.action 访问到了 my.jsp

my.jsp 的页面中有这样的一个链接: < a href="index.jsp"> 并且两者在同一个目录下,按道理说直接点就可以访问的,但是事实上访问不到,地址栏中变成

http://localhost:8080/Struts2/path/index.jsp ,为什么为变成这样呢?因为:在 my.jsp 页面里它不会去看 jsp 的真正路径在哪里,它只会去看这个 jsp 映射到我们的服务器的 URL 地址。

所以访问就不成功。

 

   总之,用了struts2来实现跳转的话想对的就是地址栏中action的访问地址,是以这个地址为标准的。这里强调一下

<base href=”<%=basePath%>”/> 

 这个意思是指这个jsp页面里所有的<a href=“”/>连接都会在前面加上basePath,不仅仅是这对于<head></head>中的:

<link rel="stylesheet" href="style/css/index.css" type="text/css"
			media="screen" charset="utf-8" />
<script src="style/js/jquery.js" type="text/javascript"></script>

 也是起作用的。

 

    我在网上看到有个使用这样解决的,这里也记录一下:

结构:
	WebRoot
	|
	 common
	 |
	  css
	  |
           common.css
         |js
           |common.js


	<link rel="stylesheet" type="text/css"
			href="<c:url value='/common/css/common.css' />" />

		<script language="javascript" type="text/javascript"
			src="<c:url value='/common/js/common.js'/>"></script>

然后在jsp 页面中用<c:url>的方式导入css 就永远没有存在跳转后css 无效了,同理js 也一样
 
   发表时间:2011-02-17  
引用
这个意思是指这个jsp页面里所有的<a href=“”/>连接都会在前面加上basePath,不仅仅是这对于<head></head>中的:



那我要是这个链接是其他webapp下的呢?
0 请登录后投票
   发表时间:2011-02-17  
我觉得最关键的就是这一句String contextPath=request.getContextPath();
搞明白了什么叫做contextPath就什么都明白了。我对这个的解释叫做上下文路径,容器路径,web标准里面取到后台的URL是容器路径之后的部分。
0 请登录后投票
   发表时间:2011-06-02  
绝对路径就是王道
0 请登录后投票
   发表时间:2011-07-28  
看了只能让人更不能理解
0 请登录后投票
   发表时间:2011-08-08  
感觉讲的不是很清楚
0 请登录后投票
   发表时间:2011-08-08  
${pageContext.request.contextPath}/..肯定找的到。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics