Skip to content

Commit d9767b0

Browse files
10_06_profile_jsptag
1 parent 25c3236 commit d9767b0

9 files changed

Lines changed: 118 additions & 11 deletions

File tree

src/main/java/ru/javawebinar/topjava/LoggedUser.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* Mock implementation
1616
*/
1717
public class LoggedUser extends org.springframework.security.core.userdetails.User {
18-
private final UserTo userTo;
18+
private UserTo userTo;
1919

2020
public LoggedUser(User user) {
2121
super(user.getEmail(),
@@ -56,6 +56,11 @@ public static int getCaloriesPerDay() {
5656
return get().userTo.getCaloriesPerDay();
5757
}
5858

59+
public void update(UserTo newTo) {
60+
newTo.setId(userTo.getId());
61+
userTo = newTo;
62+
}
63+
5964
@Override
6065
public String toString() {
6166
return userTo.toString();

src/main/java/ru/javawebinar/topjava/service/UserServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public void enable(int id, boolean enabled) {
8787

8888
@Override
8989
public LoggedUser loadUserByUsername(String email) throws UsernameNotFoundException {
90-
User u = repository.getByEmail(email);
90+
User u = repository.getByEmail(email.toLowerCase());
9191
if (u == null) {
9292
throw new UsernameNotFoundException("User " + email + " is not found");
9393
}

src/main/java/ru/javawebinar/topjava/to/UserTo.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import org.hibernate.validator.constraints.Email;
44
import org.hibernate.validator.constraints.NotEmpty;
5+
import org.hibernate.validator.constraints.Range;
56
import ru.javawebinar.topjava.util.UserUtil;
67

8+
import javax.validation.constraints.NotNull;
79
import javax.validation.constraints.Size;
810
import java.io.Serializable;
911

@@ -20,7 +22,10 @@ public class UserTo implements Serializable {
2022
@Size(min = 5, max = 64, message = " must between 5 and 64 characters")
2123
protected String password;
2224

23-
protected int caloriesPerDay = UserUtil.DEFAULT_CALORIES_PER_DAY;
25+
26+
@Range(min = 500, max = 5000)
27+
@NotNull(message = " must not be empty")
28+
protected Integer caloriesPerDay = UserUtil.DEFAULT_CALORIES_PER_DAY;
2429

2530
public UserTo() {
2631
}
@@ -69,10 +74,14 @@ public String getEmail() {
6974
return email;
7075
}
7176

72-
public int getCaloriesPerDay() {
77+
public Integer getCaloriesPerDay() {
7378
return caloriesPerDay;
7479
}
7580

81+
public void setCaloriesPerDay(Integer caloriesPerDay) {
82+
this.caloriesPerDay = caloriesPerDay;
83+
}
84+
7685
@Override
7786
public String toString() {
7887
return "UserTo{" +

src/main/java/ru/javawebinar/topjava/util/UserUtil.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public static User updateFromTo(User user, UserTo userTo) {
2626
}
2727
user.setName(userTo.getName());
2828
user.setEmail(userTo.getEmail().toLowerCase());
29+
user.setCaloriesPerDay(userTo.getCaloriesPerDay());
2930
return user;
3031
}
3132
}

src/main/java/ru/javawebinar/topjava/web/RootController.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,23 @@
33
import org.springframework.security.access.prepost.PreAuthorize;
44
import org.springframework.stereotype.Controller;
55
import org.springframework.ui.ModelMap;
6+
import org.springframework.validation.BindingResult;
67
import org.springframework.web.bind.annotation.RequestMapping;
78
import org.springframework.web.bind.annotation.RequestMethod;
89
import org.springframework.web.bind.annotation.RequestParam;
10+
import org.springframework.web.bind.support.SessionStatus;
11+
import ru.javawebinar.topjava.LoggedUser;
12+
import ru.javawebinar.topjava.to.UserTo;
13+
import ru.javawebinar.topjava.web.user.AbstractUserController;
14+
15+
import javax.validation.Valid;
916

1017
/**
1118
* User: gkislin
1219
* Date: 22.08.2014
1320
*/
1421
@Controller
15-
public class RootController {
22+
public class RootController extends AbstractUserController {
1623

1724
@RequestMapping(value = "/", method = RequestMethod.GET)
1825
public String root() {
@@ -40,4 +47,21 @@ public String login(ModelMap model,
4047
model.put("message", message);
4148
return "login";
4249
}
50+
51+
@RequestMapping(value = "/profile", method = RequestMethod.GET)
52+
public String profile() {
53+
return "profile";
54+
}
55+
56+
@RequestMapping(value = "/profile", method = RequestMethod.POST)
57+
public String updateProfile(@Valid UserTo userTo, BindingResult result, SessionStatus status) {
58+
if (result.hasErrors()) {
59+
return "profile";
60+
} else {
61+
status.setComplete();
62+
LoggedUser.get().update(userTo);
63+
super.update(userTo);
64+
return "redirect:meals";
65+
}
66+
}
4367
}

src/main/java/ru/javawebinar/topjava/web/user/ProfileRestController.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.springframework.web.bind.annotation.RestController;
88
import ru.javawebinar.topjava.LoggedUser;
99
import ru.javawebinar.topjava.model.User;
10+
import ru.javawebinar.topjava.to.UserTo;
1011

1112
/**
1213
* GKislin
@@ -28,8 +29,9 @@ public void delete() {
2829
}
2930

3031
@RequestMapping(method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
31-
public void update(@RequestBody User user) {
32-
super.update(user, LoggedUser.id());
32+
public void update(@RequestBody UserTo userTo) {
33+
userTo.setId(LoggedUser.id());
34+
super.update(userTo);
3335
}
3436

3537
@RequestMapping(value = "/text", method = RequestMethod.GET)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<!DOCTYPE html>
2+
<%@page contentType="text/html" pageEncoding="UTF-8" %>
3+
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
4+
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
5+
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
6+
<%@ taglib prefix="topjava" tagdir="/WEB-INF/tags" %>
7+
8+
<html>
9+
<jsp:include page="fragments/headTag.jsp"/>
10+
11+
<body>
12+
<jsp:include page="fragments/bodyHeader.jsp"/>
13+
14+
<div class="jumbotron">
15+
<div class="container">
16+
<div class="shadow">
17+
<h2>${userTo.name} profile</h2>
18+
19+
<div class="view-box">
20+
<form:form modelAttribute="userTo" class="form-horizontal" method="post" action="profile" charset="utf-8"
21+
accept-charset="UTF-8">
22+
23+
<topjava:inputField label="Name" name="name"/>
24+
<topjava:inputField label="Email" name="email"/>
25+
<topjava:inputField label="Password" name="password" inputType="password"/>
26+
<topjava:inputField label="Calories per day" name="caloriesPerDay" inputType="number"/>
27+
28+
<div class="form-group">
29+
<div class="col-xs-offset-2 col-xs-10">
30+
<button type="submit" class="btn btn-primary">Update</button>
31+
</div>
32+
</div>
33+
</form:form>
34+
</div>
35+
</div>
36+
</div>
37+
</div>
38+
39+
<jsp:include page="fragments/footer.jsp"/>
40+
</body>
41+
</html>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
2+
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3+
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
4+
5+
<%@ attribute name="name" required="true" description="Name of corresponding property in bean object" %>
6+
<%@ attribute name="label" required="true" description="Field label" %>
7+
<%@ attribute name="inputType" required="false" description="Input type" %>
8+
9+
<spring:bind path="${name}">
10+
<c:set var="cssGroup" value="form-group ${status.error ? 'error' : '' }"/>
11+
<div class="${cssGroup}">
12+
<label class="control-label col-xs-2">${label}</label>
13+
14+
<div class="col-xs-8">
15+
<c:choose>
16+
<c:when test="${inputType == 'password'}"><form:password path="${name}"/></c:when>
17+
<c:when test="${inputType == 'number'}"><form:input path="${name}" type="number"/></c:when>
18+
<c:otherwise><form:input path="${name}"/></c:otherwise>
19+
</c:choose>
20+
&nbsp;<span class="help-inline">${status.errorMessage}</span>
21+
</div>
22+
</div>
23+
</spring:bind>

src/test/java/ru/javawebinar/topjava/web/user/ProfileRestControllerTest.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
import org.junit.Test;
44
import org.springframework.http.MediaType;
55
import ru.javawebinar.topjava.TestUtil;
6-
import ru.javawebinar.topjava.model.Role;
76
import ru.javawebinar.topjava.model.User;
7+
import ru.javawebinar.topjava.to.UserTo;
8+
import ru.javawebinar.topjava.util.UserUtil;
89
import ru.javawebinar.topjava.web.AbstractControllerTest;
910
import ru.javawebinar.topjava.web.json.JsonUtil;
1011

@@ -45,13 +46,14 @@ public void testDelete() throws Exception {
4546

4647
@Test
4748
public void testUpdate() throws Exception {
48-
User updated = new User(USER_ID, "newName", "newEmail", "newPassword", Role.ROLE_USER);
49+
UserTo updatedTo = new UserTo(0, "newName", "newEmail", "newPassword", 1500);
50+
4951
mockMvc.perform(put(REST_URL).contentType(MediaType.APPLICATION_JSON)
5052
.with(TestUtil.userHttpBasic(USER))
51-
.content(JsonUtil.writeValue(updated)))
53+
.content(JsonUtil.writeValue(updatedTo)))
5254
.andDo(print())
5355
.andExpect(status().isOk());
5456

55-
MATCHER.assertEquals(updated, new User(userService.getByEmail("newEmail")));
57+
MATCHER.assertEquals(UserUtil.updateFromTo(new User(USER), updatedTo), userService.getByEmail("newemail"));
5658
}
5759
}

0 commit comments

Comments
 (0)