我们有一个更新动态包含的ajax导航菜单.包含文件各有各自的表单.
<h:form>
<h:commandButton value="Add" action="#{navigator.setUrl('AddUser')}">
<f:ajax render=":propertiesArea" />
</h:commandButton>
</h:form>
<h:panelGroup id="propertiesArea" layout="block">
<ui:include src="#{navigator.selectedLevel.url}" />
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)
它工作正常,但包含文件中的任何命令按钮在第一次单击时都不起作用.它仅适用于第二次点击.
我发现这个问题commandButton/commandLink/ajax动作/监听器方法没有被调用或输入值没有更新,我的问题在第9点描述.我明白我需要明确地包含在解决它的包<h:form>中的ID <f:ajax render>.
<f:ajax render=":propertiesArea :propertiesArea:someFormId" />
Run Code Online (Sandbox Code Playgroud)
但是,在我的情况下,表单ID事先是未知的.此表格最初也不会在上下文中提供.
上述方案有什么解决方案吗?
我正在使用Primefaces 3.4.2.
我的JSF页面中有以下内容
<p:selectOneMenu id="emp" value="#{mymb.emp.employeeName}"
valueChangeListener="#{mymb.handleChange}"
required="true"
style="width: 150px;">
<f:selectItem noSelectionOption="true"
itemLabel="Please Select"/>
<f:selectItems value="#{mymb.employeeList}" var="emp"
itemLabel="#{emp.employeeName}"
itemValue="#{emp.employeeNumber}"/>
<p:ajax update="sublist"/>
</p:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)
并在ManagedBean中
public void handleChange(ValueChangeEvent event){
System.out.println("here "+event.getNewValue());
}
Run Code Online (Sandbox Code Playgroud)
问题是valueChangeListener没有触发,即handleChange方法没有被调用.我尝试了以下,但它也没有工作.
<p:ajax update="sublist" listener="#{mymb.handleChange}" />
Run Code Online (Sandbox Code Playgroud)
单独的JSF页面:
<ui:composition template="/templates/layout.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<ui:define name="content">
<h:head>
</h:head>
<h:body>
<h:form id="form">
<p:panelGrid columns="6">
<h:outputLabel value="Employees" for="employees" />
<p:selectOneMenu id="employees"
value="#{mymb.employeesList}"
required="true">
<f:selectItems value="#{mymb.employeesList}" var="emp"
itemLabel="#{emp.employeeName}" />
<p:ajax listener="#{mymb.handleChange}" />
</p:selectOneMenu>
</p:panelGrid>
</h:form>
</h:body>
</ui:define>
</ui:composition>
Run Code Online (Sandbox Code Playgroud) 我有一个问题,没有调用JSF CommandButton操作.我有一个托管bean roleController,如
@ManagedBean(name = "roleController")
@RequestScoped
public class RoleController {
public Role getSelectedRole() {
return selectedRole;
}
public void updateSelectedRole() {
System.out.println(selectedRole.getRole());
}
Run Code Online (Sandbox Code Playgroud)
在我的.jsf文件中,我正在尝试在h:commandButton上编辑调用updateSelectedRole操作,但它似乎不起作用.我试图将方法名称更改为不正确的名称,并且没有抛出异常 - 但是当我对其他表单执行相同操作时,抛出异常 - 因此很可能甚至不会调用该操作.
<h:panelGroup rendered="${param.action == 'edit'}">
<h:form>
<ol>
<li>
<label for="ID">
<h:outputText value="#{msg.roleEditID}" />
</label>
<h:inputText readonly="true"
value="#{roleController.selectedRole.id}" />
</li>
<li>
<label for="Role">
<h:outputText value="#{msg.roleEditRole}" />
</label>
<h:inputText value="#{roleController.selectedRole.role}" />
</li>
<li>
<h:commandButton value="#{msg.buttonUpdate}"
action="#{roleController.updateSelectedRole()}"/>
</li>
</ol>
</h:form>
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)
我发现它可能是嵌套表单引起的,但在本例中并非如此.这个问题的根源是否可能是我的导航规则?
<navigation-rule>
<from-view-id>/admin/roles.xhtml</from-view-id>
<navigation-case>
<to-view-id>/admin/roles.xhtml</to-view-id>
<from-outcome>true</from-outcome>
<redirect>
<view-param>
<name>action</name>
<value>edit</value>
</view-param>
</redirect>
</navigation-case>
</navigation-rule>
Run Code Online (Sandbox Code Playgroud) 通常,默认范围是请求范围.我试图删除范围注释并期望bean有一个请求bean scopped行为(通过在前一页上返回一个提交的值,我记得我已经尝试过这个过去并且它工作正常)但我没有得到任何关于表达语言连接到它.那么什么是默认范围以及它为什么不是相同的行为?!
我认为这个问题引发了,因为我没有得到EJB的东西.我有一个我的实体的服务类,它是@Stateless.当我通过在我的会话范围演示模型中注入@EJB来使用它时,一切正常.但是现在我想在我已覆盖的DataModel中使用这个EJB服务,以便在我的演示模型中使用:
public class LazyUserDataModel extends LazyDataModel<User> {
@EJB
private UserService service;
@Override
public List<User> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map filters) {
List<User> users;
users= service.findAllUsers();
this.setRowCount(users.size());
return users;
}
}
Run Code Online (Sandbox Code Playgroud)
执行时,我在"users = service.findAllUsers();"位置获得NullPointerException.当我在演示模型中覆盖此DataModel时,同样有效:
@Named
@SessionScoped
public class UserPM {
@EJB
private UserService service;
private LazyDataModel<User> lazyUsers;
public UserPM() {
// Don't works
//lazyUsers = new LazyUserDataModel();
lazyUsers = new LazyDataModel() {
@Override
public List<User> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map filters) {
List<User> …Run Code Online (Sandbox Code Playgroud) 防止用户角色执行操作.
在一个真实的案例中,我有这个:
public String delete() {
if(FacesContext.getCurrentInstance().getExternalContext().isUserInRole("administrator"){
//.....the action to perform
}
return "Denied";
}
Run Code Online (Sandbox Code Playgroud)
我希望我可以使用@RolesAllowed()EJB 的注释,但我不使用EJB而是使用ManagedBeans.所以问题是:有没有办法同时使用多个角色?一些解决方法!示例:如果必须允许对3个角色执行操作(管理员,主持人,经理).我有义务这样做:
if (FacesContext.getCurrentInstance().getExternalContext().isUserInRole("administrator")
|| FacesContext.getCurrentInstance().getExternalContext().isUserInRole("manager")
|| .....) {
//....
}
Run Code Online (Sandbox Code Playgroud)
重现所有方法都很痛苦.像数百种方法的东西:(
快问.在使用SelectOneMenu之前,我没有想到这一点.这是我的代码.
<h:outputLabel for="listaRegiones" value="Región: " />
<p:selectOneMenu id="listaRegiones" value="#{nuevaProvincia.regionSelect}" required="true">
<f:selectItems value="#{nuevaProvincia.regiones}" />
</p:selectOneMenu>
<p:message for="listaRegiones" />
Run Code Online (Sandbox Code Playgroud)
这是我的支持豆.
@ManagedBean(name="nuevaProvincia")
@ViewScoped
public class nuevaProvincia implements Serializable {
public static final long serialVersionUID = 1L;
public nuevaProvincia() throws DAOException {
this.provincia = new Provincia();
this.regiones = new ArrayList<SelectItem>();
ArrayList<Region> regs = new ArrayList<Region>();
try
{
regs = Region.obtenerRegiones();
}
catch(DAOException e)
{
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Hubo un error: "+e.getMessage(), "Hubo un error: "+e.getMessage()));
}
if(regs.size()>0)
{
for(Region r : regs)
{
SelectItem …Run Code Online (Sandbox Code Playgroud) 我有一个数据表如下:
<h:dataTable value="#{bean.items}" var="item">
Run Code Online (Sandbox Code Playgroud)
我想用从服务方法获得的数据库中的集合填充它,以便在初始(GET)请求期间打开页面时立即显示它.我什么时候应该打电话给服务方法?为什么?
我已经创建了一个JSF应用程序,我想在一个页面中嵌入一个链接,当点击它时会导致支持bean编组一些xml并强制打开另存为下载对话框,以便用户可以选择一个位置保存文件.我已经编写了JAXB代码.
这是怎么做到的?
谢谢
我正在使用PrimeFaces 3.5和JSF 2.0.我想使用jQuery插件,所以我在我的webapp中包含了jQuery.
<h:head>
<h:outputScript name="js/jquery.min.js" />
<h:outputScript name="js/jquery-ui.js" />
</h:head>
Run Code Online (Sandbox Code Playgroud)
但是,在使用PrimeFaces组件时,我会收到类似未捕获的类型错误:
未捕获的TypeError:无法读取未定义的属性"长度"
未捕获的TypeError:对象[object Object]没有方法'autocomplete'
未捕获的TypeError:无法读取未定义的属性'keyCode'
未捕获的TypeError:this.jq.draggable不是函数
未捕获的TypeError:无法读取未定义的属性"LinearAxisRenderer"
未捕获的TypeError:对象[object Object]没有方法'fileupload'
未捕获的TypeError:this.jqEl.datetimepicker不是函数
等等.
这是怎么造成的,我该如何解决?
jsf ×10
java ×3
primefaces ×3
java-ee ×2
jsf-2 ×2
commandlink ×1
datatable ×1
ejb ×1
getter ×1
jquery ×1
loading ×1
servlets ×1
typeerror ×1
updatemodel ×1