I am using the JPA entities as models for my web layer. I am including the EJB module as a dependency for my web project on pom.xml.
I have implemented an action called CreateUserAction which implements ModelDriven:
package actions.accounts;
import com.google.inject.Inject;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import facade.UserFacadeLocal;
import java.util.logging.Level;
import java.util.logging.Logger;
import models.User;
/**
*
* @author sergio
*/
public class CreateUserAction extends ActionSupport implements ModelDriven<User>{
@Inject
private UserFacadeLocal userFacade;
private User user = new User();
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String execute() throws Exception {
Logger.getLogger(SignupAction.class.getName()).log(Level.INFO, "Registrando usuario");
userFacade.create(user);
addActionMessage("Usuario registrado con éxito");
return SUCCESS;
}
@Override
public User getModel() {
return user;
}
}
user is an instance of the class models.User from EJB module:
package models;
import java.io.Serializable;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Temporal;
@Entity(name = "USERS")
@NamedQueries({
@NamedQuery(name = "User.all", query = "SELECT u FROM USERS u"),
@NamedQuery(name = "User.find", query = "SELECT u FROM USERS u WHERE u.userName = :username")
})
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "USER_NAME")
private String userName;
@Column(name = "PASSWD", length = 32,columnDefinition = "VARCHAR(32)")
private String password;
private String name;
private String lastname;
@Temporal(javax.persistence.TemporalType.DATE)
private Date birthday;
private String email;
private Integer mobile;
@ManyToMany(cascade={CascadeType.ALL})
@JoinTable(
name="USER_GROUPS",
joinColumns={ @JoinColumn(name="USER_NAME") },
inverseJoinColumns={ @JoinColumn(name="GROUP_NAME") }
)
private Set<Group> groups;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = hashPassword(password);
}
public Set<Group> getGroups() {
return groups;
}
public void setGroups(Set<Group> groups) {
this.groups = groups;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getMobile() {
return mobile;
}
public void setMobile(Integer mobile) {
this.mobile = mobile;
}
public String getFullname(){
return name + " " + lastname;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final User other = (User) obj;
if ((this.userName == null) ? (other.userName != null) :
!this.userName.equals(other.userName)) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 3;
hash = 83 * hash + (this.userName != null ? this.userName.hashCode() : 0);
return hash;
}
private String hashPassword(String password) {
String encoded = null;
try {
ByteBuffer passwdBuffer =
Charset.defaultCharset().encode(CharBuffer.wrap(password));
byte[] passwdBytes = passwdBuffer.array();
MessageDigest mdEnc = MessageDigest.getInstance("MD5");
mdEnc.update(passwdBytes, 0, password.length());
encoded = new BigInteger(1, mdEnc.digest()).toString(16);
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(User.class.getName()).log(Level.SEVERE, null, ex);
}
return encoded;
}
}
I want to use struts2 validation by the following configuration:
CreateUserAction-validation.xml into src/main/resources/actions/accounts
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<validator type="visitor">
<param name="fieldName">user</param>
<param name="appendPrefix">false</param>
<message />
</validator>
</validators>
User-validation.xml into src/main/resources/models
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<field name="userName">
<field-validator type="required">
<message>You must enter a value for name.</message>
</field-validator>
</field>
<field name="name">
<field-validator type="required">
<message>You must enter a value for name.</message>
</field-validator>
</field>
</validators>
the User file is well placed?
and to finalize the action settings:
<action name="signup" class="actions.accounts.SignupAction">
<interceptor-ref name="store">
<param name="operationMode">RETRIEVE</param>
</interceptor-ref>
<interceptor-ref name="defaultStack" />
<result>/WEB-INF/views/accounts/signup.jsp</result>
</action>
<action name="create" class="actions.accounts.CreateUserAction">
<interceptor-ref name="store">
<param name="operationMode">STORE</param>
</interceptor-ref>
<interceptor-ref name="defaultStack" />
<result name="input" type="redirectAction">signup</result>
<result type="redirectAction">signup</result>
</action>
thanks in advance