struts配置步骤:
1:第一步导入struts包.
2:第二步在WEB-INF/下创建一个struts-config.xml.需要使用dtd。
3:第三步在web.xml中配置。servlet-class使用apche的actionservlet。在初始化容器的时候,加载struts-config,所以需要配置一个init-param进行初始化struts-config.
4:第四步:在struts-config中,配置action-mapping和form-beans。
详细讲解action-mapping和form-beans:
在action-mapping中,配置action。在action中进行配置如下属性:
path="/login" --页面传上来的path
name="loginForm" --这个是传入form-beans中。用来获取数据和验证数据。
type="com.lovo.action.loginAction" --用哪个业务类来处理
validate="true" --是否验证
input="error.jsp" --验证失败所要跳转的页面。
在form-bean是中配置如下属性:
<form-bean name="loginForm" --和action中的name必需一致。
type ="com.lovo.formbean.loginForm" --javabean
></form-bean>
<forward name="success" type="/success.jsp"> --跳转页面
讲解一下struts的工作原理:
1:首先是客户端通过一个form表单的action如:login.do,找到服务器的web.xml的url-pattern进行映射到servlet-class,需要注意的是,在这里的servlet-class是apache的actionservlet。通过它找到struts-config进行解析strust-config的配置文件。在struts-config首先找到action-mapping中的action中的path与页面上的action进行对应。根据action的不同,所找到action也不同。找到path过后,就是对应的一个javabean。也就是上面配置的form-beans。通过form-bean的name和type可以对应到该javabean,需要注意:javabean的的属性名称必需与表单种的name一致。这样我们才能通过javabean获取到表单中的数据,也可以有效的验证表单中的数据。接下来就是type属性。既然我们提交了一个请求上来,我们需要对该请求进行业务的处理,所以利用type属性可以决定用哪一个业务类来进行处理该请求的业务。在处理完业务后,可以返回一个所要跳转的页面。那就是formward进行设置name来找到action中的forward进行页面的跳转.
Struts的工作流程
对于采用Struts框架的Web应用,在Web应用启动时就会加载兵初始化ActionServlet,ActionServlet从struts- config.xml文件中读取配置信息,把它们存放到各种配置对象中,例如Action的映射信息存放在ActionMapping对象中。
当ActionServlet接受到一个客户请求时,将执行如下流程。
流程:
(1)减缩和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效的信息。
(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。
(3)根据配置信息决定是否需要表单验证。如果需要验证,就调用ActionForm的validate()方法。
(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象,就表示表单验证成功。
(5)ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action。如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法。
(6)Action的execute()方法返回一个ActionForward对象,ActinoServlet再把客户请求转发给ActionForward对象只想的JSP组件。
(7)ActionForward对象指向的JSP组件生成动态网页,返回给客户。
对于以上流程的流程(4),如果ActionForm的validate()方法返回一个或多个ActionMessage的ActionErrors对象,就表示表单验证失败,此时ActionServlet将直接把请求转发给包含用户提交表单的JSP组件。再这种情况下,不会再创建Action对象并调用Action的execute()方法。