当前位置: 首页 > 面试题库 >

从URL检索片段(哈希),然后将值注入Bean

颛孙高义
2023-03-14
问题内容

我正在寻找一种将URL片段(#)中的值注入到bean(JSF)中的方法,就像注入查询参数值一样。我正在使用Ben
Alman的可标记jQuery插件(http://benalman.com/projects/jquery-bbq-
plugin/
)创建URL片段。我希望从prettyFaces获得的自定义正则表达式模式可以解决我的问题,但是直到现在我还是没有成功。

(http://ocpsoft.com/docs/prettyfaces/snapshot/zh-
CN/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,其中URL类型在井号(#)后列出。这个想法是要有一个基于ajax的Bookmarkable
URL。因此,每次我单击更改系统状态的元素时,该值都会通过ajax和重写哈希后的URL发送到服务器。哈希后可以有1到3个参数,参数的数目是可选的。

我的目标是,当html" target="_blank">用户为URL添加书签(带有哈希)并重新访问已保存的页面时,该页面应将正确的值注入系统并以先前状态(如查询参数)可视化该页面。

下面,我有一个正则表达式,它将捕获哈希之后的所有参数。

//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片段发送到服务器端逻辑中,

  • http://maps.yahoo.com/#mvt=m&lat=36.952736&lon=-95.84758&zoom=11&tt=starbucks&tp=1&ioride=us
  • http://www.cbc.ca/video/#/Shows/Death_Comes_to_Town/ID=1365210427

无论如何,是否有将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>

这是合适的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;
    }

}

就这样。

Note that the onhashchange event is relatively new and not supported by the
older browsers. In absence of the browser support (undefinied and so on),
you’d like to check
window.location.hash at
intervals using
setInterval()
instead. The above code example should at least give a good kickoff. It works
at at least FF3.6 and IE8.



 类似资料:
  • 问题内容: 如何从php中的URL获取片段(哈希值“#”后的值)? 从我想说 问题答案: 如果要在用户浏览器中显示的哈希标记或锚点之后获取值:使用“标准” HTTP则无法实现,因为此值永远不会发送到服务器(因此该值在或类似版本中将不可用预定义变量)。您可能需要在客户端使用某种JavaScript魔术,例如,将该值包含为POST参数。

  • 问题内容: 我有一个dynamodb表来存储电子邮件属性信息。我在电子邮件上有一个哈希键,在时间戳(数字)上有范围键。使用电子邮件作为哈希键的最初想法是按电子邮件查询所有电子邮件。但是我想做的一件事是检索所有电子邮件ID(在哈希键中)。我为此使用了boto,但不确定如何检索不同的电子邮件ID。 我当前提取10,000条电子邮件记录的代码是 但是要检索不同的记录,我将必须进行全表扫描,然后在代码中选

  • 问题内容: 我只是在http://ritter.vg上设置了新主页。我正在使用jQuery,但是使用的次数很少。 它使用AJAX加载所有页面-我将其设置为通过检测URL中的哈希来允许添加书签。 但是我无法使用后退和前进按钮。 有没有一种方法可以在不使用setInterval循环的情况下检测何时按下后退按钮(或检测哈希值何时变化)?当我尝试使用.2和1秒超时的那些时,它挂住了我的CPU。 问题答案:

  • 问题内容: 寻找一种使用JavaScript / JQuery从URL的哈希/片段中将密钥对解析为对象/关联数组的方法 问题答案: 签出:jQuery BBQ jQuery BBQ设计用于解析URL(查询字符串或片段)中的内容,并且进一步简化了基于片段的历史记录。这是Yarin在构建纯js解决方案之前一直在寻找的jQuery插件。具体来说,deparam.fragment()函数可以完成这项工作。

  • 当人们说Hashmap比列表更快时,我对Hashmap或Hashtable的概念更困惑。我很清楚散列的概念,其中的值存储在给定密钥的散列代码中。 但是,当我想检索数据时,例如,它是如何工作的,我在一个HashMap中存储n个带有n个不同键的字符串。如果我想检索与特定键关联的特定值,它将如何在O(1)的时间内返回它?因为散列密钥将与所有其他密钥进行比较,对吗?

  • 我创造了一个这样的形式 如果它没有验证,我将重新显示填充了数据的表单。填充问题数据并不难 但是,我无法从答案模型(具有内容和链接字段)的会话哈希中获取嵌套值。这不起作用。 我觉得是因为hash对象中的0,1,2迭代。例如,这是hash对象的一个片段(完整显示在下面) 但我不知道在构建问题答案时如何表达这一点 当我尝试构建时,在尝试从哈希对象中提取数据时,我不会表示迭代。你能解释一下我如何修改这一行