struts开发步骤,struts执行顺序,struts常见错误汇总

struts1开发步骤:版本1.3.10

1.添加jar

2.配置主控制器ActionServlet

<servlet>

<servlet-name>struts</servlet-name>

<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

<init-param>

<param-name>config</param-name>

<param-value>/WEB-INF/struts-config.xml</param-value>

</init-param>

<load-on-startup>2</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>struts</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

3.添加struts配置文件struts-config.xml

4.编写子控制器及部署配置

---------------

struts1框架中核心API

ActionForm表单bean:属于视图组件,用于封装客户端请求参数。

每次请求创建新的ActionForm对象。

Action类:所有子控制器的父类。struts1框架默认只维护一个子控制器实例,

使用一个实例处理所有请求。因此Struts1中Action不是线程安全的。

ActionMapping类:与配置文件中action元素对应,存储映射信息,包括转发信息。

ActionForward:封装转发结果信息。

----------------------------------------------------------------------

Struts应用的完整执行顺序

1.启动容器

2.根据web.xml的配置,加载ActionServlet

注:如果配置了load-on-startup元素,则在容器启动时加载,

否则在用户发出请求时加载

3.加载ActionServlet后,根据init-param的顺序,加载参数

加载Struts框架的配置文件:struts-config.xml

加载debug

加载struts资源文件

4.ActionServlet解析strust-config.xml,并将元素封装成对象载入至内存

如果该配置文件不符合DTD格式规范,则容器会报异常

5.web服务器就绪

6.接受客户请求

7.客户发出对视图的请求,容器会根据用户请求的视图表单中的action属性值,

去查询在struts-config.xml文件中,是否存在相应的path

如果没有找到,将显示错误提示:Cannotretrievemappingforaction

(这说明,容器会在实例化ActionForm之前,分析视图的JSP语法,

然后对其进行两次编译,再根据视图编译后产生的servlet代码,去

和struts-config.xml中的action元素的path值比对,并返回给容器相应的信息)

如果找到,容器会实例化ActionForm(自定义的ActionForm)类,

然后执行reset方法,将所有的表单Bean属性初始化,接着调用其get方法,

用属性值去更新视图的控件值

(要注意的是:表单Bean的加载是在视图加载后完成的,

而且只要视图正确显示,该视图就已经和一个action元素绑定了,换句话说,

就是该视图已经和一个action元素对应的ActionMapping对象关联了)

8.客户请求一般是以表单的形式,提交的url以.do为后缀,web.xml中已经指定,

ActionServlet会拦截所有.do的请求串,因此,用户的请求会首先被ActionServlet拦截

9.客户提交表单,容器会根据该视图对应的action元素,

或者说是ActionMapping对象,去决定后续操作

10.表单提交,如果是action元素中的scope属性值为request,

则证明该表单Bean的生命周期仅在两个web资源的交互之间,

那么每次表单提交都会重新实例化表单Bean,而如果scope为session,

则其生命周期为一次完整会话,只要不关闭浏览器,容器不会每次都实例化表单Bean。

换个角度来思考,如果scope为request,那么表单Bean中的reset方法对我们来说是没有意义的,

因为每次我们使用的都是一个新的表单Bean对象,所以不需要重新对其值做初始化,

然后调用ActionForm中的set(重置)方法,将上一次的数据还原为初始值,

接着调用表单Bean中的get方法,使用表单Bean中的模型值,更新视图的控件值,

(因为视图的控件和表单Bean中的属性是绑定的)

接着调用了属性相应的set方法,保证将表单数据填充值表单Bean对象,

是该对象成为一个数据传输的DTO

下面根据action元素中的validate方法中的值,决定是否进行表单验证,

该属性的默认值为true

11.执行表单验证后,ActionServlet会根据validate方法返回的ActionErrors对象,

判断表单验证是否成功,如果返回的ActionErrors实例不为空,则代表表单验证没有通过,

