Создание проекта Spring Boot с использованием Maven

#java #maven #jsp #model-view-controller #spring-boot

#java #maven #jsp #модель-представление-контроллер #spring-boot

Вопрос:

Обновить:

Спасибо всем за ваш ответ. У меня все еще есть проблемы, так как он не возвращает результат, на который я надеялся. Это проблема с размещением файлов? Они организованы следующим образом: i63.tinypic.com/2by8g2.png

Еще раз заранее спасибо.


Я изучаю, чтобы создать веб-приложение с использованием Spring Boot и JDBC (без JPA); У меня возникает несколько проблем с этим. Я не понимаю, как правильно создать контроллер и как заставить его возвращать нужные мне страницы .jsp. Я искал много-много решений, но просто не могу найти подходящее. Это мой pom.xml:

     <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>---myprojectname</groupId>
    <artifactId>tesieasy</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>tesieasy</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.1.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>
 

Мое приложение.свойства:

 > spring.h2.console.enabled=true
server.port=8000
spring.view.prefix=/WEB-INF/jsp/
spring.view.suffix=.jsp
 

Мой ServetInizializer:

 import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(TesieasyApplication.class);
    }

}
 

Моя сущность:

 import java.util.Date;
import java.text.SimpleDateFormat;

public class Journal {

    private Long id;
    private String title;
    private Date created;
    private String summary;
    private SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");

    /** costruttori**/
    public Journal() {}

    public Journal(Long id, String title, String summary, Date date){
        this.id = id;
        this.title = title;
        this.summary = summary;
        this.created = date;
    }

    /** getters and setters omitted **/
 

My service:

 import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

import name of my package-.entity.Journal;


@Service
public class JournalService {
    private static final Logger log = LoggerFactory.getLogger(JournalService.class);

    @Autowired
    JdbcTemplate jdbcTemplate;

    public void insertData() {
        log.info("> Table creation");
        jdbcTemplate.execute("DROP TABLE JOURNAL IF EXISTS");
        jdbcTemplate
                .execute("-cut for brevity-");
        log.info("> Done.");
    }

    public List<Journal> findAll() {
        List<Journal> entries = new ArrayList<>();
        jdbcTemplate
                .query("SELECT * FROM JOURNAL",
                        new Object[] {}, (rs, row) -> new Journal(rs.getLong("id"), rs.getString("title"),
                                rs.getString("summary"), new Date(rs.getTimestamp("created").getTime())))
                .forEach(entry -> entries.add(entry));
        return entries;

    }

        public int countEntries() {
        int rowCount = this.jdbcTemplate.queryForObject("SELECT count(*) FROM JOURNAL", Integer.class);
        return rowCount;

    }

    public Journal insertJournal() {
        Journal journal = null;
        this.jdbcTemplate.update(
                -cut for brevity-");
        return journal;

    }
}
 

Одна из моих страниц .jsp:

     <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>A title</title></head>
<body>
Hello! JSP is working fine!
</body>
</html>
 

И, наконец, мой контроллер:

 import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import *my package name.entity.Journal;
import *my package name.service.JournalService;

@RestController
public class HelloController {

    @Autowired
    private JournalService journalService;

    @RequestMapping(value="/")
    public String home() {
    return "home";
    }

    @RequestMapping("/greeting")
    public String greeting() {
        return "greeting";
    }


    @RequestMapping("/findAll")
    public String index() {
        List<Journal> all;
        all = journalService.findAll();
        return all.toString();
    }

    @RequestMapping("/count")
    public int countElements() {
        int count;
        count = journalService.countEntries();
        return count;
    }

    @RequestMapping("/insert")
    public Journal insertElements() {
        Journal insert;
        insert = journalService.insertJournal();
        return insert;
    }

}
 

Что я понял:

  • Мне не нужен web.xml файл
  • Как подключить службу к контроллеру (даже если мой метод findAll возвращает мои данные в {}, и я должен понять, как правильно их записать)

Чего я не понимаю:

  • Почему он неправильно ссылается на мои страницы JSP — что мне нужно?
  • Нужны ли мне модель и представление?

Я надеюсь, что вы можете дать мне несколько советов и / или несколько примеров, подходящих для моей области. Заранее спасибо и с наилучшими пожеланиями!

Комментарии:

1. @RestController не следует использовать для возврата представления. Хотя могут быть средства для возврата view с его использованием, в корне это неверно.

Ответ №1:

Решение:

Шаг 1: измените @RestController на @Controller

Шаг 2: для URL-адреса, который вы хотите вернуть в виде (например, greeting.jsp)

 @RequestMapping("/greeting")
public String greeting() {
    return "greeting";
}
 

Шаг 3: для URL, который вы хотите вернуть в качестве объекта JSON, нет представления (возможно, вызов AJAX)

 @RequestMapping("/findAll")
@ResponseBody
public List<Journal> index() {
    List<Journal> all = journalService.findAll()
    return all;
}
 

ИЛИ это

 @RequestMapping("/findAll")
@ResponseBody
public Model index(Model model) {
    List<Journal> all =journalService.findAll();
    model.addAttribute("journalList", all);
    return model;
}
 

Шаг 4: для URL-адреса, который вам нужен для представления и модели (например, объект Java)

пример кода ref Rob Baily

 @RequestMapping("/findAll")
public String index(Model model) {
    List<Journal> all;
    all = journalService.findAll();
    model.addAttribute("journalList", all);
    return "listall";
}
 

и вы можете получить доступ к объекту в вашем listall.jsp с помощью ${journalList}

Объяснение: Когда вы используете @RestController в своем классе, это эквивалентно добавлению @ResponseBody для каждого метода в вашем классе. Таким образом, он всегда будет возвращать object.toString() на странице, а не ссылаться на ваш JSP.

В этом коде используется новая аннотация Spring 4 @RestController, которая помечает класс как контроллер, где каждый метод возвращает объект домена вместо представления. Это сокращение для @Controller и @ResponseBody, объединенных вместе. ссылка: https://spring.io/guides/gs/rest-service /

ссылка на образец jsp: https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-web-jsp

Комментарии:

1. Спасибо за ваш ответ. У меня все еще есть проблемы, поскольку он не возвращает результат, на который я надеялся. Это проблема с размещением файлов? Они организованы следующим образом: i63.tinypic.com/2by8g2.png

2. привет, Тина, я не могу просмотреть ссылку (не знаю почему). согласно вашему файлу application.properties, ваш jsp должен находиться в webapp/WEB-INF/jsp/{MyPage}.jsp . Если получить доступ к URL: localhost:8080/greeting , он будет искать WEB-INF/jsp/greeting.jsp .

Ответ №2:

Как указано в комментарии, RestController неверен, если вы хотите вернуть представление для отображения. RestController возвращает объект как JSON, а не идентификатор представления, который используется для AJAX-запросов. Просто используйте аннотацию контроллера, если вы хотите вернуть представление.

Вам не нужно представление, поскольку оно должно перенаправлять возвращаемое значение на страницу JSP. Если вы хотите использовать теги JSP, то да, вам понадобится модель, и вам нужно будет добавить объекты к вашему объекту модели. Смотрите пример ниже. Первый метод должен перейти в welcome.jsp и не иметь доступной модели. Второй метод должен перейти к listall.jsp и сделать атрибут journalList доступным для использования в тегах JSP.

 @Controller
 public class ApplicationController {
    @RequestMapping("/")
    public String index() {
        return "welcome";
    }

    @RequestMapping("/findAll")
    public String index(Model model) {
        List<Journal> all;
        all = journalService.findAll();
        model.addAttribute("journalList", all);
        return "listall";
    }
}