我正在制作一个春季MVC项目。我的Admin.jsp页面是:
<form:form action="/users" method="post" ModelAttribute="user">
<table border="1" >
<tr>
<td><a href="/findUserById"> Find a User</a></td>
</tr>
<tr>
<td><a href="/edit">Edit a User</a></td>
</tr>
<tr>
<td><a href="/update">Update a User</a></td>
</tr>
<tr>
<td><a href="/edit"> Delete a User</a></td>
</tr>
<tr>
<td><a href="users">List of all the Users</a></td>
</tr>
</table>
</form:form>
点击href =“users”后,请求转到控制器:
@RequestMapping(value = "/users", method = RequestMethod.GET)
public String usersList(@ModelAttribute("user") User user, BindingResult result, Model model) {
List<User> userList = userService.listPersons();
// attribute goes to jsp
model.addAttribute("userList", userList);
// return users.jsp page
return "users";
}
我的users.jsp页面是:
<body>
<table>
<thead style="background: #fcf">
<tr>
<th>ID</th>
<th>Name</th>
<th>User Id</th>
<th>Email</th>
<th>Department</th>
<th>Role</th>
<th colspan="3"></th>
</tr>
</thead>
<c:forEach items="${userList}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.userId}</td>
<td>${user.email}</td>
<td>${user.department}</td>
<td>${user.role}</td>
<td><a href="<c:url value='/edit/${user.id}' />">Edit</a></td>
<td><a href="<c:url value='/delete/${user.id}' />">Delete</a></td>
<td><a href="<c:url value='/edit/${user.id}' />">Update</a></td>
</tr>
</c:forEach>
</table>
</body>
在users.jsp页面上,我点击列表中每个用户的href编辑按钮,url变为users / {id},控件转到控制器的方法,写成:
@RequestMapping("/edit/{id}")
public String editUser(@ModelAttribute("user") User user, Model model) {
User u= userService.findById(id);
user.setId(id);
// Delegate to userService for update
userService.update(user);
model.addAttribute("id", id);
model.addAttribute("userList", userList);
return "editedUser";
}
我无法弄清楚如何从users.jsp获取用户的id到控制器方法。 我的editedUser.jsp页面是:
<body>
<h1>Today on </h1> <%= new java.util.Date() %>
<p>You have edited the user with id ${user.id} with info: </p>
${userList}
<p>Return to <a href="login">Login Page</a></p>
</body>
DaoImpl是
@Repository
public class UserDaoImpl implements UserDao {
private static final Logger logger = LoggerFactory.getLogger(UserDaoImpl.class);
@Autowired
private SessionFactory sessionFactory;
public UserDaoImpl() { }
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public UserDaoImpl(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
// ***********************save User*****************
@Transactional
public boolean save(User user) {
// Retrieve session from Hibernate
Session session = sessionFactory.getCurrentSession();
// save
session.save(user);
return true;
}
// **************update/edit******************
@Transactional
public User update(User user) {
// Retrieve session from Hibernate
Session session = this.sessionFactory.getCurrentSession();
// Retrieve existing person via id
User existingUser = (User) session.get(User.class, user.getId());
// Assign updated values to this person
existingUser.setName(user.getName());
existingUser.setEmail(existingUser.getEmail());
existingUser.setRole(existingUser.getRole());
existingUser.setDepartment(existingUser.getDepartment());
// update Use
session.update(user);
// return to jsp
return user;
}
// ***********find user by Id*************
public User findById(int id) {
// Retrieve session from Hibernate
Session session = this.sessionFactory.getCurrentSession();
// get user
User u = (User) session.get(User.class, new Integer(id));
return u;
}
// *************************List of User**************
@SuppressWarnings("unchecked")
@Transactional
public List<User> listPersons() {
Session session = this.sessionFactory.getCurrentSession();
List<User> personsList = session.createQuery("from User").list();
for (User u : personsList) {
logger.info("User List::" + u);
}
return personsList;
}
// *************************Delete a User**************
public User deleteById(int id) {
Session session = this.sessionFactory.getCurrentSession();
User u = (User) session.load(User.class, new Integer(id));
if (null != u) {
session.delete(u);
}
logger.info("Person deleted successfully, person details=" + u);
return u;
}
当我运行应用程序时,所有页面r都可以很好地到达用户页面,但是当我点击users.jsp上的编辑/更新href时,我从tomcat7上获得了这个:
Unresolved compilation problems: id cannot be resolved to a variable id cannot be resolved to a variable id cannot be resolved to a variable
如何从users.jsp获取id到控制器以及我错在哪里?请建议。任何类似的示例应用程序将不胜感激感谢
答案 0 :(得分:0)
您的问题出在您的控制器方法参数中。试试这个:
@RequestMapping("/edit/{id}")
public String editUser(@PathVariable("id") Integer id, Model model) {
Integer userId = id; // get your id passed from jsp
// do whatever with the id
// ...
}
假设您的id
属性为Integer
您的methed参数列表中的变量ID与RequestMapping中的{id}匹配。
以下是文档,您可以找到有关如何处理路径变量的更多信息:
Spring mvc doc
答案 1 :(得分:0)
@RequestMapping(value = "/users", method = RequestMethod.GET)
public String usersList(@ModelAttribute("user") User user, BindingResult result, Model model) {
List<User> userList = userService.listPersons();
// attribute goes to jsp
model.addAttribute("userList", userList);
// return users.jsp page
return "users";
}
@ModelAttribute(&#34; user&#34;)将表单从jsp传递给控制器时使用用户用户。你也在list方法中使用了它。这是不对的。您甚至不需要它(@ModelAttribute(&#34; user&#34;))向用户显示列表。
您正从服务中取出[List userList]并返回String。这也是错误的。您可以按原样返回列表。
正如injun.Y指出的那样,您只需要一个来自JSP的整数值$ {user.id}。您无法期望整个JavaScript对象与[User]对象具有相同的getter和setter。
如果您真的不熟悉PathVariable,那么您可以使用HttpServletRequest。
@RequestMapping("/edit")
public String editUser(HttpServletRequest req, Model model) {
String id = req.getParameter("id");
User u= userService.findById(id);
//do things here
}
答案 2 :(得分:0)
试试这段代码:
@RequestMapping("/edit/{id}",method=RequestMethod.GET)
public String editUser(@PathVariable("id") Integer id, Model model) {
model.addAttribute("user", userService.findById(id));
return "editedUser";
}
您只需在编辑页面上显示user
属性。在上面的代码片段中,我进行了如下更改:
RequestMethod
设为GET
@PathVariable
代替@ModelAttribute
,而不是<a>
代码,只发送id
。