我正在寻找一种将URL片段(#)中的值注入bean(JSF)的方法,方法与注入查询参数值的方式相同。我使用Ben Alman的Bookmarkable插件(http://benalman.com/projects/jquery-bbq-plugin/)来创建jQuery片段。我希望来自prettyFaces的自定义正则表达式模式可以解决我的问题,但直到现在我还没有成功。
(http://ocpsoft.com/docs/prettyfaces/snapshot/en-US/html_single/#config.pathparams.regext)
我想在这里定义我的情况,如果有人有想法,我很乐意尝试一下。
我正在使用
RichFaces: 3.3.3,
Spring: 3.0.2版本,
Hibernate: 3.5.3-最终版本
JSF: 2.0.2-FCS,
PrettyFaces: 3.0.1
web应用程序生成以下类型的URL,其中参数列在散列(#)之后。这个想法是有一个基于ajax的Bookmarkable URL。因此,每次我单击更改系统状态的元素时,值都会通过ajax发送到服务器,并在重写散列后返回URL。散列后可以有1到3个参数,参数的数量是可选的。
我的目标是,当用户将URL加入书签(使用散列),然后重新访问保存的页面时,页面应该向系统注入正确的值,并在之前的状态下可视化页面(如query-参数)。
下面,我有一个正则表达式,它可以捕获散列之后的所有参数。
//URL:
http://localhost:8080/nymphaea/workspace/#node=b48dd073-145c-4eb6-9ae0-e1d8ba90303c&lod=75e63fcd-f94a-49f5-b0a7-69f34d4e63d7&ln=en
//Regular Expression:
\#(\w*\=(\w{8}-\w{4}-\w{4}-\w{4}-\w{12}))|\&(\w*\=(\w{8}-\w{4}-\w{4}-\w{4}-\w{12}))|\&(\w*\=\w{2})
我知道有些网站是怎么把URL片段发到服务器端逻辑的,
有没有办法将URL片段中的值注入到服务器端bean中?
发布于 2010-08-13 21:34:27
您可以借助window.onhashchange
来完成此操作,它会填充隐藏表单的输入字段,当输入字段发生更改时,该表单会异步提交自身。
下面是Facelets页面的启动示例:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>SO question 3475076</title>
<script>
window.onload = window.onhashchange = function() {
var fragment = document.getElementById("processFragment:fragment");
fragment.value = window.location.hash;
fragment.onchange();
}
</script>
<style>.hide { display: none; }</style>
</h:head>
<h:body>
<h:form id="processFragment" class="hide">
<h:inputText id="fragment" value="#{bean.fragment}">
<f:ajax event="change" execute="@form" listener="#{bean.processFragment}" render=":showFragment" />
</h:inputText>
</h:form>
<p>Change the fragment in the URL. Either manually or by those links:
<a href="#foo">foo</a>, <a href="#bar">bar</a>, <a href="#baz">baz</a>
</p>
<p>Fragment is currently: <h:outputText id="showFragment" value="#{bean.fragment}" /></p>
</h:body>
</html>
下面是适当的bean的外观:
package com.stackoverflow.q3475076;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.event.AjaxBehaviorEvent;
@ManagedBean
@RequestScoped
public class Bean {
private String fragment;
public void processFragment(AjaxBehaviorEvent event) {
// Do your thing here. This example is just printing to stdout.
System.out.println("Process fragment: " + fragment);
}
public String getFragment() {
return fragment;
}
public void setFragment(String fragment) {
this.fragment = fragment;
}
}
就这样。
请注意,onhashchange
事件相对较新,较旧的浏览器不支持该事件。在缺乏浏览器支持(未定义等)的情况下,您可能希望使用setInterval()
来定期检查window.location.hash
。上面的代码示例至少应该有一个良好的开端。它至少能运行FF3.6和IE8。
发布于 2010-08-13 16:29:04
下面是从语法上有效的URL / URI中提取片段的最可靠方法。
URI uri = new URI(someString);
String fragment = uri.getFragment();
如何将其注入bean将取决于您使用的服务器端框架,以及您是使用XML还是注释进行注入,还是以编程方式进行注入。
发布于 2010-08-13 17:25:25
该片段不能从服务器端看到,它只能由客户端脚本访问。通常的做法是,服务器端生成一个非参数化页面,然后脚本根据片段参数修改该页面。脚本可以使用查询参数发出AJAX请求,其中AJAX响应是由JSF使用由参数控制的bean生成的。
如果您绝对希望服务器端在呈现页面本身时能够访问片段参数,则需要使用这些参数作为查询参数重新加载页面。
编辑:要重新加载页面,您可以使用以下代码:
if (window.location.hash != '') {
var newsearch = window.location.search;
if(newsearch != '') {
newsearch += '&';
}
newsearch += window.location.hash.match(/#?(.*)/)[1];
window.location.hash = '';
window.location.search = newsearch;
}
https://stackoverflow.com/questions/3475076
复制相似问题