[JAVA] Implementieren Sie die Bildeingabe / -ausgabe mit Spring MVC

Hier finden Sie Bilder zum Hochladen

Klicken Sie hier, um Bilder hochzuladen (https://qiita.com/shibafu/items/16dbf776bd81a40450fd)

Ein kleiner Umweg

Wenn Sie Spring und Ihre Komposition nicht kennen, denke ich, dass es ein Durcheinander ist, deshalb werde ich mein Projekt ein wenig erklären.

アーキテクチャ.png

Es hat eine solche Struktur. Auf den ** Controller ** wird zuerst auf diesen Server zugegriffen. Jede der darin enthaltenen Methoden akzeptiert den Zugriff.

** Service ** ist der Ort, an dem die eigentliche Verarbeitungsbeschreibung des Programms gespeichert wird. Werfen wir einen Blick auf den Inhalt des Dienstes. Architecture.png

Die ** Schnittstelle ** ist der Einstiegspunkt für Controller und andere Java-Programme in diesen Dienst. Und dies wird in einer Klasse namens hogehoge ** Impl ** implementiert. (Impl bedeutet "Implementierung".)

Warum ist es notwendig, die Verarbeitungsbeschreibung und den Eingang zu trennen? Sehen wir uns die Beschreibung an, die den Dienst tatsächlich aufruft

アーキテクチャ.png

Schauen Sie sich zuerst das Programm rechts an Es ist mit ** @ Service ** versehen. Dies bedeutet, dass dies eine "Class of Service" -Deklaration ist und gleichzeitig ** eine Instanz im DI-Container registriert **. ** DI-Container ** ist eine Funktion von Spring Framework, wodurch Java-Programme ** lose gekoppelt ** werden. Das Spring Framework steuert die Erstellung und Freigabe von Instanzen, die in den DI-Container eingegeben werden.

Was mich daran freut, ist, dass es auch dann kompiliert werden kann, wenn die Verarbeitung nicht implementiert ist. Werfen wir einen Blick auf den Serviceabruf auf der linken Seite.

** Schnittstelle ** Deklaration und Es ist mit ** @ Autowired ** versehen.

@Autowired ist ein Befehl zum Erstellen eines registrierten DI-Containers dieser Typinstanz (kann nicht verwendet werden, wenn zwei oder mehr Beans desselben Typs registriert sind).

Was Sie hier beachten sollten, ist, dass ** wir beim Erstellen der Instanz keine neuen verwenden **. Mit anderen Worten, es ist ein Programm, das nur mit einer leeren Klasse kompiliert werden kann, die als Schnittstelle bezeichnet wird.

Durch das Entwerfen der Schnittstelle ** 1. Ich kann mir vorstellen, welche Funktionen erstellt werden sollen ** ** 2. Es hat den Vorteil, dass es auch dann kompiliert werden kann, wenn die Funktion nicht implementiert ist **.

Die Struktur eines solchen Programms Es wird als ** Fassade (Vordereingang) ** Designmuster bezeichnet. (Genau genommen scheint es ein bisschen anders zu sein

Es ist so. Wenn Sie sich von nun an als Service bezeichnen, "Verarbeitung auf der Serviceseite" Wenn Sie es als Controller bezeichnen, lesen Sie es als "Oh, der erste Prozess, den der Server empfängt". Die Seite ist vorbei.

Das Hauptthema von hier

Registrieren Sie zunächst das Bild in der DB.

Erstellen Sie zunächst eine Bildeingabefunktion mit dem JPA-Repository. Dies ist genau das, also gibt es kein Problem.

Erstellen Sie zunächst einen Prozess, um das Bild in der Datenbank zu registrieren.

pictureServiceImpl.java


	@Autowired
	PictureMasterRepository pRepository;

	@Override
	public int addPicture(byte[] picturedata, String pictureName, String originalName, Integer uploadUserId) {
		//TODO automatisch generierter Methodenstub
		PictureMaster input = new PictureMaster();
		
		input.setPictureData(picturedata);
		input.setPictureName(pictureName);
		input.setOriginalName(originalName);
		input.setUploadUserId(uploadUserId);
		
		pRepository.saveAndFlush(input);
		
		return 0;

Erstellen Sie als Nächstes einen Prozess zum Lesen des Bildes. Erstellen wir den Zugriff auf die Datenbank mithilfe der automatischen Implementierungsfunktion des JPA-Repositorys.

PictureMasterRepository.java


@Repository
public interface PictureMasterRepository extends JpaRepository<PictureMaster, Integer> {


    public PictureMaster findByPictureId(Long pictureId);
    public PictureMaster findByPictureName(String pictureName);
    

    public List<PictureMaster> findByUploadUserId(int uploadUserId);
    
    //Suche nach "Gefällt mir"
//    public List<UserMaster> findByUsernameLike(String usernamename);
//    public List<UserMaster> findByEmailLike(String email);
    
//    @Query("SELECT count(*) From UserMaster u WHERE u.username = :username")
//    public int countByUsername(@Param("username")String username);
}

pictureServiceImpl.java


	/**
	 *Gibt ein registriertes Bild basierend auf dem Benutzernamen zurück
	 */
	@Override
	public List<PictureMaster> readUserPicture(Integer uploadUserId) {
		
	List<PictureMaster> searchResult = pRepository.findByUploadUserId(uploadUserId);
	
	return searchResult;
	
	}

Ich konnte eine bestimmte Verarbeitung durchführen ヾ (.> ﹏ <.) Nottater

Übergeben Sie dann den erstellten Prozess an die Steuerung.

ImageIOController.java



		ModelAndView mv = new ModelAndView("ImageView");
		List<PictureMaster> UserPicutres = pictureService.readUserPicture(LoginUser.getUserId());
		

Bisher haben wir über Java gesprochen. Übergeben wir die hier erhaltenen Daten an jsp!

Lesen auf der JSP-Seite

Übrigens verwenden der Controller und jsp ein Objekt namens Model, um Werte auszutauschen. Es ist ein bisschen anders als die Saite.

Verwenden wir jetzt die neueste Technologie. Das in der DB registrierte Bild besteht aus Binärdaten. Konvertieren Sie dies in BASE64.

BASE64 ist eine Codierungsmethode für den Austausch von Binärdaten mit hoher Geschwindigkeit im Web. Ersetzt Daten wie gewöhnliche Hexadezimalzahlen durch 64-Basis-Zeichendaten. Es ist aus Java8 implementiert, also lasst es uns verwenden.

ImageIOController.java


	@RequestMapping(value = "/imageView", method = RequestMethod.GET)
	public ModelAndView imageView(Principal principal) {
		
		//Anmeldeinformationen abrufen
        Authentication auth = (Authentication)principal;
        LoginUserDetails LoginUser = (LoginUserDetails)auth.getPrincipal();
		
		//Holen Sie sich das Bild zur Benutzerregistrierung
		ModelAndView mv = new ModelAndView("ImageView");
		List<PictureMaster> UserPicutres = pictureService.readUserPicture(LoginUser.getUserId());
		
		for(PictureMaster pict:UserPicutres) {
			//Holen Sie sich die Erweiterung
			pict.setExtension(pict.getOriginalName().substring(pict.getOriginalName().length() - 4, pict.getOriginalName().length()));
			//In BASE64 konvertieren
			pict.setBase64string(Base64.getEncoder().encodeToString(pict.getPictureData()));
			//Binärdaten löschen
			pict.setPictureData(null);
		}
		
		mv.addObject("UserName",LoginUser.getUsername());
		mv.addObject("UserPictures", UserPicutres);
		
		return mv;
	}

So was. Bitte beachten Sie die Kommentare für den Inhalt des Prozesses.

Lassen Sie uns die Verarbeitung auf der JSP-Seite erstellen.

ImageVire.html


<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<head>
<meta content="ja" http-equiv="Content-Language" />
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Bitte geben Sie Ihr Lieblingsbild für Meer oder Wasser ein</title>
</head>

<body>
<p>
${UserName}Es ist ein Bild, das von Herrn ヾ registriert wurde(¡>﹏<¡)Nein</p>
<c:forEach var="picture" items="${UserPictures}" varStatus="status">

	<p>${picture.pictureName}</p>
	<img src="data:image/${picture.extension};base64,${picture.base64string}">

</c:forEach>
</body>

</html>


Die Schleife wird mit dem üblichen ** c-Tag ** wiederholt. Der Punkt ist hier das -Tag.

Geben Sie die Erweiterung mit ** $ {picture.extension} ** an. ** base64, $ {picture.base64string} ** gibt die base64-Binärdatei an.

Mit anderen Worten, die tatsächliche HTML-Ausgabe sieht folgendermaßen aus.

ImageView.html


<img src="data:image/${picture.extension};base64,${picture.base64string}">

Lauf

Lass uns rennen

image.png

Ich konnte das registrierte Bild so anzeigen.

Referenz So binden Sie ein Bild mit Base64 direkt in eine HTML-Datei ein Ich möchte wissen, wie ein Bild oder eine Datei (pdf usw.) in JSP eingegeben, in der Datenbank registriert, aufgerufen und auf dem Bildschirm angezeigt wird.

Recommended Posts

Implementieren Sie die Bildeingabe / -ausgabe mit Spring MVC
Geben Sie einfach Bilder mit Spring MVC ein und geben Sie sie aus
Implementieren Sie den Dateidownload mit Spring MVC
Ich habe versucht, das Hochladen von Dateien mit Spring MVC zu implementieren
Java-Konfiguration mit Spring MVC
Implementieren Sie GraphQL mit Spring Boot
Implementieren Sie CRUD mit Spring Boot + Thymeleaf + MySQL
Schreiben wir die Eingabe / Ausgabe von Java-Dateien mit NIO
Versuchen Sie, die Anmeldefunktion mit Spring Boot zu implementieren
[Frühling] Implementieren Sie das Eingabeformular (Eingabebildschirm ⇒ Bestätigungsbildschirm ⇒ Abschlussbildschirm)
Beispiel für die Ausgabe eines Parameterprotokollprotokolls Java & Spring MVC
[Implementierungsverfahren] Implementieren Sie die Funktion zum Hochladen von Bildern mit Active Storage
Verwendungshinweis zu Spring Security: Zusammenarbeit mit Spring MVC und Boot
Implementieren Sie eine einfache Rest-API mit Spring Security mit Spring Boot 2.0
Feder mit Kotorin --5 Aktuator
Selbstgemachte Validierung mit Spring
Frühling mit Kotorin ―― 1. SPRING INITIALIZR
Mit Spring Boot herunterladen
FizzBuzz mit Stream ausgeben
MOCKEN Sie die Konstruktoren anderer Klassen mit Spring MVC + PowerMock + Junit
Geben Sie das integrierte Tomcat-Zugriffsprotokoll mit Spring Boot an die Standardausgabe aus
Implementieren Sie die REST-API mit Spring Boot und JPA (Application Layer).
Implementieren Sie die REST-API mit Spring Boot und JPA (Infrastructure Layer).
Fluss bis zur Ausgabe von Tabellendaten, die mit Spring Boot angezeigt werden sollen
So erhalten Sie eine leere Anfrage mit Spring Web MVC @RequestBody
Implementieren Sie die REST-API mit Spring Boot und JPA (Domain Layer Edition).
Implementieren Sie eine einfache Rest-API mit Spring Security & JWT mit Spring Boot 2.0
[Java] Ich möchte Standardeingabe und Standardausgabe mit JUnit testen