首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >web.xml/myproject-servlet.xml与web.xml/web.xml

web.xml/myproject-servlet.xml与web.xml/web.xml
EN

Stack Overflow用户
提问于 2014-04-02 08:23:08
回答 2查看 1.6K关注 0票数 2

我花了几天时间修复Spring项目中的bug。很长时间以来,我在错误日志中的主要问题是:

代码语言:javascript
复制
Bean already exists

我有两个文件:

代码语言:javascript
复制
WEB-INF/myproject-servlet.xml
WEB-INF/web.xml

首先,我可以输入以下内容(假设我有一个应用程序来管理动物园里的动物):

代码语言:javascript
复制
<context:component-scan base-package="com.my.package.animals" />

有了这个(正如我所理解的),我们正在启用Spring自动发现。所以现在,当我们运行我们的应用程序时,Spring将从这个包中获取所有类,稍后它将遍历resources目录中的所有配置文件,并初始化所有bean(放置在配置文件中,这些文件与给定的包相关联)。

第二个,web.xml包括这样的行

代码语言:javascript
复制
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/myproject-servlet.xml</param-value>
</context-param>

我还可以将路径放到我的配置文件中,例如:

代码语言:javascript
复制
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:animals-config.xml</param-value>
</context-param>

现在,我在myproject-servlet.xml中有了“自动检测”,对于相同的对象,我在web.xml中有了context-param

我的问题是,是否有可能"Bean已经存在“的错误就是由此而来的?我几乎可以肯定,是的,我检查了所有的beans,并且没有副本。

所以我有另外一个问题。做这个的好方法是什么?当我创建新的配置文件时,应该在哪里通知我的应用程序呢?在myproject-servlet.xmlweb.xml中。我真的需要清理我的申请,我将从这开始。

我检查了一些示例,人们在web.xml文件Simple example中不放置一个以上的Simple example

提前谢谢你

好吧,我真的快解决我的问题了。

假设我有两个包裹:

代码语言:javascript
复制
com.my.pckg.a
com.my.pckg.b

带类

代码语言:javascript
复制
com.my.pckg.a.ClassA
com.my.pckg.b.ClassB

我在myproject-servlet.xml中添加了以下行:

代码语言:javascript
复制
<context:component-scan base-package="com.my.pckg.a" />

我有一个配置文件myconfig.xml,里面有基于类、ClassA、ClassB的bean。

假设我们有带有ids的bean,如下所示:

代码语言:javascript
复制
ClassA: ida1, ida2
ClassB: idb1, idb2

所以,我正在运行我的码头服务器,问题是:

哪些bean将被初始化?I只声明包com.my.pckg.a,所以从myconfig.xml,spring应该只加载ida1ida2,但是这个文件也包含另一个类的bean。

所以最后..。?

最后,我想我发现了一个问题。在web.xml文件中,我有一行:

代码语言:javascript
复制
<context:component-scan base-package="com.dirty.pckg" />

在这个包中,我得到了一个带有@Controller注释的类@Controller。这个类的一个字段是:

代码语言:javascript
复制
private static ApplicationContext context = new ClassPathXmlApplicationContext("dirty-config.xml");

所以,当我的应用程序启动时,Spring采用DirtyClass (因为它有@)并映射它。因为操作系统是上下文的static修饰符,所以它会触发读取dirty-config.xml。因此,我无法理解为什么我的代码会以奇怪的方式运行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-02 13:37:44

web.xml文件是web应用程序的配置。这与春天无关。

contextConfigLocation上下文-param是一个spring侦听器,用于搜索Spring配置文件。这与春天有关。

您可以在web.xml中注册多个spring配置文件,但是这些文件不能定义相同的bean (bean id必须不同)。您还可以只有一个spring配置文件,它将自己包含如下所述的其他配置文件:http://www.mkyong.com/spring/load-multiple-spring-bean-configuration-file/

对另一个问题的答复:

添加组件扫描时,请spring扫描包com.my.pckg.a以获得诸如@Service、@Component、.组件扫描不是配置其余部分的筛选器,而是配置本身。因此,添加组件扫描不会改变myconfig.xml的行为。ida1、ida2和idb1、idb2都将被实例化。

我真的不明白你想用你的配置文件完成什么。也许,如果你能解释你的需求,我们可以帮你建立正确的配置。

票数 1
EN

Stack Overflow用户

发布于 2014-04-02 14:39:35

web.xml是配置文件。它拥有应用程序的类(如侦听器、过滤器、过滤器映射、servlet、servlet映射)、资源和配置(如上下文param、diplayname、错误页、会话-config)以及web服务器如何使用它们来处理web请求。当web服务器收到对应用程序的请求时,它使用web.xml将请求的URL映射到应该处理请求的代码。

接下来是web.xml中应该包含的内容和myProject-servlet.xml中应该包含的内容:

(1)在春季,ApplicationContext可以是分层的。一个ApplicationContext可以有多个子ApplicationContexts,并且只能有一个父。子ApplicationContext中的bean可以访问父类中的bean。

2)DispatcherServlet向处理程序(控制器)发送请求,具有可配置的处理程序映射、视图解析配置(您为应用程序使用的视图模板,例如jsp)。

记住这两点,我们的web.xml应该是:

代码语言:javascript
复制
    <!--Root web application context(Parent context) - beans for service or persistence layer should be in this -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:service-layer-beans.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <!--DispatcherServlet loads its configuration into its own context(chile context) and refers Root web application context as a parent, so it have access to beans in parent context and can override it but not vice versa.-->
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/myproject-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22805512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档