Uruchomienie Hello World w Spring

0

Próbuje odpalić po raz chyba 40-ty Hello Worlda w Springu MVC i nie udało mi się jeszcze ani razu. Chciałbym się nauczyć tego frameworka ale jak mam to zrobić, kiedy marnuje dzień za dniem na głupiego Hello Worlda, który nie dość, że nic nie robi, to nie jeszcze nie działa. Proszę o wskazanie gdzie jest błąd, albo poratowanie jakimś dobrym tutorialem w którym wszystko działa.. (chociaż przeleciałem ich już full..):

package info.mike;

@EnableWebMvc
@ComponentScan(basePackages = "info.mike")
@Configuration
public class SpringConfig extends WebMvcConfigurerAdapter {
	
	@Bean
	public ViewResolver viewResolver() {
		InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
		viewResolver.setViewClass(JstlView.class);
		viewResolver.setPrefix("/WEB-INF/pages/");
		viewResolver.setSuffix(".jsp");
		
		return viewResolver;
		
	}
	
	@Override
	public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
		configurer.enable();
	}

}


package info.mike;

public class WebServletConfiguration implements WebApplicationInitializer {

	public void onStartup(ServletContext arg0) throws ServletException {
		AnnotationConfigWebApplicationContext webCtx = new AnnotationConfigWebApplicationContext();
		webCtx.register(SpringConfig.class);
		webCtx.setServletContext(arg0);
		ServletRegistration.Dynamic servlet = arg0.addServlet("dispatcher", new DispatcherServlet(webCtx));
		servlet.setLoadOnStartup(1);
		servlet.addMapping("/");
	}
}


package info.mike;

@Controller
public class GreatController {
	
	@RequestMapping(path = "/greet/{name}", method = RequestMethod.GET)
	public String greet(@PathVariable String name, ModelMap model) {
		
		String greet = "Hello " + name;
		model.addAttribute("greet", greet);
		
		return greet;	
	}

}

<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>info.mike</groupId>
	<artifactId>info.mike</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>4.3.0.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>4.3.0.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.0.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-expression</artifactId>
			<version>4.3.0.RELEASE</version>
		</dependency>
	</dependencies>
	<build>
		<finalName>HelloWorld</finalName>
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-compiler-plugin</artifactId>
					<version>2.3.2</version>
					<configuration>
						<source>1.7</source>
						<target>1.7</target>
					</configuration>
				</plugin>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-war-plugin</artifactId>
					<version>2.4</version>
					<configuration>
						<warSourceDirectory>src/main/webapp</warSourceDirectory>
						<warName>SpringWebExample</warName>
						<failOnMissingWebXml>false</failOnMissingWebXml>
					</configuration>
				</plugin>
			</plugins>
		</pluginManagement>
	</build>
