Java >> Java opplæring >  >> Tag >> Spring

Eksempel på opplasting av vår MVC-fil

Med denne opplæringen skal vi forklare hvordan man gir brukerne muligheten til å laste opp en fil, i et skjema i Spring MVC. Når du oppretter og sender inn et skjema, er det svært vanlig å laste opp en fil under innsending av skjema. Dette kan oppnås veldig enkelt ved bruk av Spring MVC API.

Dette eksemplet inneholder en enkel klasse, som er MVC-modellen og har én egenskap, som skal brukes som filen som skal lastes opp. Det er også en validator for feltet, som vil bli brukt til å sjekke om filen som er lastet opp er større enn null. Det er endelig en enkel visning som inneholder et skjema med mulighet for å laste opp en fil.

Tips
Du kan hoppe over hvordan prosjektoppretting og hoppe direkte til begynnelsen av eksemplet under.

Vårt foretrukne utviklingsmiljø er Eclipse. Vi bruker Eclipse Juno (4.2) versjon, sammen med Maven Integration plugin versjon 3.1.0. Du kan laste ned Eclipse herfra og Maven Plugin for Eclipse herfra. Installasjonen av Maven-plugin for Eclipse er utenfor omfanget av denne opplæringen og vil ikke bli diskutert. Vi bruker også JDK 7_u_21. Tomcat 7 er applikasjonsserveren som brukes.

La oss begynne,

1. Opprett et nytt Maven-prosjekt

Gå til Fil -> Prosjekt ->Maven -> Maven Project.

Nytt Maven-prosjekt – trinn 1

På siden "Velg prosjektnavn og plassering" i veiviseren må du sørge for at alternativet "Opprett et enkelt prosjekt (hopp over arketypevalg)" er ikke avmerket , trykk "Neste" for å fortsette med standardverdier.

Nytt Maven-prosjekt - trinn 2

Her må maven-arketypen for å lage en webapplikasjon legges til. Klikk på «Legg til arketype» og legg til arketypen. Sett «Arketype Group Id»-variabelen til "org.apache.maven.archetypes" , «Arketype artefakt Id»-variabelen til "maven-archetype-webapp" og "Arketypeversjon" til "1.0" . Klikk på “OK” for å fortsette.

Legg til Maven-arketype

På siden "Skriv inn en artefakt-ID" i veiviseren kan du definere navnet og hovedpakken til prosjektet ditt. Sett «Group Id»-variabelen til "com.javacodegeeks.snippets.enterprise" og «Artifact Id»-variabelen til "springexample" . De nevnte valgene utgjør hovedprosjektpakken som "com.javacodegeeks.snippets.enterprise.springexample" og prosjektnavnet som "springexample" . Sett «Package»-variabelen til "war" , slik at det opprettes en krigsfil som skal distribueres til tomcat-serveren. Trykk "Fullfør" for å avslutte veiviseren og for å lage prosjektet ditt.

Konfigurer Maven-prosjektet

Maven-prosjektstrukturen er vist nedenfor:

Ny prosjektstruktur

    Den består av følgende mapper:
  • /src/main/java-mappen, som inneholder kildefiler for det dynamiske innholdet i applikasjonen,
  • /src/test/java-mappen inneholder alle kildefiler for enhetstester,
  • /src/main/resources-mappen inneholder konfigurasjonsfiler,
  • /target-mappen inneholder de kompilerte og pakkede leveransene,
  • /src/main/resources/webapp/WEB-INF-mappen inneholder distribusjonsbeskrivelsene for nettapplikasjonen ,
  • pom.xml er Project Object Model-filen (POM). Enkeltfilen som inneholder all prosjektrelatert konfigurasjon.

2. Legg til Spring-MVC-avhengigheter

Legg til avhengighetene i Mavens pom.xml fil, ved å redigere den på "Pom.xml"-siden i POM-redigeringsprogrammet. Avhengigheten som trengs for MVC er spring-webmvc pakke. javax.validation og hibernate-validator pakker vil også bli brukt her for validering. commons-io og commons-fileupload pakker brukes til å laste opp filen.

pom.xml

<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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.javacodegeeks.snippets.enterprise</groupId>
	<artifactId>springexample</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>springexample Maven Webapp</name>
	<url>http://maven.apache.org</url>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
		</dependency>
		<dependency>
			<groupId>javax.validation</groupId>
			<artifactId>validation-api</artifactId>
			<version>1.1.0.Final</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>5.1.0.Final</version>
		</dependency>
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.4</version>
		</dependency>
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.1</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
	</dependencies>
	<build>
		<finalName>springexample</finalName>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
					<fork>true</fork>
					<executable>${JAVA_HOME}/bin/javac</executable>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-assembly-plugin</artifactId>
				<version>2.3</version>
			</plugin>
		</plugins>
	</build>

	<properties>
		<spring.version>3.2.9.RELEASE</spring.version>
	</properties>
</project>	

3. Lag modellen

