Cho*_*ang 16 javascript java jsf facelets fragment-identifier
我正在寻找一种方法将URL的片段(#)中的值注入bean(JSF),就像注入查询参数值一样.我正在使用Ben Alman的Bookmarkable jQuery插件(http://benalman.com/projects/jquery-bbq-plugin/)来创建URL片段.我希望来自prettyFaces的自定义正则表达式模式可以解决我的问题,但直到现在我还没有成功.
(http://ocpsoft.com/docs/prettyfaces/snapshot/en-US/html_single/#config.pathparams.regext)
我想在这里定义我的情况,如果有人有想法,我很想尝试一下.
我正在使用
RichFaces:3.3.3,
Spring:3.0.2.RELEASE,
Hibernate:3.5.3-Final,
JSF:2.0.2-FCS,
PrettyFaces:3.0.1
Web应用程序生成以下类型的URL,其中参数在散列(#)之后列出.我们的想法是拥有一个基于ajax的Bookmarkable URL.因此,每次单击更改系统状态的元素时,都会通过ajax将值发送到服务器,并在重写哈希值后将URL发送到服务器.散列后可以有1到3个参数,参数个数是可选的.
我的目标是,当用户为URL(带有哈希)书签并重新访问已保存的页面时,页面应该将正确的值注入系统并在之前的状态(如query-parameter)中可视化页面.
下面,我有一个正则表达式,可以捕获哈希后的所有参数.
//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})
Run Code Online (Sandbox Code Playgroud)
我知道有些网站有些如何将URL片段发送到服务器端逻辑,
无论如何将URL片段中的值注入服务器端bean?
您可以在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>
Run Code Online (Sandbox Code Playgroud)
以下是适当的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;
}
}
Run Code Online (Sandbox Code Playgroud)
就这样.
请注意,该onhashchange
事件相对较新,旧浏览器不支持.如果没有浏览器支持(未完成等等),您需要window.location.hash
使用相应的间隔进行检查setInterval()
.上面的代码示例至少应该给出良好的启动.它至少适用于FF3.6和IE8.
归档时间: |
|
查看次数: |
11483 次 |
最近记录: |