该
DefaultServlet设计看后请求URI
contextPath。
/更改
/foo/*为要在磁盘上查找的结果文件时,现在包括该
/foo/部分。
换句话说,请求URI的
/css/main.css结果在文件(在磁盘上)中它期望找到为
./src/webapp/foo/css/main.css
您的示例有一些缺陷。为您提供一个空的资源库不是明智的选择
ServletContextHandler,因为它
ServletContext本身
需要 访问该配置值。
您可以通过删除…来解决此问题
holderPwd.setInitParameter("resourcebase", "./src/webapp/");
并改用ServletContextHandler.setbaseResource(Resource) …
ctx.setResourcebase(Resource.newResource(new File("./src/webapp")));
这将使以下
ServletContext方法(无数servlet库使用)也能正常工作
String getRealPath(String path)
URL getResource(String path)
InputStream getResourceAsStream(String path)
Set<String> getResources(String path)
最后,为使设置合理
ServletContextHandler,您将
default在“默认url-
pattern”上添加Servlet名称,该名称恰好实现为
DefaultServlet。
像这样:
// Lastly, the default servlet for root content// It is important that this is added last.String defName = "default"; // the important "default" nameServletHolder holderDef = new ServletHolder(defName, DefaultServlet.class);holderDef.setInitParameter("dirAllowed","true");ctx.addServlet(holderDef,"/"); // the servlet spec "default url-pattern"
现在,如果您 还 需要将请求URI中的静态内容提供
/foo/*给不属于该Web
应用程序的目录,那么您也可以这样做。这将要求您设置另一个
DefaultServlet不参与的
ServletContext。
此设置的一个示例是…
package jetty;import org.eclipse.jetty.server.Server;import org.eclipse.jetty.server.ServerConnector;import org.eclipse.jetty.servlet.DefaultServlet;import org.eclipse.jetty.servlet.ServletContextHandler;import org.eclipse.jetty.servlet.ServletHolder;import org.eclipse.jetty.util.resource.PathResource;import java.io.File;import java.nio.file.Path;public class ManyDefaultServlet{ public static void main(String[] args) throws Exception { Server server = new Server(); ServerConnector connector = new ServerConnector(server); connector.setPort(8080); server.addConnector(connector); // The filesystem paths we will map Path homePath = new File(System.getProperty("user.home")).toPath().toRealPath(); Path pwdPath = new File(System.getProperty("user.dir")).toPath().toRealPath(); // Setup the basic application "context" for this application at "/" // This is also known as the handler tree (in jetty speak) ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); context.setbaseResource(new PathResource(pwdPath)); server.setHandler(context); // Fist, add special pathspec of "/home/" content mapped to the homePath ServletHolder holderHome = new ServletHolder("static-home", DefaultServlet.class); holderHome.setInitParameter("resourcebase",homePath.toUri().toASCIIString()); holderHome.setInitParameter("dirAllowed","true"); // Use request pathInfo, don't calculate from contextPath holderHome.setInitParameter("pathInfoOnly","true"); context.addServlet(holderHome,"/foo/*"); // must end in "/*" for pathInfo to work // Lastly, the default servlet for root content // It is important that this is last. String defName = "default"; // the important "default" name ServletHolder holderDef = new ServletHolder(defName, DefaultServlet.class); holderDef.setInitParameter("dirAllowed","true"); context.addServlet(holderDef,"/"); // the servlet spec "default url-pattern" server.start(); server.join(); }}
此 *** 作仅用一秒钟
DefaultServlet,仅使用一个唯一的资源库
DefaultServlet,并映射到以结尾的url模式
/*。
最后,
DefaultServlet告诉第二秒钟的init参数使用RequestURI的pathInfo,而不像通常那样在contextPath上拆分。
有关整个pathInfo,请求URI,contextPath和以url模式结尾的
/*内容的更多信息,请参见@
30thh的有用答案。
该独立
DefaultServlet声明不参与,
ServletContext并且库将无法
DefaultServlet通过
ServletContext方法查看或访问其中的内容。但是,所有传入的HTTP客户端请求都可以通过该url模式轻松地请求内容。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)