码头:默认servlet上下文路径

码头:默认servlet上下文路径,第1张

码头:默认servlet上下文路径

DefaultServlet
设计看后请求URI
contextPath

示例代码中,当您将servlet的url模式

/
更改
/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模式轻松地请求内容。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5131129.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存