Servlet 3.0不会在应用程序启动时加载 [英] Servlet 3.0 doesn't load on application startup

查看:70
本文介绍了Servlet 3.0不会在应用程序启动时加载的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个运行在tomcat 7.0.29中的JSF 2.0 Web应用程序,并尝试使用Servlet 3.0 注释,但是servlet无效,因为我看不到init()方法中写的日志.

I've a JSF 2.0 web application running in tomcat 7.0.29 and tried to use the Servlet 3.0 annotation but the servlet didn't work as i can't see the log written in its init() method.

对于相同的问题,我已经读了很多答案,但还是不成功.

i ve read many answers for the same problem but still not seccessful.

我的文件外观如下:

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app metadata-complete="false"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
  <display-name>GestionCongesFeki</display-name>
  <welcome-file-list>
    <welcome-file>index.xhtml</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
  </servlet-mapping>


<!--   <servlet> -->
<!--     <servlet-name>AjaxRelaisServlet</servlet-name> -->
<!--     <servlet-class>utils.AjaxRelaisServlet</servlet-class> -->
<!--     <load-on-startup>2</load-on-startup> -->
<!-- </servlet> -->
<!-- <servlet-mapping> -->
<!--     <servlet-name>AjaxRelaisServlet</servlet-name> -->
<!--     <url-pattern>/AjaxRelaisServlet/*</url-pattern> -->
<!-- </servlet-mapping> -->

</web-app>

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>esprit.pfe2013</groupId>
  <artifactId>GestionCongesFeki</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>GestionCongesFeki Maven Webapp</name>
  <url>http://maven.apache.org</url>

<repositories>
        <repository>
            <id>central</id>
            <name>Maven Repository Switchboard</name>
            <layout>default</layout>
            <url>http://repo1.maven.org/maven2</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>       
        <repository>
            <id>prime-repo</id>
            <name>Prime Repo</name>
            <url>http://repository.primefaces.org</url>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>central</id>
            <name>Maven Plugin Repository</name>
            <url>http://repo1.maven.org/maven2</url>
            <layout>default</layout>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <releases>
                <updatePolicy>never</updatePolicy>
            </releases>
        </pluginRepository>
    </pluginRepositories>

<!--   <repositories> -->
<!-- <repository> -->
<!--            <id>central</id> -->
<!--            <name>Central Repository</name> -->
<!--            <url>http://repo.maven.apache.org/maven2</url> -->
<!--            <layout>default</layout> -->
<!--            <snapshots> -->
<!--                <enabled>false</enabled> -->
<!--            </snapshots> -->
<!--        </repository> -->


<!--    </repositories> -->

    <dependencies>

         <dependency>
           <groupId>javax.servlet</groupId>
           <artifactId>javax.servlet-api</artifactId>
           <version>3.0.1</version>        
         </dependency>



        <!-- PrimeFaces -->
        <dependency>
            <groupId>org.primefaces</groupId>
            <artifactId>primefaces</artifactId>
            <version>3.4.1</version>
        </dependency>


        <!-- JSF 2 -->
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-api</artifactId>
            <version>2.1.11</version>
        </dependency>
        <dependency>
            <groupId>com.sun.faces</groupId>
            <artifactId>jsf-impl</artifactId>
            <version>2.1.11</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>




        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.13</version>
        </dependency>


        <dependency>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.4.3</version>
</dependency>






    </dependencies>
    <build>
    <finalName>GestionCongesFeki</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>  

</project>

和servlet:

package utils;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class AjaxRelaisServlet
 */
@WebServlet("/AjaxRelaisServlet") 
public class AjaxRelaisServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public AjaxRelaisServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see Servlet#init(ServletConfig)
     */
    public void init(ServletConfig config) throws ServletException {
        System.out.println("This is AjaxRelaisServlet initialisaton !!!");
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

}

实际上,当我在web.xml(注释的代码)中声明该servlet时,它工作正常,但是当我使用注释时,它就不能正常工作. 顺便说一句,我想知道是否可以在解决此问题时摆脱web.xml,但我不知道如果没有它,如何声明JSF servlet.

Actually the servlet was working fine when i was declaring it in the web.xml(the commented code) but not when i used the annotation. By the way , i would like to know if i can get rid of the web.xml when this problem will be resolved, but i don't know how the JSF servlet will be declared without it.

感谢帮助!

推荐答案

@WebServlet批注中添加loadOnStartup=1属性,以使servlet在应用程序启动时加载.此属性类似于在 web.xml 中找到的<load-on-startup/>元素.

Add the loadOnStartup=1 attribute to your @WebServlet annotation to cause the servlet to load on app startup. This attribute is analogous to the <load-on-startup/> element you'll find in the web.xml.

    @WebServlet(name="AjaxRelaisServlet",loadOnStartup=1,urlPatterns={"/AjaxRelaisServlet"})

当您拿着锤子时,每个问题都像钉子一样.

When you have a hammer, every problem looks like a nail.

关于完全替换 web.xml 的问题,您应该意识到基于注释的模型当前无法实现某些功能.例如,仅使用注释(AFAIK)不能实现过滤器排序.另外,您应该意识到一个具体的配置文档是自我文档.您的系统维护者可以看一下web.xml并以配置的方式弄清楚您的应用程序中发生了什么.将其与仅注释的体系结构进行对比.弄清楚系统所有各部分的接线将非常艰辛.

On the issue of replacing the web.xml entirely, you should be aware that there are some things that the annotations based model currently cannot achieve. Filter ordering, for example, cannot be achieved with annotations only (AFAIK). Also, you should realise thata concrete configuration document is self-documenting. Maintainers of your system can take one look at the web.xml and figure out what's going on in your app, config wise. Contrast that with an annotations-only architecture. It'll be painstaking to figure out the wiring of all the pieces of the system.

这篇关于Servlet 3.0不会在应用程序启动时加载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