spring MVC开发中静态页面访问路径为什么出错

spring MVC开发中静态页面访问路径为什么出错,第1张

java web容器中项目部署时的访问路径

一般网站部署后,访问路径是不带项目名称的,比如最代码的服务器部署目录:/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


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/280809.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-21
下一篇2023-04-21

发表评论

登录后才能评论

评论列表(0条)

    保存