使用基于Java的后端(即servlet和JSP),如果我需要来自JavaScript的contextPath,建议的模式是什么,为什么?我可以想到一些可能性.我错过了吗?
1.将SCRIPT标记刻录到将其设置在某个JavaScript变量中的页面中
<script>var ctx = "<%=request.getContextPath()%>"</script>
Run Code Online (Sandbox Code Playgroud)
这是准确的,但在加载页面时需要执行脚本.
2.在一些隐藏的DOM元素中设置contextPath
<span id="ctx" style="display:none;"><%=request.getContextPath()%></span>
Run Code Online (Sandbox Code Playgroud)
这是准确的,并且在加载页面时不需要任何脚本执行.但是在需要访问contextPath时确实需要DOM查询.如果您非常关心性能,则可以缓存DOM查询的结果.
3.尝试通过检查document.URL或BASE标记在JavaScript中找出它
function() {
var base = document.getElementsByTagName('base')[0];
if (base && base.href && (base.href.length > 0)) {
base = base.href;
} else {
base = document.URL;
}
return base.substr(0,
base.indexOf("/", base.indexOf("/", base.indexOf("//") + 2) + 1));
};
Run Code Online (Sandbox Code Playgroud)
加载页面时不需要执行任何脚本,也可以根据需要缓存结果.但这只有在您知道上下文路径是单个目录时才有效 - 而不是根目录(/)或多个目录down(/mypath/iscomplicated/).
我倾向于哪种方式
我喜欢隐藏的DOM元素,因为它不需要在页面加载时执行JavaScript代码.只有当我需要contextPath时,我才需要执行任何操作(在这种情况下,运行DOM查询).
我试图了解Web.xml中会话超时的会话配置的真正目的.
<!-- Session Configuration -->
<session-config>
<session-timeout>60</session-timeout>
</session-config>
Run Code Online (Sandbox Code Playgroud)
现在让我告诉你我的问题.
我的应用程序是导入/上传.txt文件,由于需要导入数百万条记录,因此该文件的使用时间超过1小时.但是,虽然我的应用程序仍在导入正在进行的.txt文件,但会话在1小时后超时.应用程序在后台执行某项任务时,此类应用程序不应超时.
我在Tomcat 7中将一个Web应用程序部署为WAR文件.该应用程序构建为一个多模块项目:
通常,我们可以将JSP文件放在webapp项目中,并相对于上下文引用它们:
/WEB-INF/jsp/someMagicalPage.jsp
Run Code Online (Sandbox Code Playgroud)
问题是我们如何处理特定于客户扩展项目的JSP文件,这些文件不应始终包含在WAR中.不幸的是,我看不到JAR文件中的JSP.尝试classpath:jsp/customerMagicalPage.jsp在JspServlet中找不到的文件,因为它使用了ServletContext.getResource().
传统上,我们"解决"了maven解包客户扩展JAR,定位JSP,并在构建它时将它们放入WAR中.但理想的情况是,您只需在Tomcat中的爆炸WAR中放置JAR并发现扩展 - 这适用于除JSP之外的所有内容.
反正有没有解决这个问题?标准方式,特定于Tomcat的方式,黑客还是变通方法?例如,我一直在考虑在应用程序启动时解压缩JSP ...
我正在尝试报告从我的webapp返回的每个HTTP状态代码.但是,状态代码似乎无法通过ServletResponse访问,或者即使我将其转换为HttpServletResponse也是如此.有没有办法在ServletFilter中访问这个值?
web.xml有什么用?我们为什么要使用?
<filter>
<filter-name>wicket.mysticpaste</filter-name>
<filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
<init-param>
<param-name>applicationClassName</param-name>
<param-value>com.mysticcoders.WicketApplication</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>wicket.mysticpaste</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
这个文件管理器和文件管理器有什么作用?
我有一个服务在HttpServletRequest对象上做一些工作,特别是使用request.getParameterMap和request.getParameter来构造一个对象.
我想知道是否有一种直接的方式来获取提供的URL,以字符串的形式,比如说
String url = "http://www.example.com/?param1=value1¶m";
Run Code Online (Sandbox Code Playgroud)
并轻松将其转换为HttpServletRequest对象,以便我可以使用单元测试进行测试?或者至少只是为了让request.getParameterMap和request.getParameter正常工作?
在我的应用程序中,我有一个servlet,在web.xml中定义如下:
<servlet>
<display-name>Notification Servlet</display-name>
<servlet-name>NotificationServlet</servlet-name>
<servlet-class>com.XXX.servlet.NotificationServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>NotificationServlet</servlet-name>
<url-pattern>/notification/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
在使用Tomcat 7之后,我想使用@WebServlet将完成这项工作的注释.
这是我做的方式:
@WebServlet( name="NotificationServlet", displayName="Notification Servlet", urlPatterns = {"/notification"}, loadOnStartup=1)
public class NotificationServlet extends HttpServlet {
Run Code Online (Sandbox Code Playgroud)
它不起作用.有人可以告诉我我做错了什么吗?
我有一个包,我导入javax.servlet.*和javax.servlet.http.*当我尝试在命令提示符下编译它时,我得到错误
包javax.servlet不存在
我使用JDK 1.7.0和Tomcat 6.0.
在以下代码段中:
ServletContext context = request.getServletContext();
String path = context.getRealPath("/");
Run Code Online (Sandbox Code Playgroud)
是什么/在方法getRealPath()代表什么呢?我应该什么时候使用它?
这将使用临时 302 HTTP状态代码重定向请求:
HttpServletResponse response;
response.sendRedirect("http://somewhere");
Run Code Online (Sandbox Code Playgroud)
但是可以使用永久的 301 HTTP状态代码重定向它吗?
servlets ×10
java ×8
java-ee ×2
jsp ×2
web.xml ×2
annotations ×1
compilation ×1
javascript ×1
mocking ×1
realpath ×1
servlet-3.0 ×1
tiles ×1
tomcat ×1
tomcat7 ×1