大家好,感谢邀请,今天来为大家分享一下contextpath的问题,以及和contextpath有什么用的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!
在同一个页面中为什么contextpath会不同
${pageContext.request.contextPath}是JSP取得绝对路径的方法,等价于<%=request.getContextPath()%>。
也就是取出部署的应用程序名或者是当前的项目名称
比如我的项目名称是demo1在浏览器中输入为${pageContext.request.contextPath}或<%=request.getContextPath()%>取出来的就是/demo1,而"/"代表的含义就是
故有时候项目中这样写${pageContext.request.contextPath}/a.jsp
绝对路径与相对路径的比较
1)采用相对路径遇到的问题
相对路径固然比较灵活,但如果想**页面内的代码却变得比较困难,因为不同的页面具有不同的相对路径,**后必须修改每一个连接的路径。
如果页面被多于一个的页面所包含,那么被包含页面中的相对路径将是不正确的。
如果采用Struts的Action返回页面,那么由于页面路径与 Action路径不同,使得浏览器无**确解释页面中的路径,如页面为/pages/cust/cust.jsp,图片所有目录为/images/title.gif,这时在/pages/cust/cust.jsp中的所用的路径为””,但是如果某一个Action的Forward指向这个JSP文件,而这个Action的路径为/cust/manage.do,那么页面内容中””就不再指向正确的路径了。
解决以上问题似乎只有使用绝对路径了。
2)采用绝对路径遇到的问题
随
着不同的Web应用发布方式,绝对路径的值也不同。如Web应用发布为MyApp,则路径”/MyApp/images/title.gif”是正确的,
但发布为另一应用时如MyApp2,这个路径就不对了,也许这个情况比较少,但以default方式发布Web应用时以上绝对路径也不
同:”/images/title.gif”。
二.解决方案
1)采用绝对路径,但为了解决不同部署方式的差别,在所有非struts标签的路径前加${pageContext.request.contextPath},如原路径为:
”/images/title.gif”,改为
“${pageContext.request.contextPath}/images/title.gif”。
代码”${pageContext.request.contextPath}”的作用是取出部署的应用程序名,这样不管如何部署,所用路径都是正确的。
缺点:
操作不便,其他工具无**确解释${pageContext.request.contextPath}
2)采用相对路径,在每个JSP文件中加入base标签,如:
<base href="http://${header['host']}${pageContext.request.contextPath}/pages/cust/relation.jsp"/>
这样所有的路径都可以使用相对路径。
缺点:
对于被包含的文件依然无效。
真正使用时需要灵活应用1)和2),写出更加健壮的代码。
在使用的时候可以使用${pageContext.request.contextPath},也同时可以使用<%=request.getContextPath()%>达到同样的效果,同时,也可以将${pageContext.request.contextPath},放入一个JSP文件中,将用C:set放入一个变量中,然后在用的时候用EL表达式取出来。
springboot实现特定接口跳过context-path
答案:
在Spring Boot中要实现特定接口跳过context-path,可以通过配置来实现。
首先,在application.yml或application.properties文件中添加如下配置:
server.servlet.context-path=/yourContextPath
然后,对于特定接口,可以通过自定义RequestMappingHandlerMapping来实现。创建一个继承自RequestMappingHandlerMapping的类,例如:
public class CustomRequestMappingHandlerMapping extends RequestMappingHandlerMapping{
@Override
protected RequestCondition<?> getCustomTypeCondition(Class<?> handlerType){
return null;
}
@Override
protected RequestCondition<?> getCustomMethodCondition(Method method){
//这里可以根据方法名或其他条件判断是否是特定接口
if("特定接口方法名".equals(method.getName())){
return new CustomRequestCondition();
}
return null;
}
private static class CustomRequestCondition implements RequestCondition<CustomRequestCondition>{
@Override
public CustomRequestCondition combine(CustomRequestCondition other){
return this;
}
@Override
public int compareTo(CustomRequestCondition other, HttpServletRequest request){
return 0;
}
@Override
public RequestCondition<CustomRequestCondition> getMatchingCondition(HttpServletRequest request){
//这里设置跳过context-path
request.setAttribute(ServerWebExchangeUtils.ORIGINAL_REQUEST_URI_ATTR, request.getRequestURI());
request.setAttribute(ServerWebExchangeUtils.ORIGINAL_CONTEXT_PATH_ATTR,"");
return this;
}
}
}
最后,将这个自定义的RequestMappingHandlerMapping注册到Spring容器中,可以通过在配置类中添加如下代码:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer{
@Override
public void configureHandlerMapping(RequestMappingHandlerMapping registry){
registry.setMappingComparator(new CustomRequestMappingHandlerMapping());
}
}
解释:
1.第一步配置server.servlet.context-path是设置整个应用的上下文路径。
2.创建自定义的RequestMappingHandlerMapping类,通过重写getCustomMethodCondition方法来判断是否是特定接口。
3.在CustomRequestCondition类中,通过设置request的属性来跳过context-path。
4.最后在配置类中注册这个自定义的RequestMappingHandlerMapping,使其生效。这样就能实现特定接口跳过context-path。
request.getContextPath在PHP中怎么写
1. GET是从服务器上获取数据,POST是向服务器传送数据。
2. GET是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。POST是通过HTTP POST机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3.对于GET方式提交表单数据,服务器端用$_GET[‘name’]获取变量的值,对于POST方式提交表单数据,服务器端用$_POST[‘name’]获取提交的数据,当然,两者都可以通过$_REQUEST[‘name’]获得表单数据。对于REQUEST方式提交表单数据,服务器端用$_REQUEST[‘name’]获取变量的值,但这种方式很少用。
4. GET传送的数据量较小,不能大于2KB。POST传送的数据量较大,一般被默认为不受限制。但理论上,一般认为不能超过100KB。
5. GET安全性非常低,POST安全性较高。
6. GET表单值可以通过_GET获取;但通过action的url设置的参数总是获取不到的,<form method="get" action="a.asp?b=b">跟<form method="get"action="a.asp">是一样的,也就是说,在这种情况下,GET方式会忽略action页面后边带的参数列表。POST表单值可以通过_POST获取;但通过action的url参数设置的参数则可以不能通过_POST获取到。action=test.php?id=1这种就是GET方式传值,可以用$_REQUEST和$_GET接受传值,但不能用POST方式获取到值,即使表单是POST方式提交。所在,在提交表单时,如果action中同时有参数,最好只能通过POST表单方式,对于表单内数据,直接通过POST获取,对于action中参数,童工GET获取。
在做数据查询时,建议用GET方式,而在做数据添加、修改或删除时,建议用POST方式。
request是先读取 get再读post的,同时存在,即覆盖掉前面的变量。
专题推荐:
