Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 基于角色控制表单输入的属性文件_Jsf_Jsf 2_Resourcebundle_User Roles - Fatal编程技术网

Jsf 基于角色控制表单输入的属性文件

Jsf 基于角色控制表单输入的属性文件,jsf,jsf-2,resourcebundle,user-roles,Jsf,Jsf 2,Resourcebundle,User Roles,我正在构建的应用程序的需求要求用户角色是动态的,它们将存储在数据库中,并且还将映射到应用程序的功能(表单),也存储在数据库中 限制角色访问特定页面并不困难,但要求还规定表单输入必须根据角色进行定制,这意味着输入可以是强制性的或非强制性的、可见的或不可见的、只读的或不基于角色的 我控制这些限制的方法是为每个角色创建一个属性文件,该文件将应用程序中所有表单的所有输入存储为键,并将一个长字符串存储为值,我们在其中定义输入的状态,如下所示: 用户输入。属性 # form.input=mandatory:

我正在构建的应用程序的需求要求用户角色是动态的,它们将存储在数据库中,并且还将映射到应用程序的功能(表单),也存储在数据库中

限制角色访问特定页面并不困难,但要求还规定表单输入必须根据角色进行定制,这意味着输入可以是强制性的或非强制性的、可见的或不可见的、只读的或不基于角色的

我控制这些限制的方法是为每个角色创建一个属性文件,该文件将应用程序中所有表单的所有输入存储为键,并将一个长字符串存储为值,我们在其中定义输入的状态,如下所示:

用户输入。属性

# form.input=mandatory:visibility

searchBooks.bookName=true:true
searchBooks.bookCategory=false:true
searchBooks.authorName=false:false
searchBooks.bookName=true:true
searchBooks.bookCategory=false:true
searchBooks.authorName=false:true
管理输入.属性

# form.input=mandatory:visibility

searchBooks.bookName=true:true
searchBooks.bookCategory=false:true
searchBooks.authorName=false:false
searchBooks.bookName=true:true
searchBooks.bookCategory=false:true
searchBooks.authorName=false:true
然后执行一些神奇的Java代码,每当访问表单时,从特定用户角色的文件中读取其输入属性,并解析这些值,这样我就可以为
rendered=“”
required=“”
属性提供正确的值

这可能是一个解决方案,但应用程序的输入远不止是一本书的名称和类别,这意味着我将放置大量必需的和呈现的属性,这将使JSF页面在托管bean中有大量变量时看起来很难看


是否有更好的方法/框架/解决方案来解决我的问题?

我认为您的方法是正确的,我将继续使用您的方法,包括创建多个属性文件,每个用户一个,但我们不会使用任何“大量变量 在托管bean“

因此,第一步包括使用单个资源束前缀(
中的
)管理多个资源属性,第二步我们将看到如何在这些文件之间切换,最后一步我们将使用JSTL读取属性文件

管理多个属性文件: 我们首先在
faces config
文件中定义ResourceBundle:

<application>
      <resource-bundle>
         <base-name>UserMessages</base-name>
         <var>msgs</var>
      </resource-bundle>
</application>
在属性文件之间切换: 为了从一个属性文件切换到另一个属性文件,我们需要使用我们刚才在上面的类中声明的方法
setResourceBundle(String basename)
,因此在托管bean中,您要声明您的业务逻辑,并且您要根据用户的角色切换文件,您需要注入捆绑包,比如:

//don't forget adding getters and setters or you end with NullPointerException
@ManagedProperty("#{msgs}")
private UserMessages userMesssages;
然后,要切换到另一个文件(
admin inputs.properties
),只需如下使用它:

//yourpackage.admin-inputs is the fully qualified name
userMesssages.setResourceBundle("yourpackage.admin-inputs");
NB:您只能在请求范围的bean中以这种方式(如上)注入捆绑包,要在更广泛的范围内使用它,请参阅:

现在,由于我们可以轻松地从
用户输入切换到
管理输入,最后一步是最简单的

正在分析属性文件: 坏消息是,当使用这种方法时,您需要将
rendered=“”
required=“”
属性添加到您愿意管理的每个输入(但不要忘记,好消息是您不需要管理托管bean中的变量;)

首先,需要在xhtml文件的顶部添加JSTL名称空间声明:

xmlns:fn="http://java.sun.com/jsp/jstl/functions"
有关函数
子字符串after
,您可以在中找到有关JSTL函数的更多信息:

返回特定子字符串后面的字符串子集

例如:

  P.O. Box: ${fn:substringAfter(zip, "-")}
  Zip (without P.O. Box): ${fn:substringBefore(zip, "-")}
函数
子字符串之前的

返回特定子字符串之前的字符串子集

例如:

  P.O. Box: ${fn:substringAfter(zip, "-")}
  Zip (without P.O. Box): ${fn:substringBefore(zip, "-")}
其次,由于
字符串的第一部分
表示
所需的
属性:

//Returns the substring of msgs['searchBooks.authorName'] before the first occurrence of the separator ':'    
required="${fn:substringBefore(msgs['searchBooks.authorName'], ':')}"
第二部分:

//Returns the substring of msgs['searchBooks.authorName'] after the first occurrence of the separator ':'.
rendered="${fn:substringAfter(msgs['searchBooks.authorName'], ':')}"
另见:

你说表格不仅仅是一本书是什么意思?也许你可以在Bean或其他地方进行这种验证?@antogerva抱歉,我的意思是“但是应用程序的输入,,,,,意味着以任何形式,都有很多输入。@AliBassam我添加了一个关于捆绑注入的NB,请看一看,因为我认为你需要注意它。太好了!正是我所需要的,谢谢你的辛勤工作。