一般网站部署后,访问路径是不带项目名称的,比如最代码的服务器部署目录:/data/www/zuidaima/,在tomcat的conf/server.xml中host的访问配置是:
<Host name="localhost" appBase="webapps"
unpackWARs="false" autoDeploy="false"
xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/data/www/zuidaima/" path="/">
</Host>
在tomcat作为服务器的网站开发中,我们一般把静态的css,js和image资源放到网站根目录下(与WEB-INF同级目录)。我在jsp引入js等静态资源的时候需要这样:
<script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery.js"></script>这样写完全不会有错,但是看着总是不爽,若是用struts2的话,直接在写个BaseAction定一个变量冲到值栈中页面就很方便取到。但是现在用的是springMVC,同样也想向下面那个写怎么办呢?
<script type="text/javascript" src="${URL}/js/jquery.js"></script>1思路一
很简单暴力,在每个请求里面都放进去一URL变量,
String baseUrl=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort() + request.getContextPath()request.setAttribute("URL", baseUrl)
至于为什么是用上面的方式获取网站跟目录而不是直接用request.getContextPath(),笔者还没深入研究。目前证实上面方式获取是没有错的,只有request.getContextPath()有时候会获取不到,以后再深入研究下。
分析:不用多说,这样写比在页面上用request.getContextPath()还膈应人,毫无疑问pass掉。
思路二
如果你的网站结构用的采用iframe的方式,那么可以在iframe外层界面请求的接口里加上上面代码,然后在外层iframe界面定义个变量url先获取值,在子页面就可以直接用了。
父界面:var url = “${URL}”;子界面引用就直接用parent.url
分析:算了,我也圆不下去了,且不说你的网站是不是所有都用了iframe,就算是,那些写也不友好,就当笔者是凑字数的吧,忽略此条。
思路三
其实就是思路一的升级版,思路一是在每个请求里面自己手动加的,那我们完全可以利用springMVC拦截器的方式,在每个请求里面放上一个网站根目录变量。下面直接贴代码了。
springMVC配置文件里面加上:
<!-- 拦截器 --><mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.jurlon.interceptor.SecurityInterceptor">
</bean>
</mvc:interceptor>
</mvc:interceptors>
新建一个拦截器类并获取网站根目录,然后将其放进request里面:
public class SecurityInterceptor implements HandlerInterceptor{@Override
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
// TODO Auto-generated method stub
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object o) throws Exception {
String baseUrl =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort() + request.getContextPath()
request.setAttribute("URL", baseUrl)//网站根目录变量
return true
}
前端引用js:
<script type="text/javascript" src="${URL}/js/jquery.js"></script>1搞明白了url相对路径,根路径的问题,跳转的时候url到底该怎么写就容易理解和记忆了。
比如我现在地址栏是 http://localhost:8080/SpringMVC/index.jsp
那么当前路径就是 http://localhost:8080/SpringMVC ,即去掉原始的最后一个路由后,剩下的路径。
如何使用它?有这么个约定:
直接写路径 或者用 ./ 会把当前路径和它拼起来,形成真正的路径。
比如: <a href="hello/testServletAPI">test</a>
或者: <a href="./hello/testServletAPI">test</a>
最后拼出来都是 http://localhost:8080/SpringMVC/hello/testServletAPI
而你上面写那两个超链接里的路径,叫做 相对路径 。 ./ 是当前目录, ../ 就是再向上一级。
在做不同请求时,根路径也不一样。
如何使用根路径?
/hello 即表示 根路径+hello ,比如
<a href="/hello/testServletAPI">test</a>,访问的是 http://localhost:8080/hello/testServletAPI
直接返回string的;
返回ModelAndView的;
如果配置了视图解析器:
那么会对success加上前缀和后缀。并且跳转方式是转发。
首先明确两个事啊,转发是发生在服务端的,因此你转发可以转发到服务器的内部目录下,就是WEB-INF下,去访问它目录下的页面。但是重定向只能访问webapp下除WEB-INF的路径。
先把request和response拿进来。
服务器内部转发的根路径是 主机名/项目名 ,重定向的根路径是 主机名 。因此两者的url不太一样。
同样访问webapp下的 newPage.jsp ,重定向需要自己手动把项目名加上。
同样访问webapp下的newPage.jsp:
重定向一般用相对路径,因为省去自己写项目名。
此处 ../ 是因为当前路径是 主机/项目名/hello ,所以要再向上一级目录。形成 主机/项目名/newPage.jsp
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)