jeudi 18 août 2016

Spring + Hibaenate many-to-many checkboxes

i try built app with spring and hibernate. i build applicatin that have diferrent roles and user. i want my application flexibel to add or remove the roles with checkboxes. i already successfuly show roles for spesific user. but i have trouble to edit the roles of spesific user with checkboxes. i already sech in stackoverflow to solve this problem. my user entity have many-to-many relationship with role entity. what i have to with my entity, Dao,service, controller and JSP files?

user.java

@Entity
@Table
public class User {

@Id
@GeneratedValue
private int id;

private String userName;

private String email;

private String password;

private boolean enabled;

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable
private List<Role> roles;
/**
@OneToOne
private Employee employee;
**/
public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getUserName() {
    return userName;
}

public void setUserName(String userName) {
    this.userName = userName;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public List<Role> getRoles() {
    return roles;
}

public void setRoles(List<Role> roles) {
    this.roles = roles;
}

/**
 * @return the enabled
 */
public boolean isEnabled() {
    return enabled;
}

/**
 * @param enabled the enabled to set
 */
public void setEnabled(boolean enabled) {
    this.enabled = enabled;
}




}

role.java

@Entity
@Table
public class Role {
@Id
@GeneratedValue
private int id;

private String name;

@ManyToMany(fetch = FetchType.EAGER,mappedBy="roles", cascade = CascadeType.ALL)
private List<User> users;

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public List<User> getUsers() {
    return users;
}

public void setUsers(List<User> users) {
    this.users = users;
}


}

UserDaoImpl.java

@Repository
public class UserDaoImpl implements UserDao{

private static final Logger logger = LoggerFactory.getLogger(UserDaoImpl.class);

@Autowired
private SessionFactory sessionFactory;

@Autowired
private RoleDao roleDao;

public User findById(int id) {

    return (User)sessionFactory.getCurrentSession().get(User.class, id);
}

@SuppressWarnings("unchecked")
public List<User> findAll() {
    Session session = this.sessionFactory.getCurrentSession();
    List<User> userList = session.createQuery("from User").list();
    return userList;
}


public void save(User user) {
    Session session = this.sessionFactory.getCurrentSession();
    BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
    user.setPassword(encoder.encode(user.getPassword()));
    List<Role> roles = new ArrayList<Role>();

    //roles.add(roleDao.findById(2));
    roles.add(roleDao.findByName("ROLE_USER"));

    user.setRoles(roles);

    session.persist(user);
}


public void update(User user) {
    Session session = this.sessionFactory.getCurrentSession();
    session.update(user);
    logger.info("Employee Status updated successfully, departement Details="+user);
}


public void delete(int id) {
    sessionFactory.getCurrentSession().delete(findById(id));

}

public User findOne(int id) {

    return (User)sessionFactory.getCurrentSession().get(User.class, id);
}


public User findOneWithRole(int id) {
    User user = findById(id);
    List<Role> roles =  roleDao.findByUser(id);
    //user.setRoles(roles);
    return user;
}

public void saveRoles(User user) {
    Session session = this.sessionFactory.getCurrentSession();
    //List<Role> roles = new ArrayList<Role>();
    //user.setRoles(roles);

    session.persist(user);
}

}

UserServiceImpl.java

@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserDao userDao;

@Autowired
private RoleDao roleDao;

@Transactional
public User findById(int id) {
    return userDao.findById(id);
}

@Transactional
public List<User> findAll() {
    return userDao.findAll();
}

@Transactional
public void save(User user) {
    user.setEnabled(true);


    userDao.save(user);

}

@Transactional
public void update(User user) {
    userDao.update(user);

}

@Transactional
public void delete(int id) {
    userDao.delete(id);

}

@Transactional
public User findOne(int id) {

    return userDao.findOne(id);
}

@Transactional
public User findOneWithRole(int id) {

    return userDao.findOneWithRole(id);
}

@Transactional
public void saveRoles(User user) {

    userDao.saveRoles(user);
}

}

UserController.java

