Как я могу зарегистрировать сервлет в Spring Boot? - PullRequest
2 голосов
/ 04 мая 2019

Этот код не работает

У меня есть web.xml, который нужно перевести в загрузочную пружину

    <servlet>       
            <servlet-name>page-resolver</servlet-name>       
            <servlet-class>com.bk.ForwardServlet</servlet-class>         
            <init-param>
                <param-name>page</param-name>
                <param-value>/index.jsp</param-value>         
            </init-param>         
    </servlet>
    <servlet-mapping>                            
        <servlet-name>page-resolver</servlet-name>         
        <url-pattern>/index.html</url-pattern>
        <url-pattern>/login</url-pattern>
        <url-pattern>/qmgr/*</url-pattern>  
    </servlet-mapping>

и этот класс

@WebServlet
public class ForwardServlet extends HttpServlet {

private String page;

@Override
public void init(ServletConfig config) throws ServletException {
    super.init(config);
    page = config.getInitParameter("page");
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.getRequestDispatcher(page).forward(req, resp);
}
}

Я написал код, который регистрирует этот компонент, но он не работает, и я не понимаю, почему

@Configuration
public class ConfigureWeb implements ServletContextInitializer {

private void registerServlet(ServletContext servletContext) {
    ServletRegistrationBean serviceServlet =
            new ServletRegistrationBean(new ForwardServlet(), "/index.html","/login","/qmgr/*");

    serviceServlet.addUrlMappings("/index.jsp");
}

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

Ответы [ 2 ]

1 голос
/ 04 мая 2019

Если вам не требуется регистрировать сервлет, вы можете добавить переадресацию к ViewControllerRegistry

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/index.html").setViewName("forward:/index.jsp");
        registry.addViewController("/login").setViewName("forward:/index.jsp");
        registry.addViewController("/qmgr/**").setViewName("forward:/index.jsp");
    }
}

. Вы можете объединить три addViewController s в один, используя AntPathMatcher паттерны

Сопоставить контроллер представления с заданным URL-путем (или шаблоном), чтобы отобразить ответ с предварительно настроенным кодом состояния и представлением.

Шаблоны типа "/ admin / **"или" / articles / {articlename: \ w +} "разрешены.См. AntPathMatcher для получения более подробной информации о синтаксисе.

Лично я думаю, что разделение их более читабельно

0 голосов
/ 07 мая 2019

Прежде всего проверьте и убедитесь, что все ваши ресурсы хранятся в правильном каталоге. Для весенней загрузки страницы jsp должны храниться в каталоге src->main->webapp->WEB-INF->view->*.jsp.

У вас должно быть следующеезависимости, добавленные в pom для правильной компиляции jsp при использовании встроенного tomcat:

<!-- JSTL -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>
<!-- To compile JSP files -->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

Теперь нам нужно сообщить Spring, где находятся файлы jsp, у нас может быть два подхода для этого:

Добавить записи в application.properties

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

Здесь мы можем указать папку, в которой следует ожидать jsp-файлы, а также определить представление.или

Настройка InternalResourceViewResolver для обслуживания страниц JSP

@Configuration
@EnableWebMvc
@ComponentScan
public class MvcConfiguration extends WebMvcConfigurerAdapter
{
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/view/");
        resolver.setSuffix(".jsp");
        resolver.setViewClass(JstlView.class);
        registry.viewResolver(resolver);
    }
}

Теперь для регистрация сервлетов :

ServletRegistrationBean используется для регистрации сервлетов в контейнере Servlet 3.0 + .Нам нужно создать bean-компонент ServletRegistrationBean в нашем JavaConfig.Найдите некоторые методы ServletRegistrationBean, используемые для настройки сервлета. setServlet (): Устанавливает сервлет для регистрации. addUrlMappings (): Добавить сопоставления URL для сервлета. setLoadOnStartup: Устанавливает приоритет загрузки сервлета при запуске.

Предположим, у нас есть два сервлета как HelloCountryServlet и HelloStateServlet, затем мы зарегистрируем их в Spring Boot с использованием ServletRegistrationBean следующим образом:

@Configuration
public class WebConfig {
   @Bean    
   public ServletRegistrationBean<HttpServlet> countryServlet() {
       ServletRegistrationBean<HttpServlet> servRegBean = new ServletRegistrationBean<>();
       servRegBean.setServlet(new HelloCountryServlet());
       servRegBean.addUrlMappings("/country/*");
       servRegBean.setLoadOnStartup(1);
       return servRegBean;
   }
   @Bean    
   public ServletRegistrationBean<HttpServlet> stateServlet() {
       ServletRegistrationBean<HttpServlet> servRegBean = new ServletRegistrationBean<>();
       servRegBean.setServlet(new HelloStateServlet());
       servRegBean.addUrlMappings("/state/*");
       servRegBean.setLoadOnStartup(1);
       return servRegBean;
   }   
}  

Для каждого сервлета мы создаем компонент ServletRegistrationBean .И класс сервлетов будет выглядеть так:

public class HelloCountryServlet extends HttpServlet   {
    private static final long serialVersionUID = 1L;
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{
        doGet(request,response);
    }
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
        out.println("<h3>Hello India!</h3>");   
    }
}

Это один из подходов.

Другой метод для регистрации сервлетов в весенней загрузке использует аннотации: @ ServletComponentScan и @ WebServlet .@ServletComponentScan в Spring Boot будет сканировать сервлеты, помеченные @WebServlet, фильтры, помеченные @WebFilter, и прослушиватели, помеченные @WebListener. Аннотация @ServletComponentScan используется в JavaConfig на уровне класса.@ServletComponentScan сканирует сервлеты, фильтры и прослушиватели только с использованием встроенного веб-сервера .Найдите сервлеты, аннотированные @ WebServlet.

Таким образом, более ранний HelloCountryServlet сервлет может быть представлен в виде:

@WebServlet(urlPatterns = "/country/*", loadOnStartup = 1)
public class HelloCountryServlet extends HttpServlet   {
    private static final long serialVersionUID = 1L;
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{
         doGet(request,response);
    }
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
             response.setContentType("text/html");
             PrintWriter out = response.getWriter();
         out.println("<h3>Hello India!</h3>");  
    }
}

и предоставлять аннотацию ServletComponentScan, например:

@ServletComponentScan
@SpringBootApplication
public class SpringBootAppStarter {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootAppStarter.class, args);
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...