Page scope of the Seam component
msx Nov 24, 2006 3:27 AMHi all,
Can anyone, please, explain me the following new-made registration example:
User.java
//$Id: User.java,v 1.9 2005/09/10 19:08:01 gavin Exp $
package org.jboss.seam.example.registration;
import static org.jboss.seam.ScopeType.SESSION;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.validator.Length;
import org.hibernate.validator.NotNull;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
@Entity
@Name("user")
@Scope(SESSION)
@Table(name = "users")
public class User implements Serializable {
private static final long serialVersionUID = 1881413500711441951L;
private String username;
private String password;
private String name;
public User(String name, String password, String username) {
this.name = name;
this.password = password;
this.username = username;
}
public User() {
}
@NotNull
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@NotNull
@Length(min = 5, max = 15)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Id
@NotNull
@Length(min = 5, max = 15)
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String toString() {
return "User(" + username + ")";
}
}
Message.java
package org.jboss.seam.example.registration;
import static org.jboss.seam.ScopeType.PAGE;
import java.io.Serializable;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
@Name("customMessage")
@Scope(PAGE)
public class Message implements Serializable {
private static final long serialVersionUID = -2763236998519280798L;
private static final String DEFAULT_MESSAGE = "Hello World";
private String message = DEFAULT_MESSAGE;
private String description = DEFAULT_MESSAGE;
public Message() {
}
public Message(String message, String description) {
this.message = message;
this.description = description;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Register.java
//$Id: Register.java,v 1.2 2005/09/10 18:29:46 gavin Exp $
package org.jboss.seam.example.registration;
import javax.ejb.Local;
@Local
public interface Register {
String register();
}//$Id: RegisterAction.java,v 1.11 2006/06/11 19:54:33 gavin Exp $
package org.jboss.seam.example.registration;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.hibernate.validator.Valid;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.core.FacesMessages;
import org.jboss.seam.log.Log;
@Stateless
@Name("register")
public class RegisterAction implements Register {
@In
@Valid
private User user;
@In(value = "customMessage", create = true) @Out
private Message myMessage;
@PersistenceContext
private EntityManager em;
@Logger
private Log log;
public String register() {
List existing = em.createQuery("select username from User where username=:username")
.setParameter("username", user.getUsername()).getResultList();
myMessage.setMessage("New message");
log.info(myMessage == Contexts.getPageContext().get("customMessage"));
if (existing.size() == 0) {
em.persist(user);
log.info("Registered new user #{user.username}");
return null; //"/registered.jsp";
} else {
FacesMessages.instance().add("User #{user.username} already exists");
return null;
}
}
}
register.jsp
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://jboss.com/products/seam/taglib" prefix="s" %>
<html>
<head>
<title>Register New User</title>
</head>
<body>
<f:view>
<h:form>
<table border="0">
<s:validateAll>
<tr>
<td>Username</td>
<td><h:inputText value="#{user.username}" required="true"/></td>
</tr>
<tr>
<td>Real Name</td>
<td><h:inputText value="#{user.name}" required="true"/></td>
</tr>
<tr>
<td>Password</td>
<td><h:inputSecret value="#{user.password}" required="true"/></td>
</tr>
</s:validateAll>
</table>
<h:messages/>
<h:commandButton type="submit" value="Register" action="#{register.register}"/>
</h:form>
Custom message: <b><h:outputText value="#{customMessage.message}"/></b><br/>
My message: <b><h:outputText value="#{myMessage.message}"/></b><br/>
</f:view>
</body>
</html>
The question is about RegisterAction and register.jsp. Why are customMessage and myMessage different on the register.jsp, but in the RegisterAction the are the same?
If I set any other scope (except ScopeType.PAGE) of the Message component then customMessage and myMessage are the same.