File.java er en enkel Java-klasse, med en egenskap kalt felt, Dette feltet er en org.springframework.web.multipart.MultipartFile , som er en representasjon av en opplastet fil mottatt i en flerdelt forespørsel. Den har gettere og settere, slik at den er tilgjengelig fra utsikten.

File.java

package com.javacodegeeks.snippets.enterprise.fileupload.model;

import org.springframework.web.multipart.MultipartFile;

public class File {
		 
		MultipartFile file;
		
		public MultipartFile getFile() {
			return file;
		}

		public void setFile(MultipartFile file) {
			this.file = file;
		}		
}

4. Opprett en validator

Validatoren som er opprettet her, sjekker om det er lastet opp en fil. Den sjekker spesifikt størrelsen på filen og om den er lik zero , så gjengis en valideringsmelding i visningen.

For å lage en valideringsklasse bruker vi API-en fra Spring MVC. FileValidator.java nedenfor implementerer org.springframework.validation.Validator , og overstyrer de to metodene den gir.

boolean supports(Class<?> paramClass) metoden brukes til å sjekke om validatoren kan validere forekomster av paramClass .

I validate(Object obj, Errors errors) metode, er en forekomst av klassen gitt, og en Errors gjenstand. org.springframework.validation.ValidationUtils brukes her, siden den tilbyr validerings-API-metoder for å sjekke feltene til objektet. Så i denne metoden kan vi sjekke om filstørrelsen er lik null. Alle feilmeldinger sendes i error gjenstand. En properties fil med feilmeldinger brukes her for å sende ulike valideringsmeldinger til errors objekt som vist nedenfor:

FileValidator.java

package com.javacodegeeks.snippets.enterprise.fileupload.validator;

import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

import com.javacodegeeks.snippets.enterprise.fileupload.model.File;

public class FileValidator implements Validator {
	public boolean supports(Class<?> paramClass) {
		return File.class.equals(paramClass);
	}

	public void validate(Object obj, Errors errors) {
		File file = (File) obj;
		  if (file.getFile().getSize() == 0) {
		   errors.rejectValue("file", "valid.file");
		  }
	}
}

validation.properties filen nedenfor er filen som inneholder feilmeldingen.

validation.properties

valid.file= Please select a file!

5. Opprett kontrolleren

Controller er der DispatcherServlet vil delegere forespørsler. @Controller annotering indikerer at klassen tjener rollen som en kontroller. @RequestMapping merknad brukes til å kartlegge en URL til enten en hel klasse eller en bestemt behandlermetode.

En org.springframework.validation.Validator injiseres her, via @Autowired merknad, også ved å bruke @Qualifier merknad for å spesifisere at FileValidator.java implementering av org.springframework.validation.Validator klasse injiseres.

@InitBinder merknad i initBinder(WebDataBinder binder) metoden lar oss konfigurere nettdatabinding direkte i kontrolleren. Med @InitBinder vi kan initialisere WebDataBinder , som brukes for databinding fra nettforespørselsparametere til JavaBean-objekter. Her er WebDataBinder er der validatoren er satt.

Kontrolleren består av to grunnleggende metoder, en GET-metode, som er String initForm(Model model) og en POST-metode, som er String submitForm(Model model, @Validated File file, BindingResult result) . Den første metoden oppretter og går tilbake til "file" se en ny forekomst av File.java klasse. Den andre metoden får også Model , og File objekt opprettet, som nå har den opplastede filen i filparameteren. File er merket med @Validated merknad, som gjør at filobjektet kan valideres med validatoren. BindingResult er der alle valideringsfeil sendes automatisk, slik at den kan brukes til å bestemme neste navigasjonstrinn. Hvis det ikke er noen feil, er valideringen vellykket, så metoden returnerer strengrepresentasjonen av successFile.jsp side, og filobjektet sendes til Model . Ellers er den returnerte strengen strengrepresentasjonen av file.jsp side, som også har feilmeldingene, som vil bli vist nedenfor.

FileController.java

package com.javacodegeeks.snippets.enterprise.fileupload;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResu<
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;

import com.javacodegeeks.snippets.enterprise.fileupload.model.File;
import com.javacodegeeks.snippets.enterprise.fileupload.validator.FileValidator;

@Controller
@RequestMapping("/file.htm")
public class FileController {

	@Autowired
	FileValidator validator;

	@InitBinder
	private void initBinder(WebDataBinder binder) {
		binder.setValidator(validator);
	}

	@RequestMapping(method = RequestMethod.GET)
	public String getForm(Model model) {
		File fileModel = new File();
		model.addAttribute("file", fileModel);
		return "file";
	}

	@RequestMapping(method = RequestMethod.POST)
	public String fileUploaded(Model model, @Validated File file,
			BindingResult result) {

		String returnVal = "successFile";
		if (result.hasErrors()) {
			returnVal = "file";
		} else {			
			MultipartFile multipartFile = file.getFile();
		}
		return returnVal;
	}
}

6. Opprett visningen for å laste opp filen

Visningen nedenfor er et enkelt eksempel på hvordan du lager et skjema der en fil kan lastes opp. Det er en enkel html-visning som består av head og body html-koder.

