2011-08-08 10 views
5

पहली छोटी पृष्ठभूमि जानकारी। एक आदर्श मानक उपयोगकर्ता भूमिका संबंध मिला जहां उपयोगकर्ता की कई भूमिकाएं हो सकती हैं। मेरे पास उपयोगकर्ता वर्ग के भीतर एक सेट के रूप में परिभाषित भूमिकाएं हैं। अब मुझे पता है कि एचटीएमएल रूपों में स्ट्रिंग्स के रूप में सभी मान हैं और मूल्य प्राप्त करने की कोशिश कर रहे हैं क्योंकि मेरी कस्टम रोल ऑब्जेक्ट काम नहीं करती है। मैंने आईडी की पीठ को ऑब्जेक्ट में बदलने के लिए एक इनबिबिंडर लागू किया ताकि मैं अपने चेकबॉक्सों से चुने गए मानों को पुनः प्राप्त कर सकूं, वह हिस्सा काम करता है।स्प्रिंग एमवीसी प्री पॉपलेट चेकबॉक्स

लेकिन मुझे दूसरी तरफ वापस नहीं लग रहा है। मैं उस डेटाबेस से उपयोगकर्ता को पुनर्प्राप्त करता हूं जिसमें पहले से ही भूमिकाएं हैं और उपयोगकर्ता की सभी भूमिकाओं के साथ रोल चेकबॉक्स को पूर्ववत करना चाहते हैं। इस उदाहरण के आधार पर:

Checkboxes example

वे कहते हैं कि:

प्रपत्र: चेक बॉक्स आइटम = "$ {गतिशील सूची}" पथ = "संपत्ति-टू-स्टोर"

कई चेकबॉक्स के लिए, जब तक "पथ" या "संपत्ति" मान किसी भी "चेकबॉक्स मान - $ {गतिशील-सूची}" के बराबर है, मिलान चेकबॉक्स स्वचालित रूप से चेक किया जाएगा।

कि मेरे व्याख्या मैं सभी भूमिकाओं का एक सेट यह फ़ीड और पथ को परिभाषित उपयोगकर्ता ऑब्जेक्ट से भूमिकाओं होने के लिए सक्षम होना चाहिए है और यह उन्हें इस प्रकार से भरें पूर्व के लिए चेक बॉक्स के कारण मैच चाहिए।

प्रत्येक उदाहरण में स्ट्रिंग [] के रूप में गतिशील-सूची का मूल्य लगता है। वैसे यह महान और बेवकूफ है लेकिन यह कस्टम ऑब्जेक्ट्स के लिए कैसे काम करता है जिसे हमने सेट के रूप में परिभाषित किया है? क्या मैं अभी भी चेकबॉक्स के लिए इस लाइन परिभाषा का उपयोग कर सकता हूं या क्या मुझे दृश्य में कुछ प्रकार के डेटा बाध्यकारी शीर्षक भी करने की ज़रूरत है?

यहां मेरा उपयोगकर्ता डीटीओ, उपयोगकर्ता नियंत्रक, कस्टम फॉर्म बाइंडर और उपयोगकर्ता संपादन पृष्ठ है।

उपयोगकर्ता डीटीओ

@Entity 
@Table 
public class User extends BaseDto 
{ 
    @Column(updatable = false) @NotBlank 
    private String username; 

    @Column(name = "encrypted_password") @Size(min = 6, message = "password must be at least 6 characters") @Pattern(regexp = "^\\S*$", message = "invalid character detected") 
    private String password; 

    @Column(name = "first_name") 
    private String firstName; 

    @Column(name = "last_name") 
    private String lastName; 

    @Column @NotNull 
    private boolean enabled; 

    @Column @Email @NotBlank 
    private String email; 

    @Transient 
    private String confirmPassword; 

