Как запустить загрузку формы Spring, нажав на элемент li? - PullRequest
0 голосов
/ 08 марта 2020

У меня есть боковая панель для страницы моего профиля пользователя, в которой есть два элемента: 1) обновление информации и 2) отображение отзывов, которые пользователь уже написал. Первый элемент работает отлично (так как он включает form и имеет кнопку submit). Но для второго я понятия не имею. Цель состоит в том, чтобы при нажатии My Reviews вызывался метод из класса контроллера, отзывы пользователя извлекались из базы данных, а результаты показывались в правой части страницы. Поскольку у меня нет кнопки submit или form для второго элемента, я не знаю, как ее реализовать. Вот мой код:

        <div class="module-inner">
                    <div class="side-bar">                      
                        <nav class="side-menu">
                            <div class="col-xs-3">
                                <ul class="nav nav-pills nav-stacked">
                                    <li class="active"><a data-toggle="pill" href="#profile">Profile</li>
                                    <li class="active"><a data-toggle="pill" href="#review">My
                                            Reviews</a></li>
                                </ul>
                            </div>
                        </nav>
                    </div>

                    <div class="content-panel">
                        <div class="col-xs-9">
                            <div class="tab-content">
                                <div id="profile" class="tab-pane fade">
                                    <form class="form-horizontal" th:action="@{/edit_profile}">                                         <fieldset class="fieldset">
                                            <h3 class="fieldset-title">Personal Info</h3>
                                            <div class="form-group">
                                                <label class="col-md-2 col-sm-3 col-xs-12 control-label">User
                                                    Name</label>
                                                <div class="col-md-10 col-sm-9 col-xs-12">
                                                    <input type="text" class="form-control"
                                                        th:disabled="${currentUser.email}"
                                                        th:value="${currentUser.email}">
                                                </div>
                                            </div>

                                            <div class="form-group">
                                                <label class="col-md-2 col-sm-3 col-xs-12 control-label">First
                                                    Name</label>
                                                <div class="col-md-10 col-sm-9 col-xs-12">
                                                    <input name="firstname" type="text" class="form-control"
                                                        th:value="${currentUser.firstname}">
                                                </div>
                                            </div>
                                            <div class="form-group">
                                                <label class="col-md-2 col-sm-3 col-xs-12 control-label">Last
                                                    Name</label>
                                                <div class="col-md-10 col-sm-9 col-xs-12">
                                                    <input name="lastname" type="text" class="form-control"
                                                        th:value="${currentUser.lastname}">
                                                </div>
                                            </div>
                                        </fieldset>

                                        <hr>
                                        <div class="form-group">
                                            <div
                                                class="col-md-10 col-sm-9 col-xs-12 col-md-push-2 col-sm-push-3 col-xs-push-0">
                                                <input class="btn btn-primary" type="submit"
                                                    value="Update Profile">
                                            </div>
                                        </div>
                                    </form>
                                </div>

                                <div id="review" class="tab-pane fade">
                                    <h3>Menu 2</h3>
                                    <p>You have no reviews yet.</p>
                                </div>

                            </div>
                        </div>
                    </div>
                </div>

Вот мой контроллер:

@RequestMapping(value = "/findUserReviews", method = RequestMethod.GET)
public ModelAndView findUserReviews() {
    ModelAndView modelAndView = new ModelAndView();
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    User user = userService.findUserByEmail(auth.getName());
    ..
    modelAndView.addObject("reviews", reviewRepository.findUserRevies());

    modelAndView.setViewName("profile");
    return modelAndView;
}

Я использую следующие технологии: Spring boot, Hibernate и Thymeleaf.

Любая помощь будет принята.

Окончательное обновление: указанный код в принятом ответе работает, при условии, что я не возвращаю ModelAndView, а List<Review>.

1 Ответ

2 голосов
/ 08 марта 2020

С помощью Ajax вызовов вы можете вызывать конечные точки контроллера, используя javascript. Один ajax вызов выглядит следующим образом:

function getReviews() {
$.ajax({
    type: "GET",
    url: "/users/findUserReviews", //example
    dataType: "JSON",
    success: function (data) {
        //do something with this JSON
        fillReviews(data);
    }
});
}

Теперь вы можете использовать эту функцию как on-click событие для вашей кнопки. А fillReviews() - это функция, которая получает элемент с id = "review" со страницы jsp и создает дерево списка с извлеченными данными.

function fillReviews(data) {
  var reviewDiv= document.getElementById('review');
  var reviewList = document.createElement('ul');
  for ( var i=0 ; i < data.length; i++)
    {
      var reviewListItem = createListItem(data[i]);
      reviewList.appendChild(reviewListItem);
    }
  reviewDiv.appendChild(reviewList);
}

И createListItem(data[i]) может выглядеть так это:

function createListItem(data)
{
  var listItem = document.createElement('li');
  listItem.innerHTML = data["reviewName"]; // for example ..
  return listItem;
}

И теперь все, что вам нужно сделать, это позвонить getReviews() здесь:

<button onclick="getReviews()"/>

РЕДАКТИРОВАТЬ : "данные" из ajax звонок JSON. Таким образом, "/ users / findUserReviews" должен возвращать List<Review>, например. И нет необходимости менять исходную конечную точку "/ findUserReviews". Это был только пример, вы можете создать новую конечную точку в вашем контроллере, которая возвращает список.

...