我有三个托管bean:一个作用域范围(S)和两个视图作用域(A,B).我想在S和B中使用A的功能,但问题是在会话范围内注入视图范围的bean是不可能的.
The scope of the object referenced by expression #{a}, view, is shorter than the referring managed beans (s) scope of session
Run Code Online (Sandbox Code Playgroud)
我不想复制A的功能.任何的想法?
我需要2.xhtml在当前 JSF 页面(例如1.xhtml)的新选项卡中打开一个新的JSF 页面(例如)。我应该使用哪个 JSF 组件?<h:commandLink>或者<h:outputLink>?
1.xhtml单击链接以2.xhtml在新选项卡中打开后,我不想失去当前页面的范围。
的豆1.xhtml是@ViewScoped。我应该把它改成@RequestScoped吗?
我正在使用JSF 2.1和Primefaces:
我有一个带有托管属性的视图作用域托管bean,以及一个在其他视图范围内的托管bean上设置内容并转发到引用该托管bean的其他页面的方法:
@ManagedBean
@ViewScoped
public class HelloMB {
@ManagedProperty("otherMB")
private OtherMB other;
public String changeOtherMB() {
otherMB.setAnyObject(new Object());
return "otherPage.xhtml";
}
}
@ManagedBean
@ViewScoped
public class OtherMB {
private Object o;
public void setAnyObject(Object o) {
this.o = o;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当渲染otherPage时o为null.
你知道我怎么能解决这个问题?如何在@ViewScoped托管bean中保留对象并将其保存在其他页面上而不使用@SessionScoped?
我正在显示数据库中的问题列表,每个问题我都要显示一个选项列表,在本例中是单选按钮.
<ui:repeat value="#{formData.questions}" var="question">
<div>
<p:outputLabel value="#{question.name}" />
<p:selectOneRadio value="#{formData.selectedOption}">
<f:selectItems value="#{formData.options}" />
</p:selectOneRadio>
</div>
</ui:repeat>
Run Code Online (Sandbox Code Playgroud)
我需要为每个问题保存选中的选项.
我怎样才能做到这一点?
我正在探索JSF 2.2 Faces Flow功能,但我仍然不确定使用Faces Flow定义流程而不是使用普通导航系统(在链接或按钮中调用facelets)有什么好处?
我正在尝试使用h:inputFile标记上传图像文件并将其写入磁盘.
我的JSF代码:
<h:form id="fileUploadForm" enctype='multipart/form-data' prependId="false">
<h:inputFile value="#{solicitacaoManagedBean.imagemCarregada}" />
<br />
<h:commandButton styleClass="btn btn-primary " value="Enviar" action="#{solicitacaoManagedBean.enviarImagem}" />
</h:form>
Run Code Online (Sandbox Code Playgroud)
我的ManagedBean:
@Named(value = "solicitacaoManagedBean")
@SessionScoped
@MultipartConfig(location = "/home/rogerio/tmp/")
public class SolicitacaoManagedBean implements Serializable {
private Part imagemCarregada;
Run Code Online (Sandbox Code Playgroud)
(......)
public void enviarImagem() throws IOException {
try {
imagemCarregada.write("teste.jpg");
} catch (IOException ioe) {
System.out.println("Erro ao escrever: " + ioe.getLocalizedMessage());
}
}
}
Run Code Online (Sandbox Code Playgroud)
据推测,方法write将项目上传到磁盘,IOException也不会被抛出/捕获.
我真的不理解吸气剂和塞特剂的工作原理,尽管这是一个基本概念。我有以下代码,该属性如何id发送到Managed Bean?用getter方法捕获了吗?
我的面
<p:inputText id="id" value="#{bean.id}">
Run Code Online (Sandbox Code Playgroud)
我的托管豆
private String id;
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
Run Code Online (Sandbox Code Playgroud) 我试图从这个问题中理解在JSF动作中返回null和""之间的区别,但是无法实际体验.
以下是OP的报价
据我所知,当JSF操作返回""(空字符串)时,用户会保留在当前页面上,但视图会刷新.但是,当操作返回null时,用户仍然停留在当前页面上,但旧视图将被重用
我在理解返回的区别混淆"",null并"viewid?faces-redirect=true"从JSF支持bean.我试图通过一个小例子来理解差异,但我无法体验到实际的差异.以下是我的示例的代码片段.
web.xml中
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>Jsf Questions</display-name>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.jspx</param-value>
</context-param>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/jsfintroapp/*</url-pattern>
</servlet-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)
faces-config.xml中
<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
<managed-bean>
<managed-bean-name>userLogin</managed-bean-name>
<managed-bean-class>com.srk.beans.UserLogin</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<navigation-rule>
<description>Contains list of all navigation rules here</description>
<from-view-id>/*</from-view-id>
<navigation-case>
<display-name>WELCOME</display-name>
<from-outcome>welcome</from-outcome>
<to-view-id>/geek_examples/authorized_user.jspx</to-view-id>
</navigation-case>
</faces-config>
Run Code Online (Sandbox Code Playgroud)
我的托管bean是一个请求范围的bean,如上所述.
UserLogin.java(Backing bean)代码片段
public String saveData() {
//String returnString …Run Code Online (Sandbox Code Playgroud) 我有两个托管Java Bean:
import javax.annotation.PostConstruct;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.ws.rs.Path;
@Path("/sync")
@ManagedBean(name="syncService", eager=true)
@ApplicationScoped
public class SyncService {
@ManagedProperty(value="#{ldapDirectoryAccess}")
private DirectoryAccess directoryAccess;
public void setDirectoryAccess(DirectoryAccess directoryAccess) {
System.out.println("SyncService.setDirectoryAccess()");
this.directoryAccess = directoryAccess;
}
public SyncService() {
System.out.println("SyncService() - constructed: " + this);
}
@PostConstruct
public void init() {
System.out.println("DirectoryAccess injected: " + directoryAccess + " in: " + this);
}
...
}
@ManagedBean(name="ldapDirectoryAccess", eager=true)
@ApplicationScoped
public class LdapDirectoryAccess implements DirectoryAccess {
public LdapDirectoryAccess() {
System.out.println("LdapDirectoryAccess constructed: " + this); …Run Code Online (Sandbox Code Playgroud) 我正在使用我的JSF应用程序进行一些测试,当我在不同选项卡上的相同Web浏览器中尝试它时,在所有选项卡中最后一个会话都存在.
我怎么能阻止这个?
我遇到以下情况:
场景:
在搜索时,支持bean会抛出异常,因为有很多null值.原因是,当他们按下"搜索"时,页面处于RESTORE_VIEW同步状态.
我尝试在页面上禁用缓存,强制用户刷新后退按钮上的页面,但是很多用户抱怨"为什么我不能使用后退按钮,我之前可以做到!" 由于他们认为应用程序在"确认表单重新提交"页面chrome/IE/Firefox show中崩溃,导致帮助台门票,因此管理人员希望我寻找替代方案.
我的问题:
可以检测RESTORE_VIEW的当前Phase_ID,而不是在此阶段进行任何处理以避免异常,但仅此一点,只需重新调整即可为用户提供部分页面视图.是否可以RENDER_RESPONSE在此方案中放入页面然后进行处理?这应该刷新页面.
由于推荐(或普通/良好)实用是禁用动态页面上的缓存,我已经这样做了,并且必须重新教育顽固的用户.
但是我有以下问题.
当按下具有禁用缓存的页面上的"返回"按钮时,浏览器会显示"确认表单重新提交"(chrome),用户可以按Refresh / F5或Enter键.
如果Refresh/ F5是动作,一切都可以,我检测到RESTORE_VIEW相位并避免在该阶段中进行任何处理并让处理在RENDER_RESPONSE阶段完成.但是,如果Enter按下,则PhaseID处于,RENDER_RESPONSE(6)但是几个下拉控件的值为null,这会导致页面失败.所以我进行检查以检测这些情况并显示FaceMessage以告诉用户刷新页面.
问题是,我可以强制页面刷新而不是强制用户这样做吗?此页面的导航案例格式为:
<navigation-rule>
<navigation-case>
<from-outcome>/app/ord/r1</from-outcome>
<to-view-id>/jsp/ordersHistory.jsp</to-view-id>
</navigation-case>
</navigation-rule>
Run Code Online (Sandbox Code Playgroud)
我已经看到在线代码片段faces-redirect=true用于强制重新加载页面,但我无法让它工作!有什么建议?
我已经阅读了范围(@SessionScoped, @ViewScoped, @ApplicationScope and @RequestScope)类型之间的所有差异,但是,我仍然在某种程度上遇到应用程序问题。我有一个page-1 与网格和我所选择的项目发送到page-2(两者page-1并page-2用相同的支持bean),以进行编辑,然后持续存在。据我所知,我的托管bean正在使用@RequestScoped,javax.faces.bean.RequestScoped这是理想的使用范围,但是它不起作用,bean被破坏了,数据丢失了。
恢复该故事,我将注释更改为@SessionScoped并且可以正常工作,但是我想知道这是否是一个好习惯?因为我已经读到,使用这种方法不是一个好习惯,@SessionScoped因为在客户端注销之前数据将一直保持活动状态。
jsf ×12
view-scope ×3
jsf-2 ×2
jsf-2.2 ×2
managed-bean ×2
navigation ×2
el ×1
faces-flow ×1
file-io ×1
file-upload ×1
getter ×1
input ×1
jsf-1.2 ×1
new-window ×1
scopes ×1
session ×1
uirepeat ×1