将根据action元素中的input属性指定的页面,显示错误消息,如果返回的ActionErrors实例为空,

则证明表单验证通过,这时,ActionServlet会将表单对象,传递给Action类中的execute方法参数

12.ActionServlet实例化Action类

13.ActionServlet执行execute方法,将通过表单验证的数据,进行业务逻辑验证,

并返回相应的ActionForward实例给ActionServlet,

由ActionServlet决定调用哪个视图显示结果

----------------------------------------------------------------------

Struts常见错误汇总

1、“NobeanfoundunderattributekeyXXX”

在struts-config.xml里定义了一个ActionForm,但type属性指定的类不存在,

type属性的值应该是Form类的全名。或者是,在Action的定义中,

name或attribute属性指定的ActionForm不存在。

2、“CannotfindbeanXXXinanyscope”

在Action里一般会request.setAttribute()一些对象,

然后在转向的jsp文件里(用tag或request.getAttribute()方法)得到

这些对象并显示出来。这个异常是说jsp要得到一个对象,但前面的Action里

并没有将对象设置到request(也可以是session、servletContext)里。

可能是名字错了,请检查jsp里的tag的一般是name属性,

或getAttribute()方法的参数值;或者是Action逻辑有问题没有

执行setAttribute()方法就先转向了。

还有另外一个可能,纯粹是jsp文件的问题,例如会指定一个id值,

然后在循环里使用这个值作为name的值,如果这两个值不同,也会出现此异常。

(都是一个道理,request里没有对应的对象。)

3、“Missingmessageforkey"XXX"”

缺少所需的资源,检查ApplicationResources.properties文件里是否有jsp文件里

需要的资源,例如:

这行代码会找msg.name.prompt资源,如果AppliationResources.properties里没有

这个资源就会出现本异常。在使用多模块时,要注意在模块的struts-config-xxx.xml里

指定要使用的资源文件名称,否则当然什么资源也找不到,这也是一个很容易犯的错误。

4、“NogettermethodforpropertyXXXofbeanteacher”

这条异常信息说得很明白,jsp里要取一个bean的属性出来,但这个bean并没有这个属性。

你应该检查jsp中某个标签的property属性的值。例如下面代码中的cade应该改为code才对:

5、“CannotretrievemappingforactionXXX”

在.jsp的标签里指定action=''/XXX'',但这个Action并未在struts-config.xml里设置过。

6、HTTPStatus404-/xxx/xxx.jsp

Forward的path属性指向的jsp页面不存在,请检查路径和模块,对于同一模块中的Action转向,

path中不应包含模块名;模块间转向,记住使用contextRelative="true"。

7、没有任何异常信息,显示空白页面

可能是Action里使用的forward与struts-config.xml里定义的forward名称不匹配。

8、“Theelementtype"XXX"mustbeterminatedbythematchingend-tag"XXX".”

这个是struts-config.xml文件的格式错误,仔细检查它是否是良构的xml文件,

关于xml文件的格式这里就不赘述了。

9、“Servlet.init()forservletactionthrewexception”

一般出现这种异常在后面会显示一个关于ActionServlet的异常堆栈信息,

其中指出了异常具体出现在代码的哪一行。我曾经遇到的一次提示如下:

java.lang.NullPointerException

 atorg.apache.struts.action.ActionServlet.parseModuleConfigFile(ActionServlet.java:1003)

 atorg.apache.struts.action.ActionServlet.initModuleConfig(ActionServlet.java:955)

为解决问题,先下载struts的源码包,然后在ActionServlet.java的第1003行插入断点,

并对各变量进行监视。很丢人,把struts-config.xml文件弄丢了,

因此出现了上面的异常,应该是和CVS同步时不小心删除的。

10、“ResourcesnotdefinedforValidator”

这个是利用Validator插件做验证时可能出现的异常,这时你要检查validation.xml文件,

看里面使用的资源是否确实有定义,form的名称是否正确,等等。

如果有误,请大家联系我,谢谢大家的支持.

相关推荐