如何从Java Servlet返回HTML文档?

22

这将返回一个字符串:

import javax.servlet.http.*;
@SuppressWarnings("serial")
public class MonkeyServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws IOException {

        resp.setContentType("text/plain");
        resp.getWriter().println("got this far");

    }

}

但是我无法让它返回一个HTML文档。以下内容无效:

import javax.servlet.http.*;
@SuppressWarnings("serial")
public class BlotServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws IOException {

        resp.setContentType("text/html");
        resp.getWriter().println("html/mypage.html");

    }

}

对于我这个新手表示抱歉!

编辑:

我已经把HTML放在不同的文档中了。所以我需要返回文档,或者以某种方式读取/解析它,这样我就不需要重新输入所有的HTML内容...

编辑:

我在我的web.xml文件中有这个。

<servlet> 
    <servlet-name>Monkey</servlet-name> 
    <servlet-class>com.self.edu.MonkeyServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Monkey</servlet-name> 
    <url-pattern>/monkey</url-pattern> 
</servlet-mapping>

有没有其他东西可以放进去,使它只返回一个文件,比如...

<servlet-mapping> 
    <servlet-name>Monkey</servlet-name> 
    <file-to-return>blot.html</file-to-return> 
</servlet-mapping>

不,那个Servlet映射是错误的。它不会起作用。 - Ravi K Thapliyal
1个回答

56
您可以从Servlet本身打印HTML(已弃用)。
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>My HTML Body</h1>");
out.println("</body></html>");

或者将请求转发到现有资源(servlet、jsp等)(称为向视图转发)(首选)
RequestDispatcher view = request.getRequestDispatcher("html/mypage.html");
view.forward(request, response);

您需要将当前HTTP请求转发到的现有资源不需要特殊处理,例如它只是像任何其他Servlet或JSP一样编写的;容器可以无缝处理转发部分。

只需确保提供正确的资源路径。例如,对于Servlet,RequestDispatcher需要正确的URL模式 (如在web.xml中指定的)

RequestDispatcher view = request.getRequestDispatcher("/url/pattern/of/servlet");

此外,请注意,可以从ServletRequestServletContext中检索到RequestDispatcher,其中前者可以使用相对路径

参考文献:
http://docs.oracle.com/javaee/5/api/javax/servlet/RequestDispatcher.html

示例代码

public class BlotServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws IOException {
        // we do not set content type, headers, cookies etc.
        // resp.setContentType("text/html"); // while redirecting as
        // it would most likely result in an IllegalStateException

        // "/" is relative to the context root (your web-app name)
        RequestDispatcher view = req.getRequestDispatcher("/path/to/file.html");
        // don't add your web-app name to the path

        view.forward(req, resp);    
    }

}

你能展示一下你提到的“现有servlet”是什么样子吗? - monkey blot
我担心我的问题可能过于复杂了... 我的情况是,我有一个HTML文档。我只是想让它在请求任何URL时被发送并加载到客户端浏览器中。我认为我已经接近成功了,目前只需要从上面的问题中调整1或2行代码。对吗? - monkey blot
1
(1) 是的,通过servlet我指的是像你问题中的代码。不,你现在的servlet应该直接分派到那个html文件。(2) 你需要在web.xml中为你的servlet配置一个捕获所有(/*)URL模式。然后这个servlet可以简单地转发(或包含)你的html文件。 - Ravi K Thapliyal
1
由于某种原因,只有文件名和调度程序代码都为.jsp时它才能正常工作,但是.html不起作用... 无论如何,没关系。我可以将所有的HTML文档更改为.jsp。 - monkey blot
1
很高兴你让它工作了,但是调度程序可以用于动态(servlet,jsps)以及静态(html)资源。您可能需要稍微调整指定的路径。 - Ravi K Thapliyal
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接