@Controller
public class UserController {
@Autowired
private UserService userService;

@Autowired
private RoleService roleService;

@RequestMapping(value="user", method = RequestMethod.GET)
public String list(Model model) {
    model.addAttribute("user", new User());
    model.addAttribute("userlist", this.userService.findAll());

    return "user";
}

    //for add and edit
    @RequestMapping(value= "/addAndEditUser", method = RequestMethod.POST)
    public String addAndEditUser(@ModelAttribute("user") User user){
        if(user.getId() == 0){
            //new employee status, call save
            this.userService.save(user);
        }else{
            this.userService.update(user);
        }


        return "redirect:/user";

    }

    //For add 
    @RequestMapping(value= "/addUser", method = RequestMethod.POST)
    public String addUser(@ModelAttribute("user") User user){
        //new employee status, call save
        this.userService.save(user);
        return "redirect:/user";

    }

    //for edit
    @RequestMapping(value= "/updateUser", method = RequestMethod.POST)
    public String updateUser(@ModelAttribute("user") User user){

        //existing Employee status, call update function from service

        userService.update(user);
        return "redirect:/user";

    }

    @RequestMapping("/removeUser/{id}")
    public String removeUser(@PathVariable("id") int id){

        this.userService.delete(id);
        return "redirect:/user";
    }

    //for call edit in list
    @RequestMapping("/editUser/{id}")
    public String editUser(@PathVariable("id") int id, Model model){

        model.addAttribute("religionlist", this.userService.findAll());
        model.addAttribute("user", this.userService.findById(id));
        return "formUser";
    }
     @RequestMapping("/users/{id}")
     public String detail(Model model, @PathVariable int id){
         model.addAttribute("users", userService.findOneWithRole(id));

         return "user-detail";
     }


     @RequestMapping(value= "/addAndEditUserRoles", method = RequestMethod.POST)
        public String addAndEditUserRoles(@ModelAttribute("users") User user, BindingResult result, @PathVariable int id){

            List<Role> roles = new ArrayList<Role>();
            user.getRoles();
            this.userService.saveRoles(user);
            return "user-detail";

        }    
}

user.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://ift.tt/1bjwgjt" prefix="tiles"%>
<%@ taglib uri="http://ift.tt/QfKAz6" prefix="c"%>
<%@ taglib uri="http://ift.tt/18bwTB1" prefix="spring"%>
<%@ taglib uri="http://ift.tt/IED0jK" prefix="form"%>


<script type="text/javascript">
$(document).ready(function(){
   $(".triggerRemove").click(function(e){
    e.preventDefault();
    $("#modalRemove .removeBtn").attr("href", $(this).attr("href"));
    $("#modalRemove").modal();
});
});
</script>

