我正在尝试创建一个运行Struts2的嵌入式Tomcat。如何强制嵌入式Tomcat查找struts.xml文件?
第一步是制作一个可用的纯嵌入式Tomcat。 这是很容易通过下面这个教程做的事:
现在,把Struts2的工作,下一步是对Struts的库添加到POM文件。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.apache.struts.xwork</groupId>
<artifactId>xwork-core</artifactId>
<version>2.3.20</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.20</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>2.3.20</version>
</dependency>
小菜一碟!下一步:将Struts过滤器添加到web.xml。很简单,但是...嵌入式Tomcat不会加载web.xml文件!不管我做什么。解决方案:创建目标JAR文件夹下的文件夹,名为resources
,把web.xml文件有这个代码添加到服务器启动类:
tomcat.getHost().setAppBase(appBase);
StandardContext ctx = (StandardContext) tomcat.addWebapp(contextPath, appBase);
((StandardJarScanner) ctx.getJarScanner()).setScanAllDirectories(true);
ctx.getServletContext().setAttribute(Globals.ALT_DD_ATTR, "resources/web.xml");
tomcat.start();
这将从外部文件加载web.xml中。工作很好。现在我可以加载struts库。我可以通过查看服务器日志来看到。所有的struts加载的东西都在那里。
下一步:配置拦截器。在正常情况下,我需要将struts.xml文件放入“src \ main \ resources”文件夹(Eclipse)中。所以我尝试了这一点,而不是工作。
我的struts.xml文件只有一个指向实现Interceptor的类的拦截器标记。我喜欢使用注释来配置Actions,所以我没有在这个文件中的Actions标签。这个struts.xml文件和拦截器类来自我的其他系统,它的工作非常好。很简单。
麻烦:struts.xml文件没有加载。我可以通过发送来自拦截器的方法输出输出并且混淆struts.xml文件(将拦截器类名称更改为不存在的名称,混淆标记结构等)来弥补这一点。
我的问题:如何告诉嵌入式Tomcat加载struts.xml文件,或者更确切地说,我如何告诉struts引擎struts.xml的位置?
有趣的实验! –
你可以尝试(只是为了看看会发生什么):1)将struts.xml和action注释中的包的名称更改为不是'default'和2)的包,如果n.1不起作用,直接在动作文件上指定带有注释的拦截器堆栈?最后3)删除约定插件并在struts.xml中定义动作,以确保struts。xml实际上并没有被加载,并且没有被convention插件忽略或覆盖。 –
嗨安德烈。 struts.xml文件没有被收回......我可以完全弄乱这个文件(用一些lorem ipsum填充)......并且没有任何瑕疵。 –