Как оптимизировать этот контроллер и Thymeleaf-View? - PullRequest
0 голосов
/ 18 июня 2019

Привет, мне нужно перенести бывшее приложение Typo3 / PHP в веб-приложение Spring Boot. Поэтому я извлек модель предметной области из базовой базы данных MySQL, которая работала относительно хорошо. В настоящее время приложение работает, но я совершенно не удовлетворен. Это мое первое приложение Spring Boot, и я немного недоволен моим текущим контроллером и представлением, потому что я думаю, что оно должно быть чище и лучше структурировано. Например, мне пришлось взять ключи ModelAttributes из схемы базы данных, и обмен на отдельные ModelAttributes кажется немного неуклюжим. Кроме того, данные в настоящее время отображаются только на одной странице, и я хочу переместить результаты поиска после обработки формы на страницу результатов. Я просмотрел примеры и попытался их реализовать, но мне не удалось отправить все данные на страницу результатов с помощью метода post. Я был бы очень рад пересмотру кода, чтобы я знал, нахожусь ли я на правильном пути и могу ли продолжать в том же духе.

Большое спасибо

Мой контроллер:

@Controller
public class WorkController {

private WorkServiceImpl workService;
private Logger logger = LoggerFactory.getLogger(WorkController.class);

public WorkController(WorkServiceImpl workService) {
    this.workService = workService;
}

@Data
public class WerksucheForm {
    private String selectedSearchTerm;
    private Integer selectedWorkTypeValue;
    private Integer selectedOriginalLanguageValue;
    private Integer selectedAuthenticityValue;
    private Integer selectedStartDate;
    private Integer selectedEndDate;

    public WerksucheForm() {

    }
}

@GetMapping(value = "/werksuche", consumes = MediaType.ALL_VALUE, produces = MediaType.ALL_VALUE)
public ModelAndView getWorksBySearchTerm(@ModelAttribute WerksucheForm extract, ModelAndView mv) {
    try {
        Integer startDate = extract.selectedStartDate;
        Integer endDate = extract.selectedEndDate;
        String searchTerm = extract.selectedSearchTerm;
        Integer type = extract.selectedWorkTypeValue;
        Integer language = extract.selectedOriginalLanguageValue;
        Integer authenticity = extract.selectedAuthenticityValue;
        mv.setViewName("werksuche");
        mv.getModel().put("searchResult", workService.findBySearchTerm(searchTerm));
        logger.info("Initial status of values:" + searchTerm + " " + type + " " + language + " " + authenticity + " " + startDate + " " + endDate);

        if (type != null || language != null || authenticity != null || startDate != null || endDate != null) {
            mv.getModel().put("searchResult", workService.findByFilter(searchTerm, type, language, authenticity, startDate, endDate));
        }
    } catch (NullPointerException e) {
        logger.error("SearchTerm is null: " + e);
    }
    mv.getModel().put("filter", new WerksucheForm());

    return mv;
}

@ModelAttribute("singleSelectAllWorkTypeValues")
public Map<Integer, String> getSingleSelectWorkTypeAllValues() {
    return new HashMap<Integer, String>() {
        {
            put(40, "Oper");
            put(10, "Ballett");
            put(60, "Sinfonie");
            put(30, "Triosonate");
            put(80, "Lied");
            put(70, "Arie");
        }
    };
}

@ModelAttribute("singleSelectAllOriginalLanguage")
public Map<Integer, String> getSingleSelectAllOriginalLanguageValues() {
    return new HashMap<Integer, String>() {
        {
            put(1, "Italienisch");
            put(2, "Französisch");
            put(3, "Deutsch");
        }
    };
}

@ModelAttribute("singleSelectAllAuthenticity")
public Map<Integer, String> getSingleSelectAllAuthenticityValues() {
    return new HashMap<Integer, String>() {
        {
            put(0, "Authentisch");
            put(3, "Zugeschrieben");
            put(4, "Zugeschrieben (Musik verschollen");
            put(2, "Zweifelhaft");
            put(1, "Fälschlich zugeordnet");
        }
    };
}
}

Связанный вид:

<body>
<h1 id="title">Werkverzeichnis</h1>

<div th:replace="fragments/navbar :: navbar">
</div>
<div th:replace="fragments/fixedSidebar:: fixedSidebar">
</div>

