我想在托管bean操作方法中检索JSF输入框的值,而不与任何托管bean属性相关联.例如
<p:inputText id="txtuserid" value="" />
Run Code Online (Sandbox Code Playgroud)
我的用例是,在我的应用程序中,我想提示用户在这里和那里获取每个DML操作的密码,因此喜欢在我的每个UI上都有一个密码和注释相关的字段,并且需要将备注保存在用于审计目的的通用表.
我怎样才能做到这一点?
当我在一个托管的构造函数内部并试图与其他bean的其他方法联系时,我得到了java.lang.NullPointerException.是否有某种规范不允许托管bean这样做?
@ManagedProperty(value="#{document}")
private DisplayListController document;
@EJB
DocumentSBean sBean;
public NewUserController() {
document.list();
}
Run Code Online (Sandbox Code Playgroud)
上面我只是做常规豆注射,没什么花哨的.document是一个SessionScoped托管bean,其方法list()只返回一个String.NewUserController是一个RequestScoped托管bean.
我有一个包含数据表的页面.我希望表中的一些项链接到相应的视图页面.
例如,现在我有一个没有链接的表:
<h:dataTable var="bean" value="#{beanServiceImpl.beans}" border="1">
<h:column>#{bean.id}</h:column>
</h:dataTable>
Run Code Online (Sandbox Code Playgroud)
我想添加一些条目的超链接,并让它们转到一个视图页面,根据它们的ID显示更多信息:
<h:dataTable var="bean" value="#{beanServiceImpl.beans}" border="1">
<h:column>
<a href="viewBean.xhtml?id=#{bean.id}">#{bean.id}</a>
</h:column>
</h:dataTable>
Run Code Online (Sandbox Code Playgroud)
ViewBean.xhtml将包含以下内容:
ViewBean.xhtml
<ul>
<li>ID: #{bean.id}</li>
<li>Field 1: #{bean.field1}</li>
<li>Field 2: #{bean.field2}</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
我如何在JSF中完成这样的事情?我知道我必须编写一个控制器来查询其他字段的id.但是,如何使viewBean.xhtml运行业务逻辑以获取其他字段并进行渲染?
我有JSF 2属性绑定的问题,说实话,我在这里碰壁了..
我想要完成的是:请求范围的bean(loginBean)进程登录操作并将用户名存储在会话范围的bean(userBean)中.我想通过@ManagedProperty将userBean注入loginBean,但是当调用loginBean.doLoginAction时,userBean被设置为null.
这是代码:
UserBean类
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean
@SessionScoped
public class UserBean {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public boolean isLogged() {
if (username != null)
return true;
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
loginBean类:
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
@ManagedBean
@RequestScoped
public class LoginBean {
@ManagedProperty(value = "userBean")
private UserBean userBean;
private String name;
private String password;
public String getName() {
return name;
} …Run Code Online (Sandbox Code Playgroud) 您认为实现关于会话范围与请求范围的JSF托管bean的最佳方法是什么?在我的例子中,我有一个带有EJB模块和Web模块的EAR应用程序.EJB模块提供无状态会话bean.在Web模块中,我现在在sessionScope中使用ManagedBean.这个bean注入一些staeless会话ejbs并保存一些包含业务数据的值对象,这些对象可以在不同的页面中使用.
@Named("workflowController")
@SessionScoped
public class WorkflowController {
private List<ItemCollection> someList;
private ItemCollection someBusinessData;
/* Services */
@EJB
private MyService myService;
Run Code Online (Sandbox Code Playgroud)
bean为前端提供了许多动作方法,并使用无状态会话bean.这是一般的好习惯吗?或者我应该更改我的控制器以请求范围?我见过只在RequestScoped中使用前端控制器的项目,并将所有业务Data对象注入managedProperties,在SessionScope中实现为ManagedBeans.
在我的示例中,我在SessionScope中只有一个控制器,它包含所有业务值并提供在无状态ejbs中实现的业务方法.在另一种情况下,在RequestScopde中使用一个控制器,并且在SessionScope中将许多BusinessValue对象实现为MangedBeans,这些对象被注入到控制器bean中.
我的问题是:将Session EJB注入SessionScope Managed bean一般是不好的做法吗?
我想在JSF中读取backing bean值,然后传递给JavaScript,我可以知道如何做到这一点吗?
支持bean示例代码:
@ManagedBean(name="enquiry")
@SessionScoped
public class Enquiry {
public boolean noQuery;
/** getter and setter **/
}
Run Code Online (Sandbox Code Playgroud)
在XHTML示例代码中,我想传递支持bean值,然后传递到showNoQueryPrompt()这样:
<h:commandLink onClick="showNoQueryPrompt(#{enquiry.noQuery})">
</h:commandLink>
Run Code Online (Sandbox Code Playgroud)
然后在JavaScript代码中,我可以读取布尔值来确定是否应该提示或不提示.这是代码:
<script ...>
var showNoQueryPrompt(Boolean showPrompt) {
if( showPrompt == "true" ) {
alert('No query');
}
}
</script>
Run Code Online (Sandbox Code Playgroud) 背景信息:我的jsf页面中有一个文件上传小程序.这个小程序需要一个地址,它可以发送它的POST请求.(我无法编辑此帖子请求以添加更多字段或其他内容).然后我的servlet的post方法存储文件.托管bean无法完成此作业,因为必须使用@MultiPartConfig注释servlet,并且我无法将此批注添加到jsf托管bean.为了强制上传小程序使用相同的会话,我根据这篇文章在帖子请求中添加了一个名为jsessionId的URL属性.在我的servlet中,我现在能够访问会话范围的bean.
现在我有一个ViewScoped bean,我存储了一些我想在servlet中使用的表单输入数据,因为将这些输入添加到post请求不起作用(Applet是第三方项目(JUploadApplet),并且由于某种原因它没有无法添加其他表单数据.现在是否可以从servlet中访问ViewScoped bean?如果我将范围更改为SessionScope,我可以处理输入但是使用ViewScoped,如果我尝试像这样访问bean,我会得到一个NullPointerException:UploadBean uploadBean =(UploadBean)request.getSession().getAttribute("uploadBean");
如果此方法被commandButton组件作为AJAX请求调用,并且该方法是在托管bean的实例变量上运行,那么我们是否必须同步托管bean方法?
假设我们有这个简单的托管bean:
public class ManagedBeanTest {
private int count;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public String increaseCount() {
count++;
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如果在这种情况下该increaseCount方法由commandButton内部组件调用action,我是否必须同步此方法?
谢谢您的回答.
我无法理解序列化在会话范围的JSF托管bean中是如何工作的.为什么Serializable在创建会话范围的JSF托管bean时接口的实现很重要?
我有带CDI bean的WAR包.部署包非常慢,因为每次部署期间都会扫描包以查找CDI bean.有没有选项可以禁用此过程?