</project>
lis 04, 2017 9:33:59 PM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:test' did not find a matching property.
lis 04, 2017 9:33:59 PM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:mates' did not find a matching property.
lis 04, 2017 9:33:59 PM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:04072017' did not find a matching property.
lis 04, 2017 9:33:59 PM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:HelloW' did not find a matching property.
lis 04, 2017 9:33:59 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server version:        Apache Tomcat/8.5.8
lis 04, 2017 9:33:59 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server built:          Nov 3 2016 21:14:13 UTC
lis 04, 2017 9:33:59 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server number:         8.5.8.0
lis 04, 2017 9:33:59 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Name:               Windows 8.1
lis 04, 2017 9:33:59 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Version:            6.3
lis 04, 2017 9:33:59 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Architecture:          amd64
lis 04, 2017 9:33:59 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Java Home:             D:\Program Files\Java\jdk1.8.0_101\jre
lis 04, 2017 9:33:59 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Version:           1.8.0_101-b13
lis 04, 2017 9:33:59 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Vendor:            Oracle Corporation
lis 04, 2017 9:33:59 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_BASE:         C:\Users\Michał\Documents\workspace-sts-3.8.2.RELEASE\.metadata\.plugins\org.eclipse.wst.server.core\tmp0
lis 04, 2017 9:33:59 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_HOME:         C:\Program Files\Apache Software Foundation\Tomcat 8.5
lis 04, 2017 9:33:59 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.base=C:\Users\Michał\Documents\workspace-sts-3.8.2.RELEASE\.metadata\.plugins\org.eclipse.wst.server.core\tmp0
lis 04, 2017 9:33:59 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.home=C:\Program Files\Apache Software Foundation\Tomcat 8.5
lis 04, 2017 9:33:59 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dwtp.deploy=C:\Users\Michał\Documents\workspace-sts-3.8.2.RELEASE\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
lis 04, 2017 9:33:59 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Djava.endorsed.dirs=C:\Program Files\Apache Software Foundation\Tomcat 8.5\endorsed
lis 04, 2017 9:33:59 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dfile.encoding=Cp1250
lis 04, 2017 9:33:59 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: D:\Program Files\Java\jdk1.8.0_101\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;d:/program files/java/jdk1.8.0_101/bin/../jre/bin/server;d:/program files/java/jdk1.8.0_101/bin/../jre/bin;d:/program files/java/jdk1.8.0_101/bin/../jre/lib/amd64;c:\program files\microsoft mpi\bin\;"d:\program files\java\jdk1.8.0_101\bin";c:\programdata\oracle\java\javapath;c:\program files (x86)\intel\icls client\;c:\program files\intel\icls client\;c:\windows\system32;c:\windows;c:\windows\system32\wbem;c:\windows\system32\windowspowershell\v1.0\;c:\program files (x86)\windows live\shared;c:\program files (x86)\intel\opencl sdk\2.0\bin\x86;c:\program files (x86)\intel\opencl sdk\2.0\bin\x64;c:\program files\intel\intel(r) management engine components\dal;c:\program files\intel\intel(r) management engine components\ipt;c:\program files (x86)\intel\intel(r) management engine components\dal;c:\program files (x86)\intel\intel(r) management engine components\ipt;c:\program files (x86)\delphi7se\bin;c:\program files (x86)\delphi7se\projects\bpl;c:\program files (x86)\quicktime\qtsystem\;c:\program files (x86)\skype\phone\;d:\program files\java\jdk1.8.0_101\bin;d:\apache-maven-3.3.9-bin\apache-maven-3.3.9\bin;c:\program files (x86)\microsoft sql server\130\tools\binn\;c:\program files\microsoft sql server\130\tools\binn\;c:\program files (x86)\microsoft sql server\130\dts\binn\;c:\program files\microsoft sql server\130\dts\binn\;c:\program files\microsoft sql server\client sdk\odbc\130\tools\binn\;c:\program files (x86)\microsoft sql server\client sdk\odbc\130\tools\binn\;c:\program files (x86)\microsoft sql server\130\tools\binn\managementstudio\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;;C:\Program Files\Microsoft VS Code\bin;C:\Users\Michał\Desktop\spring-tool-suite-3.8.2.RELEASE-e4.6.1-win32-x86_64\sts-bundle\sts-3.8.2.RELEASE;;.
lis 04, 2017 9:33:59 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8080"]
lis 04, 2017 9:33:59 PM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
lis 04, 2017 9:33:59 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-nio-8009"]
lis 04, 2017 9:33:59 PM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
lis 04, 2017 9:33:59 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 871 ms
lis 04, 2017 9:33:59 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
lis 04, 2017 9:33:59 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/8.5.8
lis 04, 2017 9:34:01 PM org.apache.jasper.servlet.TldScanner scanJars
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
lis 04, 2017 9:34:01 PM org.apache.catalina.core.ApplicationContext log
INFO: No Spring WebApplicationInitializer types detected on classpath
lis 04, 2017 9:34:02 PM org.apache.jasper.servlet.TldScanner scanJars
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
lis 04, 2017 9:34:02 PM org.apache.catalina.core.ApplicationContext log
INFO: No Spring WebApplicationInitializer types detected on classpath
lis 04, 2017 9:34:04 PM org.apache.jasper.servlet.TldScanner scanJars
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
lis 04, 2017 9:34:04 PM org.apache.catalina.core.ApplicationContext log
INFO: Spring WebApplicationInitializers detected on classpath: [com.websystique.springsecurity.configuration.SpringMvcInitializer@559087ca, com.websystique.springsecurity.configuration.SecurityWebApplicationInitializer@5eea2d34]
lis 04, 2017 9:34:04 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
lis 04, 2017 9:34:04 PM org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext: initialization started
lis 04, 2017 9:34:04 PM org.springframework.web.context.support.AnnotationConfigWebApplicationContext prepareRefresh
INFO: Refreshing Root WebApplicationContext: startup date [Sat Nov 04 21:34:04 CET 2017]; root of context hierarchy
lis 04, 2017 9:34:04 PM org.springframework.web.context.support.AnnotationConfigWebApplicationContext loadBeanDefinitions
INFO: Registering annotated classes: [class com.websystique.springsecurity.configuration.HelloWorldConfiguration]
lis 04, 2017 9:34:05 PM org.springframework.web.context.ContextLoader initWebApplicationContext
SEVERE: Context initialization failed
java.lang.NoSuchMethodError: org.springframework.expression.spel.SpelParserConfiguration.<init>(Lorg/springframework/expression/spel/SpelCompilerMode;Ljava/lang/ClassLoader;)V
	at org.springframework.context.expression.StandardBeanExpressionResolver.<init>(StandardBeanExpressionResolver.java:98)
	at org.springframework.context.support.AbstractApplicationContext.prepareBeanFactory(AbstractApplicationContext.java:553)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:455)
	at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4725)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5189)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1404)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1394)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)

lis 04, 2017 9:34:05 PM org.apache.catalina.core.StandardContext listenerStart
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
java.lang.NoSuchMethodError: org.springframework.expression.spel.SpelParserConfiguration.<init>(Lorg/springframework/expression/spel/SpelCompilerMode;Ljava/lang/ClassLoader;)V
	at org.springframework.context.expression.StandardBeanExpressionResolver.<init>(StandardBeanExpressionResolver.java:98)
	at org.springframework.context.support.AbstractApplicationContext.prepareBeanFactory(AbstractApplicationContext.java:553)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:455)
	at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4725)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5189)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1404)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1394)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)

lis 04, 2017 9:34:05 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: One or more listeners failed to start. Full details will be found in the appropriate container log file
lis 04, 2017 9:34:05 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: Context [/04072017] startup failed due to previous errors
lis 04, 2017 9:34:05 PM org.apache.catalina.core.ApplicationContext log
INFO: Closing Spring root WebApplicationContext
lis 04, 2017 9:34:05 PM org.springframework.web.context.support.AnnotationConfigWebApplicationContext doClose
INFO: Closing Root WebApplicationContext: startup date [Sat Nov 04 21:34:04 CET 2017]; root of context hierarchy
lis 04, 2017 9:34:05 PM org.springframework.web.context.support.AnnotationConfigWebApplicationContext doClose
WARNING: Exception thrown from ApplicationListener handling ContextClosedEvent
java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: Root WebApplicationContext: startup date [Sat Nov 04 21:34:04 CET 2017]; root of context hierarchy
	at org.springframework.context.support.AbstractApplicationContext.getApplicationEventMulticaster(AbstractApplicationContext.java:344)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:331)
	at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:869)
	at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:836)
	at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:579)
	at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:115)
	at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4772)
	at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5411)
	at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:226)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1404)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1394)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)

lis 04, 2017 9:34:05 PM org.springframework.web.context.support.AnnotationConfigWebApplicationContext doClose
WARNING: Exception thrown from LifecycleProcessor on context close
java.lang.IllegalStateException: LifecycleProcessor not initialized - call 'refresh' before invoking lifecycle methods via the context: Root WebApplicationContext: startup date [Sat Nov 04 21:34:04 CET 2017]; root of context hierarchy
	at org.springframework.context.support.AbstractApplicationContext.getLifecycleProcessor(AbstractApplicationContext.java:357)
	at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:877)
	at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:836)
	at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:579)
	at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:115)
	at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4772)
	at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5411)
	at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:226)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1404)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1394)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)

lis 04, 2017 9:34:06 PM org.apache.jasper.servlet.TldScanner scanJars
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
lis 04, 2017 9:34:06 PM org.apache.catalina.core.ApplicationContext log
INFO: No Spring WebApplicationInitializer types detected on classpath
lis 04, 2017 9:34:06 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.
lis 04, 2017 9:34:08 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler [http-nio-8080]
lis 04, 2017 9:34:08 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler [ajp-nio-8009]
lis 04, 2017 9:34:08 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 8780 ms


1

Mam 2 sugestie.

  1. Przejdź na Spring Boot 1.5+, albo nawet 2.0 (jeśli chcesz się pobawić czymś nowym), bo szczerze mówiąc to z konfiguracjami można spędzić tydzień, albo i dłużej, jeśli nie ma się pojęcia co się robi, a do początków nikomu nie jest potrzebna wiedza jakiego view resolvera wstrzykuje, ani jak ustawia dispatchera. W Spring Boot wszystko działa i jest automatycznie skonfigurowane, łącznie z dołączonymi Tomcatami itd.
  2. Zmień IDE na IntelliJ Ultimate. Po prostu do Springa jest dużo lepsze, bo samo wyłapuje Springowe komponenty i informuje o ewentualnych błędach (albo chociaż pośrednio - nie oznacza wadliwej klasy Springowymi znaczkami). Czasami Spring nie odpala się przez błędnie skonfigurowane IDE - sam kilkukrotnie miałem takie problemy kilka lat temu.
    No i tak swoją drogą to faktycznie dosyć stare masz tutaj frameworki. JUnit jest już w wersji 5, Spring tak samo, Java jest już w 1.9. Dodatkowo JSP samo w sobie stwarza problemy (pamiętam, że zawsze walczyłem, żeby zaczęło działać zmieniając scope'y, ale w tamtym przypadku Spring stawiał servlet tylko dopiero po wejściu na stronę wyrzucał wyjątki), mi dużo lepiej pracowało się z Thymeleaf, a jeśli ogarniasz JS to wtedy fajnie jest wybrać JS+Angular i pisać RESTowe serwisy w Springu (ale to dosyć trudna ścieżka).
    Jeśli o tutoriale chodzi to jak odpalić Spring Boot jest na przykład tutaj: https://spring.io/guides/gs/spring-boot/
1

trzy strony kodu aby uruchomić Hello Worlda, a niby php jest głupi :)

0
Slashy napisał(a):

Mam 2 sugestie.

  1. Przejdź na Spring Boot 1.5+, albo nawet 2.0 (jeśli chcesz się pobawić czymś nowym), bo szczerze mówiąc to z konfiguracjami można spędzić tydzień, albo i dłużej, jeśli nie ma się pojęcia co się robi, a do początków nikomu nie jest potrzebna wiedza jakiego view resolvera wstrzykuje, ani jak ustawia dispatchera. W Spring Boot wszystko działa i jest automatycznie skonfigurowane, łącznie z dołączonymi Tomcatami itd.
  2. Zmień IDE na IntelliJ Ultimate. Po prostu do Springa jest dużo lepsze, bo samo wyłapuje Springowe komponenty i informuje o ewentualnych błędach (albo chociaż pośrednio - nie oznacza wadliwej klasy Springowymi znaczkami). Czasami Spring nie odpala się przez błędnie skonfigurowane IDE - sam kilkukrotnie miałem takie problemy kilka lat temu.
    No i tak swoją drogą to faktycznie dosyć stare masz tutaj frameworki. JUnit jest już w wersji 5, Spring tak samo, Java jest już w 1.9. Dodatkowo JSP samo w sobie stwarza problemy (pamiętam, że zawsze walczyłem, żeby zaczęło działać zmieniając scope'y, ale w tamtym przypadku Spring stawiał servlet tylko dopiero po wejściu na stronę wyrzucał wyjątki), mi dużo lepiej pracowało się z Thymeleaf, a jeśli ogarniasz JS to wtedy fajnie jest wybrać JS+Angular i pisać RESTowe serwisy w Springu (ale to dosyć trudna ścieżka).
    Jeśli o tutoriale chodzi to jak odpalić Spring Boot jest na przykład tutaj: https://spring.io/guides/gs/spring-boot/

Chciałem zastosować wzorzec MVC przez Spring Boota, ale tam też miałem problemy. Głównie nie wiem dwóch rzeczy: Jak bawimy się w Angular + REST, czyli podobno najpopularniejsze dzisiaj rozwiązanie, to jeżeli chce postawić jakiś index.html, który będzie wyświetlał dane wystawione przez REST pod adresem locaclhost:8080/greetings, to muszę zrobić 2 kontrolery: jeden, który mapuje adres locaclhost:8080/greetings i pod nim wystawia REST i drugi kontroler, który też mapuje adres locaclhost:8080/greetings i zwraca dla niego nazwę widoku (index.html) ? To jest w ogóle możliwe ? Czy zupełnie inaczej się robi ? No i druga rzecz: jeżeli chce zwrócić w kontrolerze nazwę jakiegoś widoku, to muszę powiedzieć Springowi gdzie one się znajdują, w MVC to było proste, bo samemu się konfiguruje viewResolver, a w Boot jak to zrobić ? Tego też nie mogłem nigdzie znaleźć. No i w sumie chcę wiedzieć co tam się pod spodem w Springu dzieje, dlatego zabrałem się za MVC nie Boot.

1
slayer9 napisał(a):

Chciałem zastosować wzorzec MVC przez Spring Boota, ale tam też miałem problemy. Głównie nie wiem dwóch rzeczy: Jak bawimy się w Angular + REST, czyli podobno najpopularniejsze dzisiaj rozwiązanie, to jeżeli chce postawić jakiś index.html, który będzie wyświetlał dane wystawione przez REST pod adresem locaclhost:8080/greetings, to muszę zrobić 2 kontrolery: jeden, który mapuje adres locaclhost:8080/greetings i pod nim wystawia REST i drugi kontroler, który też mapuje adres locaclhost:8080/greetings i zwraca dla niego nazwę widoku (index.html) ? To jest w ogóle możliwe ? Czy zupełnie inaczej się robi ? No i druga rzecz: jeżeli chce zwrócić w kontrolerze nazwę jakiegoś widoku, to muszę powiedzieć Springowi gdzie one się znajdują, w MVC to było proste, bo samemu się konfiguruje viewResolver, a w Boot jak to zrobić ? Tego też nie mogłem nigdzie znaleźć. No i w sumie chcę wiedzieć co tam się pod spodem w Springu dzieje, dlatego zabrałem się za MVC nie Boot.

W skrócie. Ze strony Springa wysyłasz jakieś dane np. id w formacie, jaki chce klient, czyli np. json. Ze strony klienta, którym może być np. Angular, czy cokolwiek innego modnego teraz na froncie, tworzysz model danych, z którego generujesz później widok z danych, które dostaniesz z backendu. Jak to wygląda dokładnie w kodzie to nie powiem, bo ja Angulara i podobnych nie używałem od dawna, bo siedzę głęboko w backendzie :).
Natomiast jeśli chcesz korzystać tylko z samego MVC to też możesz korzystać z Boota i wygląda to wtedy tak samo jak przy zwykłym Spring MVC. Czyli masz kontroler zwracający widok.
W Spring Boot też jest konfiguracja, tzn. tworzysz plik application.properties w folderze resources i dodajesz do niego konfigurację. Jeśli chcesz korzystać z Thymeleaf to w konfiguracji dodajesz

spring.thymeleaf.enabled = true

I w resources tworzysz foldery static i templates, w których przechowujesz swoje widoki. I to tyle.
W JSP w application.properties dodajesz

spring.mvc.view.prefix = /WEB-INF/jsp/
spring.mvc.view.suffix = .jsp

Które oznaczają ścieżkę dla viewResolvera i też powinno już działać.

Jeśli chodzi o konfiguracje to są różne podejścia i zrobisz jak chcesz. Ja uważam, że dla początkującego to nie ma sensu, bo sam spędzałem tygodnie szukając jakiejś działającej konfiguracji dla Springa (a jak dojdzie Spring Data, czy Spring Security to już w ogóle jest kosmos) i męczyłem się godzinami próbując je dopasować do moich potrzeb. Później wyszedł Spring Boot i konfiguracja trwała 5 minut, a dopiero jak lepiej poznałem Springa to zacząłem rozumieć do czego w ogóle mi jest potrzebny konkretny Bean i konkretna konfiguracja.

0

Czyli cały front robimy w Angularze ? Osoba, która siedzi w backendzie jedynie tworzy RESTowe kontrolery i wystawia JSONy (tak w skrócie) ?

Hmm dodałem te 2 linijki do application.properties tak jak polecałeś, widoki umieszczone tak jak widać niżej, klasa kontrolera też jest i dostaje 404. mvc:annotation-driven jest w Boocie domyślnie ustawione ?

title

1 użytkowników online, w tym zalogowanych: 0, gości: 1