<form action="#" th:action="@{/werksuche}" th:object="${searchResult}" method="get">
    <div th:object="${filter}">
        <div class="form-group searchTerm">
            <h2>Werksuche</h2>
            <label for="search">Suchbegriffe</label>
            <input type="text" class="form-control" id="search" th:field="*{selectedSearchTerm}" />
        </div>
        <br/>
        <h4>Werkfilter</h4>
        <div class="form-group filterByWorkType">
            <label for="filterByWorktype">Werktyp</label>
            <select class="form-control" name="filter" id="filterByWorktype" th:field="*{selectedWorkTypeValue}">

                <option selected th:value="null"></option>
                <option th:each="dropdownValue: ${singleSelectAllWorkTypeValues}" th:value="${dropdownValue.getKey()}" th:text="${dropdownValue.getValue()}">
                </option>
            </select>
        </div>
        <br/>
        <div class="form-group filterByLanguage">
            <label for="filterByOriginalLanguage">Originalsprache</label>
            <select class="form-control" name="filter" id="filterByOriginalLanguage" th:field="*{selectedOriginalLanguageValue}">

                <option selected th:value="null"></option>
                <option th:each="dropdownvalue : ${singleSelectAllOriginalLanguage}" th:value="${dropdownvalue.getKey()}" th:text="${dropdownvalue.getValue()}">
                </option>
            </select>
        </div>
        <br/>
        <div class="form-group filterByAuthenticity">
            <label for="filterByAuthenticity">Authentizität</label>
            <select class="form-control" name="filter" id="filterByAuthenticity" th:field="*{selectedAuthenticityValue}">

                <option selected th:value="null"></option>
                <option th:each="dropdownvalue : ${singleSelectAllAuthenticity}" th:value="${dropdownvalue.getKey()}" th:text="${dropdownvalue.getValue()}">
                </option>
            </select>
        </div>
        <br/>
        <div class="form-group dateRange">
            <label for="fromToRange">Zeitliche Eingrenzung</label>
            <div id="fromToRange">
                <label for="startDate">von</label>
                <input type="text" class="form-control" id="startDate" th:field="*{selectedStartDate}">
                <label for="endDate">bis</label>
                <input type="text" class="form-control" id="endDate" th:field="*{selectedEndDate}">
            </div>
        </div>
        <input type="submit" class="btn btn-info" value="suchen" />
    </div>
    <div th:if="${not #lists.isEmpty(searchResult)}">
        <br/>
        <table id="resultTable">
            <tbody>
                <th:block th:each="result,iter : ${searchResult}">
                    <tr>
                        <td th:text="${iter.index+1}"></td>
                        <td th:text="${result.getTitle()}"></td>
                        <td th:utext="${result.getGenesis()}"></td>
                    </tr>
                </th:block>
            </tbody>
        </table>
    </div>
</form>

Вся бизнес-логика заключается в Службах и в основном состоит из спецификаций пружинных данных и критериев поиска. База данных содержит каталог произведений композитора и должна запрашиваться через фильтры.

1 Ответ

0 голосов
/ 18 июня 2019

Я попробовал это снова и получил это.Теперь результаты запроса отображаются на странице результатов после обработки формы.

@GetMapping(value = "/werksuche")
public String workSearchForm(Model model) {
    model.addAttribute("filter", new WerksucheForm());
    return "werksuche";
}

@PostMapping(value = "/werksuche")
public String submitForm(@Valid WerksucheForm extract, BindingResult bindingResult, 
Model model) {
    Integer startDate = extract.selectedStartDate;
    Integer endDate = extract.selectedEndDate;
    String searchTerm = extract.selectedSearchTerm;
    Integer type = extract.selectedWorkTypeValue;
    Integer language = extract.selectedOriginalLanguageValue;
    Integer authenticity = extract.selectedAuthenticityValue;
    if(bindingResult.hasErrors()) {
        return "werksuche";
    }
    model.addAttribute("searchResult",workService.findBySearchTerm(searchTerm));
    if (type != null || language != null || authenticity != null || startDate != null || endDate != null) {
        model.addAttribute("searchResult", workService.findByFilter(searchTerm, type, language, authenticity, startDate, endDate));
    }
    model.addAttribute("filter", new WerksucheForm());
    return "result";
}

POST перенаправляет данные на страницу результатов.

Есть ли что-то еще, что я мог бы сделать, чтобы уменьшить сложность?

...