    @ManyToMany(targetEntity = Role.class, fetch = FetchType.EAGER, cascade = CascadeType.REFRESH) @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), 
     inverseJoinColumns = @JoinColumn(name = "role_id")) 
    private Set<Role> roles; 

    public User() 
    { 
    } 

    public User(final String usernameIn, final String passwordIn, final String firstNameIn, final String lastNameIn, final String emailIn, final boolean enabledIn) 
    { 
     username = usernameIn; 
     password = passwordIn; 
     firstName = firstNameIn; 
     lastName = lastNameIn; 
     email = emailIn; 
     enabled = enabledIn; 
    } 

    public String getUsername() 
    { 
     return username; 
    } 

    public void setUsername(final String usernameIn) 
    { 
     username = usernameIn; 
    } 

    public String getPassword() 
    { 
     return password; 
    } 

    public void setPassword(final String passwordIn) 
    { 
     password = passwordIn; 
    } 

    public String getFirstName() 
    { 
     return firstName; 
    } 

    public void setFirstName(final String firstNameIn) 
    { 
     firstName = firstNameIn; 
    } 

    public String getLastName() 
    { 
     return lastName; 
    } 

    public void setLastName(final String lastNameIn) 
    { 
     lastName = lastNameIn; 
    } 

    public String getEmail() 
    { 
     return email; 
    } 

    public void setEmail(final String emailIn) 
    { 
     email = emailIn; 
    } 

    public String getConfirmPassword() 
    { 
     return confirmPassword; 
    } 

    public void setConfirmPassword(final String confirmPasswordIn) 
    { 
     confirmPassword = confirmPasswordIn; 
    } 

    public boolean isEnabled() 
    { 
     return enabled; 
    } 

    public void setEnabled(final boolean enabledIn) 
    { 
     enabled = enabledIn; 
    } 

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

    public void setRoles(final Set<Role> rolesIn) 
    { 
     roles = rolesIn; 
    } 
} 

उपयोगकर्ता नियंत्रक देखें

@Controller @RequestMapping("/user") 
public class UserController 
{ 
    @Autowired private UserService userService; 
    @Autowired private UserDao userDao; 
    @Autowired private RoleDao roleDao; 

    @InitBinder 
    public void bindForm(final WebDataBinder binder) 
    { 
     binder.registerCustomEditor(Set.class, "roles", new CustomFormBinder<RoleDao>(roleDao, Set.class)); 
    } 

    @RequestMapping(method = RequestMethod.GET) 
    public String index(final ModelMap modelMap) 
    { 
     return "/user/index"; 
    } 

    @RequestMapping(value = "/create", method = RequestMethod.GET) 
    public String create(final ModelMap modelMap) 
    { 
     modelMap.addAttribute("userInstance", new User()); 
     modelMap.addAttribute("validRoles", new HashSet<Role>(roleDao.findAll())); 

     return "/user/create"; 
    } 

    @RequestMapping(value = "/save", method = RequestMethod.POST) 
    public String save(final ModelMap modelMap, @Valid @ModelAttribute("userInstance") final User user, final BindingResult bindingResult) 
    { 
     // TODO move to service validation 
     if (user.getPassword() == null || !user.getPassword().equals(user.getConfirmPassword())) 
     { 
     bindingResult.addError(new FieldError("userInstance", "password", "password fields must match")); 
     bindingResult.addError(new FieldError("userInstance", "confirmPassword", "password fields must match")); 
     } 
     if (user.getRoles() == null || user.getRoles().isEmpty()) 
     { 
     bindingResult.addError(new FieldError("userInstance", "roles", "Must select at least one role for a User")); 
     } 
     if (bindingResult.hasErrors()) 
     { 
     modelMap.addAttribute("validRoles", new HashSet<Role>(roleDao.findAll())); 
     return "/user/create"; 
     } 

     userService.save(user); 
     return "redirect:/user/list"; 
    } 

    @RequestMapping(value = "/edit/{id}", method = RequestMethod.GET) 
    public String edit(@PathVariable final Integer id, final ModelMap modelMap) 
    { 
     final User user = userDao.find(id); 

     if (user != null) 
     { 
     modelMap.addAttribute("userInstance", user); 
     modelMap.addAttribute("validRoles", new HashSet<Role>(roleDao.findAll())); 
     return "/user/edit"; 
     } 
     return "redirect:/user/list"; 
    } 

    @RequestMapping(value = "/edit", method = RequestMethod.GET) 
    public String editCurrent(final ModelMap modelMap) 
    { 
     return edit(userService.getLoggedInUser().getId(), modelMap); 
    } 

    @RequestMapping(value = "/update", method = RequestMethod.POST) 
    public String update(@Valid @ModelAttribute("userInstance") final User user, final BindingResult bindingResult) 
    { 
     if (bindingResult.hasErrors()) 
     { 
     return "/user/edit"; 
     } 

     userService.save(user); 
     return "redirect:/user/list"; 
    } 

