在创建Action的时候,从form角度去看有两种可能,一种是带form的Action,另一种是不带form的Action,所以在使用这两种Action的时候有几种情况要注意:
1.比如做一个搜索的功能,因为form里需要提交的数据只有一个字段,此种情况下也许为了简单,你并不想为这一个字段建一个form,所以你没有建form,而是想在action里通过request.getParameter("keyword")这种方式得到表单里的值,因此你建了一个不带form的action用来做Controller。在jsp页面里也许你会这样写:
<html:form action="/search">
<input type="text" name="keyword"/>
<input type="submit" value="搜索"/>
</html:form>
运行一下,发现在访问这个jsp页面的时候报错,为什么呢?我的确有path="/search"的action啊,好下面我们来分析一下,当你使用struts的<html:form>标签的时候,其实struts为你做了以下一些事情:
1.先看一下,web.xml里配置struts中有以下代码段:
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
这个struts-config.xml文件在Tomcat容器启动完毕后就已经加载了,此时struts框架就可以读取里面的内容了。
2.当你访问jsp页面,并且页面加载到<html:form>标签的时候,就会触发struts框架的部分程序运行:
(1)struts会根据form里的action路径在struts-config.xml文件里进行匹配,如果匹配不到,直接报错。
(2)如果匹配到了,继续寻找此action所对应的form。
(3)找到后将form的名字填充到普通HTML标签里的form的name属性里。
(4)与此同时,struts会按照此form的名字在指定的范围内找有没有对应的formbean存在。
(5)如果没有找到formbean,struts就会按照这个form名字利用java的反射机制创建出一个formbean实例来。
3.看完上面的第2点后,我们来想一想如果在struts-config.xml里找到了action而没有找到对应的form,会发生什么情况?在执行上面的(4)的时候会有异常出现,原因如下:
form的名字=null;
request.getAttribute(null);
此时就引发了一个空指针异常,显而易见这是struts所不能容忍的,于是乎,struts在此之前就要判断form的名字是不是null,是的话new一个自己的异常出来,大家也看的清楚些。
javax.servlet.ServletException: javax.servlet.jsp.JspException: Cannot retrieve definition for form bean null on action search.do
----------------------------------------------------------------------------------
如果把jsp里的代码改动如下:
<form action="search.do"> 《---这里换成了普通的form标签
<input type="text" name="keyword"/>
<input type="submit" value="搜索"/>
</form>
此时能够正常运行,因为此种写法不会触发struts框架执行上面的那么多的流程,自然也就能够正常运行了。