注册页面中用到了<s:head theme="ajax" />来引入dojo,做了一个简单的检测用户名是否存在的ajax效果。昨天还好好的,今天页面装载后就报"dojo未定义"的js错误。打开浏览器的查看源代码,tag起效了,在浏览器地址栏中敲struts/dojo/dojo.js,确实找不到文件。奇了怪了,是不是谁把struts包里的dojo文件给删除了?一顿好找,没问题。干脆新建一个jsp,只放<s:head theme="ajax" />,直接对其访问,坏了,jsp页面甩出一大堆错误,在org.apache.struts2.views.jsp.TagUtils.getStack(TagUtils.java:58)中抛出了NullPointerException。翻出源代码,一顿找,问题出现在
[code]Dispatcher du = Dispatcher.getInstance();
Map extraContext = du.createContextMap(new RequestMap(req),
req.getParameterMap(),
new SessionMap(req),
new ApplicationMap(pageContext.getServletContext()),
req,
res,
pageContext.getServletContext());[/code]
调试显示du为null。该request的Dispatcher没初始化?赶紧到web.xml看看,原来
[code] <filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>[/code]
被同事改为
[code] <filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>[/code]
这样.jsp文件没走FilterDispatcher,Dispatcher du = Dispatcher.getInstance()当然为null了。原来struts的tag用法比较严格:所在jsp必须经过FilterDispatcher。突然灵光一现,由此及彼,jsp不好用了,js,css不也一样的道理吗?遂赶紧加上:
[code]<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/struts/*</url-pattern>
</filter-mapping>[/code]
测试通过。
[code]Dispatcher du = Dispatcher.getInstance();
Map extraContext = du.createContextMap(new RequestMap(req),
req.getParameterMap(),
new SessionMap(req),
new ApplicationMap(pageContext.getServletContext()),
req,
res,
pageContext.getServletContext());[/code]
调试显示du为null。该request的Dispatcher没初始化?赶紧到web.xml看看,原来
[code] <filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>[/code]
被同事改为
[code] <filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>[/code]
这样.jsp文件没走FilterDispatcher,Dispatcher du = Dispatcher.getInstance()当然为null了。原来struts的tag用法比较严格:所在jsp必须经过FilterDispatcher。突然灵光一现,由此及彼,jsp不好用了,js,css不也一样的道理吗?遂赶紧加上:
[code]<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/struts/*</url-pattern>
</filter-mapping>[/code]
测试通过。