    @ModelAttribute("userInstances") 
    @RequestMapping(value = "/list", method = RequestMethod.GET) 
    public List<User> list() 
    { 
     return userDao.findAll(); 
    } 
} 

कस्टम प्रपत्र बाइंडर

public class CustomFormBinder<T extends GenericDao> extends CustomCollectionEditor 
{ 
    private final T dao; 

    private static final Logger LOG = LoggerFactory.getLogger(CustomFormBinder.class); 

    public CustomFormBinder(final T daoIn, final Class collectionType) 
    { 
     super(collectionType, true); 
     dao = daoIn; 
    } 

    @Override 
    protected Object convertElement(final Object element) 
    { 
     try 
     { 
     // forms should return the id as the itemValue 
     return dao.find(Integer.valueOf(element.toString())); 
     } 
     catch (NumberFormatException e) 
     { 
     LOG.warn("Unable to convert " + element + " to an integer"); 
     return null; 
     } 
    } 

} 

उपयोगकर्ता संपादित

<html> 
    <head> 
     <title>Create User</title> 
    </head> 
    <body> 

    <c:url value="/user/update" var="actionUrl"/> 
    <form:form method="post" commandName="userInstance" action="${actionUrl}"> 
     <h1>Edit User ${userInstance.username}</h1> 

     <div> 
      <form:label path="username">Username:</form:label> 
      <form:input path="username" id="username" readonly="true"/> 
     </div> 

     <div> 
      <form:label path="password">Password:</form:label> 
      <form:input path="password" id="password" type="password" readonly="true"/> 
      <tag:errorlist path="userInstance.password" cssClass="formError"/> 
     </div> 

     <div> 
      <form:label path="firstName">First Name:</form:label> 
      <form:input path="firstName" id="firstName"/> 
      <tag:errorlist path="userInstance.firstName" cssClass="formError"/> 
     </div> 

     <div> 
      <form:label path="lastName">Last Name:</form:label> 
      <form:input path="lastName" id="lastName"/> 
      <tag:errorlist path="userInstance.lastName" cssClass="formError"/> 
     </div> 

     <div> 
      <form:label path="email">Email:</form:label> 
      <form:input path="email" id="email" size="30"/> 
      <tag:errorlist path="userInstance.email" cssClass="formError"/> 
     </div> 

     <div> 
     **<%--Want to Pre Populate these checkboxed--%> 
<form:checkboxes title="Assigned Roles:" path="roles" id="roles" items="${validRoles}" itemLabel="displayName" itemValue="id" element="div"/>** 
      <tag:errorlist path="userInstance.roles" cssClass="formError"/> 
     </div> 

     <form:hidden path="enabled"/> 
     <form:hidden path="id"/> 
     <form:hidden path="version"/> 

     <div class="submit"> 
      <input type="submit" value="Update"/> 
      <a href="<c:url value='/user/list'/>" class="cancel">Cancel</a> 
     </div> 
    </form:form> 

    </body> 
    </html> 
+0

ध्यान दें कि '

उपयोगकर्ता संपादित करें $ {userInstance.username}

'जावा स्क्रिप्ट इंजेक्शन संभव बनाने के लिए प्रतीत होता है – Ralph

उत्तर

5

आपको Role के लिए एक सही कार्यान्वित बराबर विधि की आवश्यकता है!

यदि यह पर्याप्त नहीं है तो oorg.springframework.web.servlet.tags.form.AbstractCheckedElementTag पर एक नज़र डालें। विधि void renderFromValue(Object item, Object value, TagWriter tagWriter) वह जगह है जहां चेक किया गया ध्वज सेट किया गया है।

+1

बराबर विधि चाल चलती है !! मुझे यकीन नहीं है कि मैंने कभी ऐसा करने का सोचा होगा। धन्यवाद!! – sauce

+0

@ राल्फ - मुझे अब इस समस्या के साथ कोई समस्या है ... http: //stackoverflow.com/questions/7003152/openentitymanagerinviewfilter-problems...mind एक नज़र रखना? – sauce

+0

कोई उदाहरण दे सकता है कि बराबर विधि कैसे लिखी जानी चाहिए? क्योंकि मैंने एक्लिप्स उत्पन्न किया है बराबर और हैशकोड फ़ंक्शन उत्पन्न करता है लेकिन मुझे कुछ समस्याएं हैं ... धन्यवाद – SaganTheBest

संबंधित मुद्दे