spring - 如何使用 Spring Boot 注册 servlet?
问题描述
此代码不起作用
我有一个需要翻译成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>
和这堂课
@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
。
您应该在 pom 中添加以下依赖项,以便在使用嵌入式 tomcat 时正确编译 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 文件所在的文件夹,以及定义视图。或者
配置 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
用于在Servlet 3.0 +容器中注册 Servlet。我们需要ServletRegistrationBean
在我们的 JavaConfig 中创建一个 bean。找到一些用于配置 Servlet 的 ServletRegistrationBean 方法。
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。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 中,将扫描带有 注释的 Servlet、带有注释的@WebServlet
过滤器@WebFilter
和带有注释的侦听器@WebListener
。注释 @ServletComponentScan 在类级别的 JavaConfig 上使用。@ServletComponentScan仅使用嵌入式 Web 服务器扫描 Servlet、过滤器和侦听器。找到带有@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);
}
}
推荐阅读
- angular - (原因:CORS 标头“Access-Control-Allow-Origin”缺失)api 问题
- c# - C# readonly 字段永远不会被分配警告 - 可以将其配置为错误
- javascript - Javascript:按 ID 更改多个元素样式
- android - 我在构建失败下收到此错误消息
- python - 如何将字典列表更改为熊猫数据框中的各个列?
- keyboard - Logitecth MX Keys 键盘上的查找按钮的用途是什么?
- flutter - 颤振本地通知清单插件
- node.js - 如何将从 API 返回的 png 图像存储到 mongodb
- android - ANR - 输入调度超时 - Android 11
- javascript - 数组中最大连续数字项+1差