如何使用 Spring Boot 注册 servlet?

2023-12-22

这段代码不起作用

我有一个 web.xml 需要翻译成 spring boot

    <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 .

使用嵌入式 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 文件所在的文件夹,并定义视图。 或者

配置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);
    }
}

Now for 注册 servlets :

ServletRegistrationBean用于注册 ServletServlet 3.0 +容器。我们需要创建一个 beanServletRegistrationBean在我们的 JavaConfig.查找 ServletRegistrationBean 的一些用于配置 Servlet 的方法。设置Servlet():设置要注册的 servlet。addUrlMappings():添加 Servlet 的 URL 映射。设置启动时加载:设置启动时加载 Servlet 的优先级。

假设我们有两个 ServletHelloCountryServlet and 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 创建一个Servlet注册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 and @WebServlet. @ServletComponentScan在Spring Boot中将扫描带有注释的Servlet@WebServlet, 过滤器注释为@WebFilter和听众注释@WebListener注释@ServletComponentScan用于类级别的JavaConfig。 @ServletComponentScan 扫描 Servlet、过滤器和监听器仅使用嵌入式 Web 服务器。找到带有 @WebServlet 注释的 Servlet。

所以越早HelloCountryServletservlet 可以提供为:

@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);
    }
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Spring Boot 注册 servlet? 的相关文章

随机推荐

  • 适用于 Windows 8 RTM 的 Microsoft Advertising SDK 导致访问被拒绝错误

    请注意以下事项 我有 Windows 8 RTM 我有 Visual Studio 2012 RTM 我有 Microsoft Advertising SDK RTM 我所做的就是 添加对它的引用 错误 System Unauthorize
  • App Engine 数据存储上的 Spring Security ACL

    我们将 Spring Security ACL 基础设施与 App Engine 数据存储结合使用 我们不使用低级数据存储 API 而是使用 Objectify 框架来访问数据存储 我们需要将Spring Security ACL模型 适用
  • 通过 php exec 函数传递 $_SERVER 数组[重复]

    这个问题在这里已经有答案了 可能的重复 安全执行shell脚本 执行前转义变量 https stackoverflow com questions 2624616 safe executing shell scripts escaping
  • 谷歌地图API带有信息窗口的多个标记

    我刚刚开始接触谷歌地图 API 我正在尝试在地图上绘制几个标记 完毕 然而 我正在为每个标记回收一个变量 对象 我最初使用选项创建标记并添加到地图 然后采用相同的标记变量 重新调整其用途 然后再次将其添加到地图 这确实会产生两个带有单独标题
  • 你将如何在 C# 中构建这个 xml

    我需要生成这个看起来简单的 XML 寻找一种干净的方法来生成它
  • 从 NPM 包中导出多个模块

    我有一个相当大的项目 A 使用 Node 和 Typescript 在项目 A 中 我有很多不同的模块 我想在另一个项目 B 中重用它们 因此我用这个 tsconfig json 构建了项目 A compilerOptions target
  • Android 应用内计费 - 从服务器检索信息时出错

    我在应用程序计费中使用 Android 来进行应用程序内购买 在极少数情况下 我的许多用户都会报告此错误 从服务器检索信息时出错 RPC S 7 AEC 0 这是在生产中发生的 而不是在测试中发生的 我无法在本地重现此内容以进行调试 这个错
  • ArrayDeque类的addFirst方法

    java util ArrayDeque类中addFirst方法的代码是 public void addFirst E e if e null throw new NullPointerException elements head hea
  • 使用 1-1 函数从 id 生成代码

    有没有好的可逆 1 1 函数将一个整数映射到另一个整数 例如 给定范围 0 5 我想找到一个映射的 0 gt 3 1 gt 2 2 gt 4 3 gt 5 4 gt 1 5 gt 0 此外 映射应该看起来是随机的 您可以按升序填充数组并对其
  • 使用 Laravel 查询生成器和 LEFT JOIN 删除行

    如何在一个查询中从多个表中删除行 使用左连接 查询 DELETE deadline job FROM deadline LEFT JOIN job 所以 我尝试这样 DB table deadline job gt leftJoin job
  • 下载文件时显示“请稍候”消息或进度条

    我使用以下 WordPress 管理员通知来提示用户下载一些文件 我想在下载文件时包含一个进度条或至少包含一个 正在下载 请稍候 消息 有任何想法吗 我已经尝试了几种 jQuery 解决方案 但没有任何效果 对于 jQuery 我完全是个菜
  • 非静态字段、方法或属性需要对象引用吗?

    我知道这可能是一个非常新的问题 所以我很抱歉 我正在尝试从另一个表单 MaxScore 访问 Form1 上标签的 Text 属性 当我单击 MaxScore 上的 确定 按钮时 我想使用 max ToString 将 Form1 的 my
  • 如何直接从我的服务器将视频上传到 Youtube?

    我正在设置一个 无头 网络服务器 让人们可以制作自己的自定义延时电影 有几个人想将他们制作的延时视频上传到 YouTube 与其将视频下载到该人的笔记本电脑上 然后该人手动将其上传到 YouTube 有没有一种方法可以在我的网络服务器上编写
  • 配方/成分/测量/数量的数据库架构

    我正在创建一个食谱应用程序来帮助我妻子实现她的蛋糕爱好 这个想法是创建一个食谱数据库来保存她所有的蛋糕食谱 每个食谱都有多种成分 每种成分都有一个测量值 克 毫升 茶匙等 然后是数量 我了解如何创建 食谱 和 成分 表 以及如何将这两个表与
  • 按降序对 int 数组进行排序[重复]

    这个问题在这里已经有答案了 可能的重复 按降序对基本类型数组进行排序 https stackoverflow com questions 215271 sort arrays of primitive types in descending
  • 使用 Hangout api 进行视频通话 [已关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 你好 我有一个 Android 应用程序 我想要其中的视频聊天功能 我在互联网上搜索了很多 但找不到任何有效且简单的解决方案 然后我找
  • 如何通过切换(“慢”)使其更平滑

    我有以下代码可以工作 但在每个切换操作结束时它变得有点跳动 如果我切换段落会更流畅吗 我正在尝试获取该段落 但我不知道该怎么做 div div class toppara p Conte p div div
  • 从 Express 中间件中排除路由

    我有一个节点应用程序 就像防火墙 调度程序一样位于其他微服务前面 它使用如下所示的中间件链 app use app lookup app use timestamp validator app use request body app us
  • 如何在验证消息 Laravel 5.2 中获取数组索引

    我放入的这些数组Laravel Validator作为参数 item gt string rules item string gt Item number index is not string messages 我希望有index num
  • 如何使用 Spring Boot 注册 servlet?

    这段代码不起作用 我有一个 web xml 需要翻译成 spring boot