Создание веб-проекта First Spring (без весенней загрузки) без jsp (только html), но с получением 404 - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь создать свой первый весенний веб-проект, но я не хочу использовать jsp.Все, что я хочу использовать, это контроллер покоя, но я не смог передать даже первый запрос ("/"), который использует файл приветствия index.html (по умолчанию index.jsp).Я собираюсь вставить структуру папок и классы.

Это мой класс конфигурации приложения

package com.abs.sstest.security;
@Configuration
@ComponentScan
@EnableWebMvc
public class AppConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addRedirectViewController("/", "index.html");
}

public void addResourceHandlers(final ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/static/**").addResourceLocations("/static/");
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}
}

Это мой класс Init

package com.abs.sstest.security;

public class AppInit implements WebApplicationInitializer{

@Override
public void onStartup(ServletContext servletContext)
        throws ServletException {
    registerDispatcherServlet(servletContext);
}

private void registerDispatcherServlet(final ServletContext servletContext) {
    WebApplicationContext dispatcherContext = createContext(AppConfig.class);
    DispatcherServlet dispatcherServlet = new DispatcherServlet(dispatcherContext);
    Dynamic dispatcher = servletContext.addServlet("dispatcher", dispatcherServlet);
    dispatcher.setLoadOnStartup(1);
    dispatcher.addMapping("/");
}

private WebApplicationContext createContext(final Class<?>... annotatedClasses) {
    AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
    context.register(annotatedClasses);
    return context;
}

}

Это мой класс securityconfig

package com.abs.sstest.security;

 @Configuration
 @EnableWebSecurity
 public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

@Autowired
public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication().withUser("bill").password("abc123").roles("USER");
    auth.inMemoryAuthentication().withUser("admin").password("root123").roles("ADMIN");
    auth.inMemoryAuthentication().withUser("dba").password("root123").roles("ADMIN","DBA");
}

protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
    .antMatchers("/","/home").permitAll()
    .antMatchers("/admin/**").access("hasRole('ADMIN')")
    .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")
    .and().formLogin()
    .and().exceptionHandling().accessDeniedPage("/Access_Denied");

}

}

Этоэто моя безопасность init

package com.abs.sstest.security;


public class SecurityWebApplicationInitializer extends 
AbstractSecurityWebApplicationInitializer {

}

Это моя структура папок Структура папок

enter image description here

Я вставил index.html в несколько папокпотому что я запутался, читая различные форумы.

Редактировать: Теперь я изменил свой класс conifg приложения

package com.abs.sstest.security;

@Configuration
@ComponentScan(basePackages = "com.abs.sstest")
@EnableWebMvc
public class AppConfig implements WebMvcConfigurer {
@Override
 public void    configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
        configurer.enable();
}

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addRedirectViewController("/", "/index");
    registry.addRedirectViewController("/login2", "/login2");
}

public void addResourceHandlers(final ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/static/**").addResourceLocations("/static/");
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    registry.addResourceHandler("/views/**").addResourceLocations("/WEB-INF/views/");
}
}

Класс init теперь намного проще

package com.websystique.springsecurity.configuration;

public class SpringMvcInitializer extends 
AbstractAnnotationConfigDispatcherServletInitializer {

@Override
protected Class<?>[] getRootConfigClasses() {
    return new Class[] { HelloWorldConfiguration.class };
}

@Override
protected Class<?>[] getServletConfigClasses() {
    return null;
}

@Override
protected String[] getServletMappings() {
    return new String[] { "/" };
}

}

ИТеперь главное, что все мои html-файлы находятся в src / main / webapp / index.html

Но это привело к новой проблеме, теперь я должен вернуть даже расширение из контроллера.Например:

@RequestMapping(value = "/login2", method = RequestMethod.GET)
public String loginPage() {
    return "login.html";//login doesn't work
}

1 Ответ

0 голосов
/ 18 декабря 2018

Первое, что вы должны поместить index.html в / WEB_INF / view /.Кажется, вам нужно добавить ViewResolver, чтобы Spring знал, как анализировать возвращаемую строку из контроллера.Поэтому попробуйте добавить в свой класс AppConfig:

@Bean
public ViewResolver internalResourceViewResolver() {
    InternalResourceViewResolver bean = new InternalResourceViewResolver();
    bean.setViewClass(JstlView.class);
    bean.setPrefix("/WEB-INF/view/");
    bean.setSuffix(".html");
    return bean;
}

Конечно, убедитесь, что в вашем файле pom есть необходимые зависимости!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...