此代码不起作用
我有一个需要翻译成 Spring Boot 的 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>
和这个类(class)
@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);
}
}
我写了注册这个 bean 的代码,但它不起作用,我不明白为什么
@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);
}
}
最佳答案
首先检查并确认您的所有资源都保存在正确的目录中。对于spring-boot,jsp 页面将保存在目录src->main->webapp->WEB-INF->view->*.jsp
中。 .
在使用嵌入式 tomcat 时,您应该在 pom 中添加以下依赖项以正确编译 jsp:
<!-- 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 文件的文件夹,以及定义 View 。
或者
配置 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);
}
}
现在为 注册 servlet :
ServletRegistrationBean
用于在中注册Servlets小服务程序 3.0 + 容器。我们需要创建一个ServletRegistrationBean
的bean在我们的 JavaConfig.查找 ServletRegistrationBean 的一些方法,用于配置 Servlet。setServlet(): 设置要注册的 servlet。
addUrlMappings(): 为 Servlet 添加 URL 映射。
setLoadOnStartup:设置启动时加载 Servlet 的优先级。
假设我们有两个 Servlet,如
HelloCountryServlet
和 HelloStateServlet
然后我们将使用 ServletRegistrationBean 向 Spring Boot 注册它们,如下所示:@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;
}
}
我们为每个 Servlet 创建一个 ServletRegistrationBean bean 角,扁 bean 。
servlet 类将如下所示:
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>");
}
}
这是一种方法。
另一种方法在 spring-boot 中注册 servlet 使用注释: @ServletComponentScan 和 @WebServlet .
@ServletComponentScan
在 Spring Boot 中将扫描带有 @WebServlet
注释的 Servlets , 过滤器注释为 @WebFilter
和用 @WebListener
注释的监听器.注解@ServletComponentScan 用于类级别的JavaConfig。 @ServletComponentScan 扫描 Servlet、过滤器和监听器 仅使用嵌入式 Web 服务器 .找到用@WebServlet 注释的 Servlet。所以早期的 HelloCountryServlet servlet 可以提供为:
@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);
}
}
关于spring - 如何使用 Spring Boot 注册 servlet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55978959/