For å lage et skjema i Spring MVC bruker vi form:form stikkord. Det er method egenskapen er satt til POST, og commandName egenskapen er satt til navnet på støttebønnen som er bundet til modellen, som er File.java klasse.

Inne i form:form -taggen bruker vi enctype="multipart/form-data" attributt, som lar nettleseren vite hvordan den koder skjemaet som flerdelt forespørsel.

input tag med type egenskap satt til file brukes til å plassere den opplastede filen. form:errors kode definerer hvor feilmeldingen for det angitte feltet skal vises i visningen. Til slutt, input tag, med type egenskap satt til upload brukes for opplastingsknappen.

file.jsp

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<html>
 
<body> 

<h2>Spring MVC - Uploading a file.. </h2>
	<form:form method="POST" commandName="file"	enctype="multipart/form-data">
 
		Upload your file please: 
		<input type="file" name="file" />
		<input type="submit" value="upload" />
		<form:errors path="file" cssStyle="color: #ff0000;" />
	</form:form>
 
</body>
</html>

Nedenfor er siden som vil bli gjengitt når filopplastingen lykkes:

successFile.jsp

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form">
<html>
<body>
<h2>Spring MVC - Uploading a file.. </h2>
Your file is successfully uploaded.
</body>
</html>

7. Konfigurer applikasjonen

Filene som vi må konfigurere i applikasjonen er web.xml filen og mvc-dispatcher-servlet.xml fil.

web.xml fil er filen som definerer alt om applikasjonen som en server trenger å vite. Den er plassert i /WEB-INF/ katalogen til applikasjonen. <servlet> element erklærer DispatcherServlet . Når DispatcherServlet er initialisert, vil rammeverket prøve å laste applikasjonskonteksten fra en fil kalt [servlet-name]-servlet.xml ligger i /WEB-INF/ katalog. Så vi har laget mvc-dispatcher-servlet.xml fil, som vil bli forklart nedenfor. <servlet-mapping> element av web.xml filen spesifiserer hvilke URL-er som skal håndteres av DispatcherServlet .

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Archetype Created Web Application</display-name>
 
	<servlet>
		<servlet-name>mvc-dispatcher</servlet-name>
		<servlet-class>
			org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
 
	<servlet-mapping>
		<servlet-name>mvc-dispatcher</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping> 
</web-app>


mvc-dispatcher-servlet.xml filen er også plassert i WebContent/WEB-INF katalog. org.springframework.web.servlet.view.InternalResourceViewResolver bean brukes som intern ressursvisningsløser, noe som betyr at den vil finne jsp og html filer i WebContent/WEB-INF/ mappe. Vi kan også angi egenskaper som prefix eller suffix til visningsnavnet for å generere den endelige visningssidens URL. Dette er filen der alle bønner som er opprettet, for eksempel kontroller, plasseres og defineres.

<context:component-scan> taggen brukes, slik at Spring-beholderen vil søke etter alle kommenterte klasser under com.javacodegeeks.snippets.enterprise pakke. <mvc:annotation-driven> taggen brukes, slik at beholderen søker etter kommenterte klasser, for å løse MVC. FileValidator.java klasse er også definert her som en bønne, med en id.

org.springframework.web.multipart.commons.CommonsMultipartResolver er også definert her som en bønne. Denne klassen er nødvendig fordi det er resolveren aktivert av Spring DispatcherServlet å overlevere filopplastingsforespørselen.

Til slutt, ResourceBundleMessageSource brukes for å gi tilgang til ressurspakker ved bruk av spesifiserte basenavn. Det er basename egenskapen er satt til validation , og peker dermed til egenskapsfilen som inneholder valideringsmeldingene.

mvc-dispatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

	<context:component-scan base-package="com.javacodegeeks.snippets.enterprise" />
	<mvc:annotation-driven />

	<bean id="fileValidator"
		class="com.javacodegeeks.snippets.enterprise.fileupload.validator.FileValidator" />

	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />

	<bean id="messageSource"
		class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basename" value="validation" />
	</bean>

	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix">
			<value>/WEB-INF/</value>
		</property>
		<property name="suffix">
			<value>.jsp</value>
		</property>
	</bean>

</beans>	

8. Kjør programmet

La oss nå kjøre applikasjonen. Vi bygger først prosjektet med Maven. Alt vi trenger å gjøre er å høyreklikke på prosjektet og velge -> Kjør som:Maven build . Målet må settes til å pakke. .war filen produsert må plasseres i webapps mappe av tomcat. Deretter kan vi starte serveren.

Trykk på:

http://localhost:8080/springexample/file.htm

Trykk så på opplastingsknappen før du har valgt en fil.

opplastingsvalideringsfeil

Som du kan se, vises valideringsmeldingen, siden ingen fil har blitt lastet opp ennå.
Bla nå gjennom på datamaskinen din og velg en fil å laste opp:

vellykket opplasting

Som et resultat av successFile.jsp visningen er gjengitt.

9. Last ned Eclipse Project

Dette var et eksempel på hvordan du laster opp en fil i Spring MVC.mvc spring

Java Tag