您的位置:首页 > 编程语言 > Java开发

Struts2配置问题终极解决方案

2016-05-18 16:54 357 查看
从下午忙到现在,终于找到问题的根源了。写下此文,与君共勉。

我的目录结构是这样的。



关于配置文件加载问题

控制台下面报错,提示错误信息如下:

严重: Exception starting filter struts2
Unable to load configuration. - [unknown location]
at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:428)
at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:69)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepa
reAndExecuteFilter.java:51)
·
·
·


如果你的程序出现了这个异常的话,那么恭喜你。和我犯了一些样的错误。那就是配置文件web.xml中的filter写错了。我之前的web.xml是这样写的。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>MyStruts2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<!--就错在这里,因为filter-name是Tomcat自动加载的要进行反射实例化Diapatcher的核心,所以名称一定要写正确-->
<filter-name>MyStruts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyStruts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>


正如上面代码中我的注释一样,这个过滤器的名称一定一定要写正确。千万不能自己随意的编写。


这一点我反思了一下,还是在学Servlet的时候的基础没有打好吧。导致对这个知识点的理解不够到位,以至于出错了。希望大家引以为戒!



所以正确的方法应该是下面这样:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>MyStruts2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>


配置文件加载能引起什么问题呢?

一旦配置文件加载出错了。可能刚开始运行的时候不会出现什么异常。但是一旦触发了某一个事件。错误就肯定会出现的。比如说。幸运的我又遇到了一个严重的问题。


我一直认为,现阶段遇到的问题越多。对自己的编程越好,这样才会有收获!



具体信息,如下:

There is no Action mapped for namespace[/] and action name[login] associated with context path[/MyStrusts2]


一开始没有怎么在意这个问题,但是后来在解决了配置文件出错之后,回过头来仔细的思考了一下。这个出错信息,其实也是给了我修复之前配置问题的一个线索的。咱们大致的翻译一下。


在命名空间为‘/’的目录下没有Action匹配。并且名称为login的action不能够和上下文路径为/MyStruts2匹配。



这就相当于是说了配置文件有问题了。所以遇到问题的时候还是要进行仔细的阅读的好!

struts.xml文件相关的异常

我们经常会遇到

There is no Action mapped for namespace / and action name


这就是struts.xml出错的明显的代表。

关于这个核心文件,想必大家都很清楚和它相关的原则了吧。


struts.xml一定要放到src目录下。而且一定要把单词拼写正确咯。

struts.xml的内容出错。一定要按照dtd文件严格约束来写。否则很容易出现错误的。

下面我来提供一个我自己的亲测正确的struts.xml。



<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- struts2的action必须放在一个指定的包空间下定义 -->
<package name="myaction"  extends="struts-default">
<action name="loginin" class="myaction.LoginAction">
<!-- 定义处理结果字符串和资源之间的映射关系 -->
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>


总结

经过了这次的bug修复事件,我明白了配置文件正确书写的正确性。其最重要的自己的基础还是有些欠缺的。没有从根本上把握住Tomcat与Java反射的工作的核心原理。所以才会想当然的自己写了个没用的文件了。请大家从我身上吸取这个教训,少走一些弯路。

学习Struts2框架,遇到问题是在所难免的,当我们遇到问题的时候应该感到高兴,前期遇到的问题越多,对我们越有帮助。

文章未完,待我遇到更新的bug时,再来补充!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: