Colocar O Index.html Pra Funcionar

Estou começando a estudar AngularJS com Spring MVC e eu queria quando eu entrasse no sistema no caso http://localhost:8080/ ele entrasse numa pagina inicial ou seja chamar o index.html, andei fuçando na internet, mais não consegui sucesso, na hora de chamar a página.

Esse é meu controller que criei só para chamar á pagina como nos exemplos que eu vi também.

package br.com.escconsultoria.standard.controller;

    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.servlet.ModelAndView;

    @RestController
    @RequestMapping(value = "/")
    public class IndexController {

    	  @RequestMapping(method = RequestMethod.GET)
    	    public ModelAndView getIndexPage() {
    	        return new ModelAndView("/index");
    	    }

    }

Beleza essa parte tudo bem alguns exemplos simplesmente fazendo : return (“index”), funcionava mais o meu não consegui por nada dai eu vi falando sobre usar Template: Thymeleaf só que não consegui também agora ele não acha aonde está a página.

package br.com.escconsultoria.standard.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.thymeleaf.spring4.SpringTemplateEngine;
import org.thymeleaf.spring4.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;

import nz.net.ultraq.thymeleaf.LayoutDialect;

@Configuration
public class ThymeleafConfig {

    @Bean
    public ServletContextTemplateResolver templateResolver() {
        ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
        //resolver.setPrefix("/resources/");
        resolver.setSuffix(".html");
        resolver.setTemplateMode("HTML5");
        resolver.setOrder(1);
        return resolver;
    }

    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setTemplateResolver(templateResolver());
        engine.addDialect(new LayoutDialect());
        //engine.addDialect(new SpringSecurityDialect());
        //engine.addDialect(new SpringStandardDialect());
        return engine;
    }

    @Bean
    public ThymeleafViewResolver thymeleafViewResolver() {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        return resolver;
    }
}

package br.com.escconsultoria.standard.configuration;

import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"br.com.escconsultoria.standard.configuration",
							   "br.com.escconsultoria.standard.controller",
							   "br.com.escconsultoria.standard.repository",
							   "br.com.escconsultoria.standard.service",
							   "br.com.escconsultoria.imobiliario.controller",
							   "br.com.escconsultoria.imobiliario.repository",
							   "br.com.escconsultoria.imobiliario.service"})
public class AppConfiguration extends WebMvcConfigurerAdapter{

	/*@Bean
    public ServletContextTemplateResolver templateResolver() {
        ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
        resolver.setPrefix("/resources/");
        resolver.setSuffix(".html");
        resolver.setTemplateMode("HTML5");
        resolver.setOrder(1);
        return resolver;
    }*/
	
	/*@Bean
	public ViewResolver viewResolver() {
		InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
		viewResolver.setPrefix("/resources/");
		viewResolver.setSuffix(".html");
		viewResolver.setCache(false);
		return viewResolver;
	}*/

	@Bean
	public CommonsMultipartResolver multipartResolver() {
		CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
		multipartResolver.setMaxUploadSize(100000l);
	    return multipartResolver;
	}

	@Bean
	public MessageSource messageSource() {
	    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
	    messageSource.setBasename("messages");
	    return messageSource;
	}

	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler("/app/**").addResourceLocations("/app/");
		registry.addResourceHandler("/assets/**").addResourceLocations("/assets/");
		registry.addResourceHandler("/static/**").addResourceLocations("/static/");
		registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
		registry.addResourceHandler("/tempraltes/**").addResourceLocations("/tempraltes/");
	}
}

Alguém tem uma ideia como implementar isso?

Minha página index está no scr/main/resources/templates/index.html

tem uma forma de vc colocar os resources no WEB-INF

http://www.tutorialspoint.com/spring/spring_static_pages_example.htm

eu usaba o WEB-INF 10 anos atras, não sei se existe alguma coisa mais moderna nos dias de hoje, porém eu acho estranho vc fazer o delivery de conteudo estatico através do java.

uma solução que eu sempre usei foi utilizar um web server como NginX rodando na porta 80 com dois dominios, um static.qqcoisa que tem um diretorio com todos os js css e htmls e outro que faz proxy na minha aplicação

é claro que isso pode dificultar o seu deploy, vai ter q copiar coisas pra diretorio x e atualizar um WAR e o rollback fica mais complexo. ainda assim o NginX na frente pode fazer caching das imagens, htmls e outras coisas por um longo tempo e evitar que cada request sobrecarregue seu sistema.

para poucos requests isso é irrisório. contudo tenha essa carta na manga, se estiver demorando mete um cache na frente.

cache é tipo a primeira forma de resolver problemas de performance

1 curtida

vlw amigo pela resposta então realmente os exemplos que eu estava vendo a maioria ficava no WebInf mais nem todos achei exemplos que o html ficava na pasta template e achei exemplo também que ficava do static, enfim eu queria uma solução mais moderna compatível com o projeto que estou tentando fazer.

Bom consegui resolver meu problema e estou colocando a solução aqui, primeiramente a primeira coisa que me impedia de funcionar era o Controller anotado com RestController e precisava ser só Controller.

package br.com.escconsultoria.standard.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping(value = "/")
public class IndexController {

	@RequestMapping(method = RequestMethod.GET)
	public String getIndexPage() {
		return "index3";
	}
}

E segundo meu AppConfiguration ficou assim.

package br.com.escconsultoria.standard.configuration;

import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"br.com.escconsultoria.standard.configuration",
							   "br.com.escconsultoria.standard.controller",
							   "br.com.escconsultoria.standard.repository",
							   "br.com.escconsultoria.standard.service",
							   "br.com.escconsultoria.imobiliario.controller",
							   "br.com.escconsultoria.imobiliario.repository",
							   "br.com.escconsultoria.imobiliario.service"})
public class AppConfiguration extends WebMvcConfigurerAdapter{

	@Bean
	public ViewResolver viewResolver() {
		InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
		viewResolver.setPrefix("/templates/");
		viewResolver.setSuffix(".html");
		viewResolver.setCache(false);
		return viewResolver;
	}

	@Bean
	public CommonsMultipartResolver multipartResolver() {
		CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
		multipartResolver.setMaxUploadSize(100000l);
	    return multipartResolver;
	}

	@Bean
	public MessageSource messageSource() {
	    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
	    messageSource.setBasename("messages");
	    return messageSource;
	}

	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler("/app/**").addResourceLocations("/app/");
		registry.addResourceHandler("/assets/**").addResourceLocations("/assets/");
		registry.addResourceHandler("/static/**").addResourceLocations("/static/");
		registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
		registry.addResourceHandler("/templates/**").addResourceLocations("/templates/");
	}
}

Depois eu tive um pequeno problema nos index que eu estava tentando fazer mais era por causa estava gerando elas no Pingendo e ele não fechava as tag no caso dos meta, input e alguns outros só foi fechar na mão e funcionou. Meu HTML de Teste abaixo.

<html>
<head>
<meta charset="utf-8"></meta>
<meta name="viewport" content="width=device-width, initial-scale=1"></meta>
<script type="text/javascript"
	src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<script type="text/javascript"
	src="http://netdna.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<link
	href="http://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.min.css"
	rel="stylesheet" type="text/css"></link>
<link
	href="http://pingendo.github.io/pingendo-bootstrap/themes/default/bootstrap.css"
	rel="stylesheet" type="text/css"></link>
</head>
<body>

	<div class="navbar navbar-default navbar-static-top">
		<div class="container">
			<div class="navbar-header">
				<button type="button" class="navbar-toggle" data-toggle="collapse"
					data-target="#navbar-ex-collapse">
					<span class="sr-only">Toggle navigation</span><span
						class="icon-bar"></span><span class="icon-bar"></span><span
						class="icon-bar"></span>
				</button>
				<a class="navbar-brand" href="#"><span>Brand</span></a>
			</div>
			<div class="collapse navbar-collapse" id="navbar-ex-collapse">
				<ul class="nav navbar-nav navbar-right">
					<li class="active"><a href="#">Home</a></li>
					<li><a href="#">Contacts</a></li>
				</ul>
			</div>
		</div>
	</div>
	<div class="section">
		<div class="container">
			<div class="row">
				<div class="col-md-12">
					<form class="form-horizontal" role="form">
						<div class="form-group">
							<div class="col-sm-2">
								<label for="inputEmail3" class="control-label">Email</label>
							</div>
							<div class="col-sm-10">
								<input type="email" class="form-control" id="inputEmail3"
									placeholder="Email"></input>
							</div>
						</div>
						<div class="form-group">
							<div class="col-sm-2">
								<label for="inputPassword3" class="control-label">Password</label>
							</div>
							<div class="col-sm-10">
								<input type="password" class="form-control" id="inputPassword3"
									placeholder="Password"></input>
							</div>
						</div>
						<div class="form-group">
							<div class="col-sm-offset-2 col-sm-10">
								<div class="checkbox">
									<label><input type="checkbox"> Remember me </input></label>
								</div>
							</div>
						</div>
						<div class="form-group">
							<div class="col-sm-offset-2 col-sm-10">
								<button type="submit" class="btn btn-default">Sign in</button>
							</div>
						</div>
					</form>
				</div>
			</div>
		</div>
	</div>
</body>
</html>