JSF 2.0 页面中的 SVG 图形对象入门

发布于 2024-10-08 23:16:28 字数 545 浏览 3 评论 0 原文

我想做的是创建具有交互式 SVG 内容的网页。我将其作为 Java 桌面应用程序使用 Batik 来渲染我的 SVG 并收集 UI 事件(例如鼠标单击)。现在我想以同样的方式在我的 JSF (Primefaces) Web 应用程序中使用这些 SVG 图形文件。

尝试开始,我发现这不起作用:

我不介意通过阅读来提高学习曲线。令人有点惊讶的是,一些谷歌搜索没有找到任何有用的东西。

我发现的结果表明我必须使用 f:verbatim 标签来执行此操作,就像我手动编码 HTML 一样。然后我必须添加一些脚本来捕获 SVG 事件并将它们反馈到 AJAX 代码中。如果我必须做所有这些,我会的,但我希望有一种更简单、自动化的方法。

所以问题是:

  1. 如何首先渲染图像?
  2. 如何将 DOM 事件从页面的 SVG 部分返回到支持 bean?

非常感谢您的指点。

What I want to do is create web pages with interactive SVG content. I had this working as a Java desktop application using Batik to render my SVG and collect UI events like mouseclick. Now I want to use those SVG graphics files in my JSF (Primefaces) web application in the same way.

Trying to get started, I found this didn't work:

<h:graphicImage id="gloob" value="images/sprinkverks.svg"
alt="Graphic Goes Here"/>

I don't mind doing some reading to get up the learning curve. It was just a bit surprising that some google searches didn't turn up anything useful.

What I did find suggested that I would have to do this with the f:verbatim tag as if I were hand-coding the HTML. I would then have to add some script to capture the SVG events and feed them back into the AJAX code. If I have to do all that I will, but I was hoping there would be an easier and automated way.

So the questions are:

  1. How to get the image to render in the first place?
  2. How to get the DOM events from the SVG portion of the page back to the backing beans?

Much thanks for any pointers.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

旧时模样 2024-10-15 23:16:28

如何首先渲染图像?

仅呈现 HTML 元素。这不适用于当前浏览器中的 SVG 对象。您需要 。从 JSF 1.2 开始,不需要 < code> 丑陋。在 Facelets 上,您可以像这样在纯 HTML 中内联 EL:

<object type="image/svg+xml" data="#{bean.svgUrl}">

标准 JSF 实现 但是不提供呈现 的 UI 组件,因此您必须以普通 HTML 方式执行此操作。我已经检查过 PrimeFacesOpenFacesRichFaces,但是还没有人提供针对嵌入 SVG 对象的组件。 PrimeFaces 有一个 和 RichFaces 对于电影对象,仅此而已。


如何将 DOM 事件从页面的 SVG 部分返回到支持 bean?

最好的选择是编写一些 JavaScript 来委托隐藏的 JSF ajax 表单。将必要的数据写入隐藏字段并触发 更改或操作。您可以在 这个答案

How to get the image to render in the first place?

The <h:graphicImage> just renders a HTML <img> element. This doesn't work for SVG objects in current browsers. You need <object type="image/svg+xml">. Since JSF 1.2, there's no need for the <f:verbatim> ugliness. On Facelets you can just inline EL in plain HTML like so:

<object type="image/svg+xml" data="#{bean.svgUrl}">

The standard JSF implementation however doesn't offer an UI component which renders an <object>, so you have got to do it the plain vanilla HTML way. I've checked at PrimeFaces, OpenFaces and RichFaces, but no one offer a component yet which is targeted on embedding SVG objects. PrimeFaces has a <p:media> and RichFaces an <a4j:mediaOutput> for movie objects, but that's it.


How to get the DOM events from the SVG portion of the page back to the backing beans?

Your best bet is to write some JavaScript which delegates to a hidden JSF ajax form. Write the necessary data to the hidden fields and trigger the <f:ajax> change or action. You can find a similar example in this answer.

没企图 2024-10-15 23:16:28

您可以尝试在 ItsNat 和 JSF 之间进行某种混合,例如使用 iframe 来包含 ItsNat 生成的包含 SVG 的标记。 itsNat 提供了许多将 SVG 集成到 Web 应用程序中的选项,纯 SVG 或 HTML 中内联的 SVG,包括 SVG 事件和 Batik(顺便说一下,Batik 小程序中的 SVG 事件将在 ItsNat 1.1 中修复)。

想法:使用会话属性在JSF和ItsNat之间共享桥接对象

You could try some kind of mix between ItsNat and JSF, for instance using an iframe to contain ItsNat generated markup containing SVG. ItsNat provides many options to integrate SVG in web applications, pure SVG or SVG inline in HTML, including SVG events and Batik (by the way SVG events in Batik applet are going to be fixed in ItsNat 1.1).

Idea: use a session attribute to share a bridge object between JSF and ItsNat

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文