Skip to content

Commit d52b90b

Browse files
committed
9_10_jsp_form_login
1 parent bf05ee9 commit d52b90b

9 files changed

Lines changed: 146 additions & 47 deletions

File tree

config/messages/app.properties

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
app.title=Calories management
2+
app.stackTitle=Application stack:
3+
app.description=<a href="https://github.com/JavaOPs/topjava">Java Enterprise project</a> with registration/authorization and role-based access rights (USER, ADMIN). \
4+
Admin could create/edit/delete users, users - manage your profile and data (meals) via UI (AJAX) and REST with basic authorization. \
5+
Meals could be filtered by date and time. Meal record color depends on daily calories sum exceeding "Daily calorie limit" (editable user's profile paramets). \
6+
All REST interface covered with JUnit tests by Spring MVC Test and Spring Security Test.
27
app.footer=<a href="https://github.com/JavaOPs/topjava" target=_blank>Spring 5/JPA Enterprise (Topjava)</a> internship application
38
app.login=Login as
49

config/messages/app_ru.properties

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
app.title=Подсчет калорий
2+
app.stackTitle=Стек технологий:
3+
app.description=<a href="https://github.com/JavaOPs/topjava">Java Enterprise проект</a> с регистрацией/авторизацией и правами доступа на основе ролей (USER, ADMIN). \
4+
Администратор может создавать/редактировать/удалять пользователей, а пользователи - управлять своим профилем и данными (едой) через UI (по AJAX) и по REST интерфейсу с базовой авторизацией. \
5+
Возможна фильтрация еды по датам и времени. Цвет записи таблицы еды зависит от того, превышает ли сумма калорий за день норму (редактируемый параметр в профиле пользователя). \
6+
Весь REST интерфейс покрывается JUnit тестами, используя Spring MVC Test и Spring Security Test.
27
app.footer=Приложение стажировки <a href="https://github.com/JavaOPs/topjava" target=_blank>Spring 5/JPA Enterprise (Topjava)</a>
38
app.login=Зайти как
49

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

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,9 @@
66
import org.springframework.stereotype.Controller;
77
import org.springframework.ui.Model;
88
import org.springframework.web.bind.annotation.GetMapping;
9-
import org.springframework.web.bind.annotation.PostMapping;
109
import ru.javawebinar.topjava.service.MealService;
1110
import ru.javawebinar.topjava.util.MealsUtil;
1211

13-
import javax.servlet.http.HttpServletRequest;
14-
1512
@Controller
1613
public class RootController {
1714
private static final Logger log = LoggerFactory.getLogger(RootController.class);
@@ -22,7 +19,7 @@ public class RootController {
2219
@GetMapping("/")
2320
public String root() {
2421
log.info("root");
25-
return "index";
22+
return "redirect:meals";
2623
}
2724

2825
@GetMapping("/users")
@@ -31,12 +28,10 @@ public String getUsers() {
3128
return "users";
3229
}
3330

34-
@PostMapping("/users")
35-
public String setUser(HttpServletRequest request) {
36-
int userId = Integer.parseInt(request.getParameter("userId"));
37-
log.info("setUser {}", userId);
38-
SecurityUtil.setAuthUserId(userId);
39-
return "redirect:meals";
31+
@GetMapping("/login")
32+
public String login() {
33+
log.info("login");
34+
return "login";
4035
}
4136

4237
@GetMapping("/meals")

src/main/resources/spring/spring-mvc.xml

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
<beans xmlns="http://www.springframework.org/schema/beans"
22
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
33
xmlns:context="http://www.springframework.org/schema/context"
4-
xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc"
4+
xmlns:p="http://www.springframework.org/schema/p"
5+
xmlns:mvc="http://www.springframework.org/schema/mvc"
56
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
67
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
78

89
<bean class="ru.javawebinar.topjava.web.json.JacksonObjectMapper" id="objectMapper" factory-method="getMapper"/>
910

11+
<!-- serve static resources (*.html, ...) from src/main/webapp/ -->
12+
<mvc:default-servlet-handler/>
13+
1014
<mvc:annotation-driven conversion-service="conversionService">
1115
<mvc:message-converters>
1216
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
@@ -44,17 +48,17 @@
4448
p:prefix="/WEB-INF/jsp/"
4549
p:suffix=".jsp"/>
4650

47-
<!--
48-
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"
49-
p:cacheSeconds="60"
50-
p:defaultEncoding="UTF-8">
51-
<property name="basenames">
52-
<list>
53-
<value>messages/app</value>
54-
</list>
55-
</property>
56-
</bean>
57-
-->
51+
<!--
52+
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"
53+
p:cacheSeconds="60"
54+
p:defaultEncoding="UTF-8">
55+
<property name="basenames">
56+
<list>
57+
<value>messages/app</value>
58+
</list>
59+
</property>
60+
</bean>
61+
-->
5862
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"
5963
p:cacheSeconds="5"
6064
p:defaultEncoding="UTF-8">

src/main/resources/spring/spring-security.xml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,15 @@
1717
<beans:bean name="noopEncoder" class="org.springframework.security.crypto.password.NoOpPasswordEncoder"/>
1818

1919
<http>
20+
<intercept-url pattern="/login" access="permitAll()"/>
21+
2022
<intercept-url pattern="/admin/**" access="hasRole('ADMIN')"/>
2123
<intercept-url pattern="/**" access="isAuthenticated()"/>
22-
<form-login/>
23-
<logout/>
24+
25+
<form-login login-page="/login" default-target-url="/meals"
26+
authentication-failure-url="/login?error=true"
27+
login-processing-url="/spring_security_check"/>
28+
<logout logout-success-url="/login"/>
2429
<csrf disabled="true"/>
2530
</http>
2631

src/main/webapp/WEB-INF/jsp/index.jsp

Lines changed: 0 additions & 23 deletions
This file was deleted.
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
2+
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3+
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
4+
5+
<html>
6+
<jsp:include page="fragments/headTag.jsp"/>
7+
<body>
8+
<nav class="navbar navbar-dark bg-dark py-0">
9+
<div class="container">
10+
<div class="navbar-brand"><img src="resources/images/icon-meal.png"> <spring:message code="app.title"/></div>
11+
<form class="form-inline my-2" id="login_form" action="spring_security_check" method="post">
12+
<input class="form-control mr-1" type="text" placeholder="Email" name="username">
13+
<input class="form-control mr-1" type="password" placeholder="Password" name="password">
14+
<button class="btn btn-success" type="submit">
15+
<span class="fa fa-sign-in"></span>
16+
</button>
17+
</form>
18+
</div>
19+
</nav>
20+
21+
<div class="jumbotron py-0">
22+
<div class="container">
23+
<c:if test="${param.error}">
24+
<div class="error">${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message}</div>
25+
</c:if>
26+
<c:if test="${not empty param.message}">
27+
<div class="message"><spring:message code="${param.message}" text=""/></div>
28+
</c:if>
29+
<br/>
30+
<p>
31+
<button type="submit" class="btn btn-lg btn-primary" onclick="login('user@yandex.ru', 'password')">
32+
<spring:message code="app.login"/> User
33+
</button>
34+
<button type="submit" class="btn btn-lg btn-primary" onclick="login('admin@gmail.com', 'admin')">
35+
<spring:message code="app.login"/> Admin
36+
</button>
37+
</p>
38+
<br/>
39+
<div class="lead py-4"><spring:message code="app.stackTitle"/> <br>
40+
<a href="http://projects.spring.io/spring-security/">Spring Security</a>,
41+
<a href="https://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html">Spring MVC</a>,
42+
<a href="http://projects.spring.io/spring-data-jpa/">Spring Data JPA</a>,
43+
<a href="http://spring.io/blog/2014/05/07/preview-spring-security-test-method-security">Spring Security
44+
Test</a>,
45+
<a href="http://hibernate.org/orm/">Hibernate ORM</a>,
46+
<a href="http://hibernate.org/validator/">Hibernate Validator</a>,
47+
<a href="http://www.slf4j.org/">SLF4J</a>,
48+
<a href="https://github.com/FasterXML/jackson">Json Jackson</a>,
49+
<a href="http://ru.wikipedia.org/wiki/JSP">JSP</a>,
50+
<a href="http://en.wikipedia.org/wiki/JavaServer_Pages_Standard_Tag_Library">JSTL</a>,
51+
<a href="http://tomcat.apache.org/">Apache Tomcat</a>,
52+
<a href="http://www.webjars.org/">WebJars</a>,
53+
<a href="http://datatables.net/">DataTables</a>,
54+
<a href="http://ehcache.org">EHCACHE</a>,
55+
<a href="http://www.postgresql.org/">PostgreSQL</a>,
56+
<a href="http://hsqldb.org/">HSQLDB</a>,
57+
<a href="https://junit.org/junit5/">JUnit 5</a>,
58+
<a href="http://hamcrest.org/JavaHamcrest/">Hamcrest</a>,
59+
<a href="https://assertj.github.io/doc/">AssertJ</a>,
60+
<a href="http://jquery.com/">jQuery</a>,
61+
<a href="https://plugins.jquery.com/">jQuery plugins</a>,
62+
<a href="http://getbootstrap.com/">Bootstrap</a>.
63+
</div>
64+
</div>
65+
</div>
66+
<div class="container lead"><spring:message code="app.description"/>
67+
</div>
68+
<jsp:include page="fragments/footer.jsp"/>
69+
<script type="text/javascript">
70+
function login(username, password) {
71+
$('input[name="username"]').val(username);
72+
$('input[name="password"]').val(password);
73+
$("#login_form").submit();
74+
}
75+
</script>
76+
</body>
77+
</html>

src/main/webapp/resources/css/style.css

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,24 @@ tr[data-user-enabled="false"] {
1414
opacity: 0.3;
1515
}
1616

17+
.error, .message {
18+
padding: 10px;
19+
border-radius: 4px;
20+
font-size: 16px;
21+
}
22+
23+
.error {
24+
color: #a94442;
25+
background-color: #f2dede;
26+
border: 1px solid #ebccd1;
27+
}
28+
29+
.message {
30+
color: #2f9635;
31+
background-color: #c6fbc2;
32+
border: 1px solid #9feba6;
33+
}
34+
1735
/*https://getbootstrap.com/docs/4.0/examples/sticky-footer/sticky-footer.css*/
1836
html {
1937
position: relative;

src/main/webapp/test.html

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<html>
2+
<link rel="stylesheet" href="resources/css/style.css">
3+
<link rel="stylesheet" href="webjars/bootstrap/4.4.1/dist/css/bootstrap.min.css">
4+
<link rel="shortcut icon" href="resources/images/icon-meal.png">
5+
<body>
6+
<hr/>
7+
<ul>
8+
<li><a href="users">User list</a></li>
9+
<li><a href="meals">Meal list</a></li>
10+
</ul>
11+
<hr/>
12+
</body>
13+
</html>

0 commit comments

Comments
 (0)