JSF元素在外部上下文中加载了相对url

时间:2013-12-06 12:28:47

标签: javascript jquery html jsf

我有一个内容脚本,在Web浏览器页面的顶部显示一个浮动div。 div通过jQuery.load或jQuery.get填充了我的Web应用程序的一些内容(在www.my.app/my/page上说)。

虽然页面的HTML内容正常,但未加载图像等资源。为图像生成的HTML看起来像

<img src=/my/image/path>

如果内容脚本应用于网站www.asite.com,浏览器将尝试从www.asite.com/my/image/path获取图像,而不是www.my.app/my/image/路径。

使用

从jsf生成相关图像
 <p:graphicImage value="#{tagImageController.imageFileContent}"/>

并在正确的上下文中(在正确的域上)正常工作。如果我的内容脚本使用iframe而不是div,则可以正常工作。

这是imageFileContent函数:

public StreamedContent getImageFileContent() {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    Map<String, String> requestParameterMap = externalContext.getRequestParameterMap();
    String tagIdStr = requestParameterMap.get("tag_id");
    if (tagIdStr == null || tagIdStr.isEmpty()) {
        streamedContent = defaultStreamedContent;
    } else {
        long tagId = Long.parseLong(tagIdStr);
        Tag tag = tagService.findTag(tagId);
        if (tag == null) {
            streamedContent = defaultStreamedContent;
        }
        streamedContent = loadImageStreamedContent(tag);
    }
    return streamedContent;
}

由于

1 个答案:

答案 0 :(得分:0)

您无法使用流内容控制<p:graphicImage>的域名。

只需使用普通HTML <img>@WebServlet提供动态图片内容即可。然后,您可以完全控制<img>的域名。

E.g。

<img src="//www.my.app/my/image/path" />

有这样的东西

@WebServlet("/image/*")
public class ImageServlet extends HttpServlet {

    @EJB
    private SomeImageService someImageService;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String path = request.getPathInfo().substring(1);
        Image image = someImageService.findSomehowBy(path);
        String filename = image.getFilename();
        byte[] content = image.getContent();

        response.setHeader("Content-Type", getServletContext().getMimetype(filename));
        response.setHeader("Content-Length", String.valueOf(content.length));
        response.setHeader("Content-Disposition", "inline; filename=\"" + filename + "\"");
        response.getOutputStream().write(content);
    }

}