我使用servlet和Jetty创建了一个小型Maven项目。 servlet工作正常并输出一个html页面。但是,链接的图像不会显示(缺失)。
这是我设置服务器代码的一小部分......
// Set handler 1 (Display Html)
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
context.addServlet(new ServletHolder(hws),"/hello");
// Set handler 2 (For the images)
WebAppContext wac = new WebAppContext();
wac.setContextPath("/img");
// Attach handlers to server
handlerList.setHandlers(new Handler[]{context,wac});
myServer.setHandler(handlerList);
输出html的一小部分servlet ......
PrintWriter out = response.getWriter();
response.setContentType( "text/html");
out.println( "<html><head><title>Hellow World</title></head>");
out.println( "<body><h1>Hello World</h1>" );
out.println( "<img src=\"/img/img.jpg\">" );
out.println( "</body></html>");
out.close();
图像文件(img.jpg)位于构建之后,位于jar文件根目录下的子文件夹“img”中...
我想使用更多图片,css文件和javascripts。所有这些都将嵌入Jar文件中。
有没有人有经验在servlet的输出中显示图像,以及图像位于jar文件中的位置?
由于
答案 0 :(得分:1)
在Joakim的大力帮助和反馈下,我能够解决问题。
为了帮助其他人解决同样的问题,我发布了我的解决方案......
第1步 我已经创建了一个文件夹,在构建位于根级别之后,在Jar文件中(文件夹的名称是&#34; webroot&#34;)。我已将所有图片,CSS和javascript文件放在此文件夹中。
myApp.jar
|_ "webroot" folder
|_ LionelRichie.jpg
|_ style.css
|_ myscript.js
|_ ...
第2步 我已经创建了servlet的基本设置。
// At the top of the class: setup the imports
import java.net.URL;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.webapp.WebAppContext;
...
// somewhere in your class ...
// Locate the path of the "webroot" folder, containing the images etc ...
URL warUrl = this.getClass().getClassLoader().getResource("webroot");
String warUrlString = warUrl.toExternalForm();
// Create a webAppContext, pointing the "webroot" folder to the "/files" url.
// The files will be available at <server>:<port>/files
WebAppContext wac = new WebAppContext();
wac.setResourceBase(warUrlString);
wac.setContextPath("/files");
// Setup your servlet ("myServlet"), so it can be accessed in the browser.
// The servlet can be used at <server>:<port>/hello
// Note: for some unknown reason, I was forced to configure the servlet
// with the root contextpath "/" last !
ServletContextHandler sch = new ServletContextHandler(ServletContextHandler.SESSIONS);
sch.setContextPath("/");
sch.setResourceBase(warUrlString);
sch.addServlet(new ServletHolder(myServlet),"/hello");
// Attach handlers to the server
HandlerList handlerList = new HandlerList();
handlerList.setHandlers(new Handler[]{wac, sch});
myServer.setHandler(handlerList);
第3步 在servlet中,将外部文件的url更改为正确的位置。
示例:
PrintWriter out = response.getWriter();
response.setContentType( "text/html");
// output the result
out.println( "<html><head><title>Hello</title></head>");
out.println( "<body><h1>Hello, is it me you're looking for ?</h1>" );
out.println( "<img src=\"/files/LionelRichie.jpg\">" );
out.println( "</body></html>");
out.close();
我希望这对某人有帮助......
答案 1 :(得分:0)
您的WebAppContext
没有定义资源库。
这意味着没有文件供它使用。
由于您使用的是ServletContextHandler
,因此您可能需要考虑......
ServletContextHandler
上使用指向jar文件中/webroot
的网址的资源库。使/webroot/img/
只是其中的另一个目录。DefaultServlet
引用来提供静态文件,并使用自己定义的资源库。