我有这堂课:
@Component
@Scope("session")
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue
@GenericGenerator(name = "incremental", strategy = "increment")
private Long userID;
@Column(nullable = false)
private String username;
@Column(nullable = false)
private String email;
@Column(nullable = false)
private String password;
// getters and setters
}
而这个控制器:
@Controller
@SessionAttributes("user")
@Scope("request")
public class UserCreationWizard {
@Autowired
private User user;
@ModelAttribute("user")
private User createUser() {
return user;
}
@RequestMapping(value = "/new/users/page/", method = RequestMethod.GET)
public String begin(HttpServletRequest request) {
return "wizard";
}
@RequestMapping(value = "/new/users/page/{page}", method = RequestMethod.POST)
public String step(@ModelAttribute("user") User user,
@RequestParam("username") String username,
@RequestParam("email") String password,
@PathVariable() Integer page) {
return "wizard" + page;
}
@RequestMapping(value = "/new/users/page/end", params = "submit", method = RequestMethod.POST)
public String end(@RequestParam("password") String password) {
user.setPassword(password);
user.setActive(true);
user.setLastLoggedIn(Calendar.getInstance());
Session s = HibernateUtils.getSessionFactory().openSession();
Transaction t = s.beginTransaction();
try {
s.persist(user);
s.flush();
t.commit();
s.close();
} catch (HibernateException e) {
t.rollback();
}
return "wizard";
}
}
begin()
只需在用户创建向导中加载第一个视图(jsp)。username
它具有和的输入字段email
。在视图中,您提交了一个 POST 表单提交,它会触发step()
. 在第二个视图(wizard+page.jsp)中,您有一个password
字段和一个触发的提交输入end()
。
- 在调试模式下,我注意到在
step()
将 User 作为 ModelAttribute 传递的地方,我不需要为用户名和密码设置其字段。它们是从 RequestParams 属性中自动获取的。但是,在end()
我没有 ModelAttribute 的情况下,我必须手动设置密码。Spring如何管理这个? - 此外,如果我在控制器中取出该
createUser()
方法,应用程序会失败,说它找不到“用户”的会话属性。此方法如何作为方法参数链接到 MethodAttribute? - 最后,如果我取出@SessionAttributes,应用程序不会失败,但我觉得出了点问题。User 用户现在对所有 httprequests 都是全局的吗?
我的一般问题是:spring beans 是否映射到它们的名称?例如。在这里,我将“用户”作为用户,将“用户”作为会话中的用户,将“密码”作为请求参数,将“密码”作为用户成员变量。