<div id="page-wrapper">
  <div class="container-fluid">

    <!-- Page Heading -->
    <div class="row">
        <div class="col-lg-12">
            <h1 class="page-header">User</h1>
            <ol class="breadcrumb">
                <li><i class="fa fa-dashboard"></i> <a href="/">Dashboard</a>
                </li>
                <li class="active"><i class="fa fa-table"></i>User</li>
            </ol>
        </div>
    </div>
    <!-- /.row -->
    <div class="page-content">
        <div class="col-md-9">
            <div class="panel panel-green">
                <div class="panel-heading">User</div>
                <div class="panel-body">
                    <table class="table table-hover table-bordered">
                        <thead>
                            <tr>

                                <th>ID</th>
                                <th>User Name</th>
                                <th>Email</th>
                                <th>Operation</th>
                            </tr>
                        </thead>
                        <tbody>
                            <c:forEach items="${userlist}" var="userlist">

                                <tr>

                                    <td><a ><c:out value="${userlist.id}" /></a></td>
                                    <td><a href='<spring:url value="/users/${userlist.id}" />'><c:out value="${userlist.userName}" /></a></td>
                                    <td><a><c:out value="${userlist.email}" /></a></td>
                                    <td align="center">
                                        <a href="<c:url value='/editUser/${userlist.id}' />"> 
                                            <span class="glyphicon glyphicon-edit"></span>
                                        </a> &nbsp; &nbsp; 
                                        <a href="<spring:url value='/removeUser/${userlist.id}' />" class="btn btn-danger triggerRemove" >
                                            Remove
                                        </a>
                                    </td>
                                </tr>
                            </c:forEach>
                        </tbody>
                    </table>



                    <!--  Delete Modal -->
                    <div class="modal fade" id="modalRemove" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
                      <div class="modal-dialog" role="document">
                        <div class="modal-content">
                          <div class="modal-header">
                            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                            <h4 class="modal-title" id="myModalLabel">Delete User</h4>
                          </div>
                          <div class="modal-body">
                            Are you sure want to delete this user?
                          </div>
                          <div class="modal-footer">
                            <button type="button" class="btn btn-default" data-dismiss="modal">cancel</button>
                            <a href="" class="btn btn-danger removeBtn">Remove</a>
                          </div>
                        </div>
                      </div>
                    </div>

                    <br>
                    <!--ADD Button trigger modal -->
                    <button type="button" class="btn btn-primary btn-lg"
                        data-toggle="modal" data-target="#myModal">Add
                        User</button>

                    <!-- ADD Modal -->
                    <div class="modal fade" id="myModal" tabindex="-1" role="dialog"
                        aria-labelledby="myModalLabel">
                        <div class="modal-dialog" role="document">
                            <div class="modal-content">
                                <div class="modal-header">
                                    <button type="button" class="close" data-dismiss="modal"
                                        aria-label="Close">
                                        <span aria-hidden="true">&times;</span>
                                    </button>
                                    <h4 class="modal-title" id="myModalLabel">Form
                                        User</h4>
                                </div>
                                <div class="modal-body">
                                    <!-- ----- -->
                                    <div class="panel-body">
                                        <c:url var="addAndEditAction" value="/addAndEditUser"></c:url>

                                        <form:form action="${addAndEditAction}" commandName="user">
                                            <table>
                                                <tr>
                                                    <td><form:label path="userName">
                                                            <spring:message text="Name" />
                                                        </form:label></td>

                                                    <td>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<form:input  path="userName" /></td>
                                                </tr>
                                                <tr>
                                                    <td><form:label path="email">
                                                            <spring:message text="Email" />
                                                        </form:label></td>

                                                    <td>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<form:input path="email" /></td>
                                                </tr>
                                                <tr>
                                                    <td><form:label path="password">
                                                            <spring:message text="Password" />
                                                        </form:label></td>

                                                    <td>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<form:input  path="password" /></td>
                                                </tr>

                                            </table>

                                            <br>

                                            <button type="button" class="btn btn-default"
                                                data-dismiss="modal">Close</button>

                                            <button type="submit" class="btn btn-primary" value="">Save
                                            </button>

                                        </form:form>
                                    </div>
                                    <!-- -------- -->
                                </div>

                                <div class="modal-footer"></div>
                            </div>
                        </div>
                    </div>



                </div>



            </div>
        </div>
    </div>

</div>

User-detail.jsp

<h1>${users.userName}</h1>
<br>
User Role

<form:form modelAttribute="users" method="POST" action="/addAndEditUserRoles">
<c:forEach items="${users.roles}" var="role">
<tr>
    <td><form:checkbox path="roles" value="${role}" label="${role.id}" /></td>
    <td><c:out value="${role.name}" /></td>
</tr>
 <!--  <td>${role.name}</td>-->
 <tr>
    <td colspan="3"><input type="submit" /></td>
</tr>
</c:forEach>
</form:form>

currently the roles only show up the roles that already add manualy in database with the checkboxs checked. for example user admin only show 2 roles Role_admin and Role_user. the rest user not show up like Role_spv and Role_Master. how i show all roles in spesific user so i can edit user role more flexsible with checkboxs?

what i have to do with my entity, Dao,service, controller and JSP files?

thanks

Aucun commentaire:

Enregistrer un commentaire