关于struts2的命名空间和jsp页面中路径问题

http://brightmyfuture.blog.sohu.com/116716733.html

经常被Jsp、Servlet中相对路径和绝对路径问题给搅匀,今天被这个问题结合Struts2的namespace彻底弄的找不到北了,研究了一天,终于大彻大悟,彻底搞懂了这个问题,赶快记下来。
页面脚本有两种状态,分别是在IDE中的Develop状态以及部署在Web Server以后的运行状态。这两种状态的相对路径是完全不一样的,如果在这混淆了那代码在部署运行后崩溃的几率达到十有八九了。在IDE中的 Develop状态相对的是真实的本页面的相对路径,而在Web Server中处于运行状态的相对路径就不在是前面所述了,而是相对于URL的路径。
比如配置了如下片段:
<struts>
<package name="oss" extends="struts-default">
<action name="login" class="trh.oss.action.login.LoginRegisterAction">
<result name="success">/login.jsp</result>
</action>
<action name="*">
<result>/pages/{1}.jsp</result>
</action>
</package>
</struts>
假设有一个访问请求http://localhost:8080/oss/register.action,Struts2的FilterDispatcher将返还register.jsp页面,在物理文件路径上目录结构如下:
/pages
------register.jsp
------registeritem.jsp
------/images
-------------Main_Top.htm
-------------Main_Left_register.htm
-------------Main_Bottom.htm
register.jsp处于IDE中(如果不用IDE,在本地文件系统中也是一样的)代码如下:
<%@ page language="java" contentType="text/html; charset=gbk"
pageEncoding="gbk"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>用户注册</title>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<meta content="MSHTML 6.00.2900.2668" name="generator">
</head>
<frameset border="0" frameSpacing="0" rows="118,*,22" frameBorder="no" cols="*">
<frame name="topFrm" src="images/Main_Top.htm" noResize scrolling="no">
<frameset border="0" frameSpacing="0" rows="*" frameBorder="no" cols="180,*">
<frame name="leftFrm" src="images/Main_Left_register.htm" frameBorder="0" noResize>
<frame name="rightFrm" src="registeritem.jsp" frameBorder="0">
</frameset>
<frame name="bottomFrm" src="images/Main_Bottom.htm" noResize scrolling="no">
</frameset>
<noframes></noframes>
</html>
OK!没有任何的问题,可以正常显示。然后令人郁闷的是将其部署在Server上崩溃了,我上午调了一上午,用尽各种办法,什么根路径,什么basePath之类的全用了,就是崩溃,就是不行。
原因在哪?相对路径是相对URL的路径,不是相对本地文件系统的路径。在本地开发的时候相对的是本地文件系统的路径,而在服务器上运行的时候是相对于 URL的访问路径。故怎么办呢?已经说的很简单了,Struts2的核心有两个组件分别是Action组件和拦截器组件,Struts2是用 Package对其进行管理的,定义包的时候有一个属性叫做namespace,将其制定为pages就一切OK了。
这样一个完整的请求响应过程为如下:
1.客户端发出http://localhost:8080/oss/pages/register.action
2.服务器断Struts2的核心控制器FilterDispatcher截获此请求,用

<action name="*">这个Action的定 义来匹配此请求,并返还/pages/register.jsp物理视图资源,此页面中用到了四个相对路径,全都是相对http://localhost:8080/oss/pages的相对路径。
3.回传给客户端生成的静态页面。
一切OK了!路径啊路径,很神奇。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值