struts1的工作原理

    xiaoxiao2021-12-01  59

    一、Struts 的体系结构

       

    二、Struts 的流程

       

    三、具体原理

    1、 Struts的核心是ActionServlet,它本质上就是一个Servlet,在Web.xml中配置ActionServlet为自动启动,指明Struts的配置文件所在位置,并指明Struts中工作条件

        <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>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>struts</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> 2、  当服务器容器(Tomcat)启动时,自动加载ActionServlet,并执行init()方法,init方法会用Sax解析Web.xml中指定的Struts配置文件(struts-config.xml),读取里面的actionform-beanforwardexception及资源文件和插件信息,并将其保存到Struts相应的MAP缓存中。

    <struts-config> <form-beans> <form-bean name="OrderNoaudinGeneralInfoListForm" type="com.pcm.web.sfm.order.formbean.OrderNoaudinGeneralInfoListForm" /> <form-bean name="OrderSearchPassGeneralInfoListForm" type="com.pcm.web.sfm.order.formbean.OrderSearchPassGeneralInfoListForm" /> <form-bean name="OrderPaymentInfoForm" type="com.pcm.web.sfm.order.formbean.OrderPaymentInfoForm" /> </form-beans> <action-mappings> <action name="OrderGeneralInfoForm" scope="request" type="com.pcm.web.sfm.order.action.OrderGeneralInfoAction" path="/OrderGeneralInfo" validate="false" parameter="formAction"> <forward name="add" path="/sfm/order/AddOrderGeneralInfo.jsp"/> <forward name="addItem" path="/sfm/order/AddOrderGeneralItemInfo.jsp"/> <forward name="view" path="/sfm/order/ViewOrderGeneralInfo.jsp"/> </action> <!--领导审批、财务审批 --> <action name="OrderNoaudinGeneralInfoForm" scope="request" type="com.pcm.web.sfm.order.action.OrderNoaudinGeneralInfoAction" path="/OrderNoaudinGeneralInfo" validate="false" parameter="formAction"> <forward name="viewNoaudin_classic" path="/sfm/order/ViewNoaudinOrderGeneralInfo_classic.jsp" /> <forward name="Noaudin_classic" path="/sfm/order/OrderNoaudinGeneralInfo_classic.jsp" /> </action> <action name="OrderNoaudinGeneralInfoListForm" scope="request" type="com.pcm.web.sfm.order.action.OrderNoaudinGeneralInfoListAction" path="/OrderNoaudinGeneralInfoList" validate="false" parameter="formAction"> <forward name="listPass" path="/sfm/order/ListPassOrderGeneralInfos.jsp" /> <forward name="searchNoaudinList_classic" path="/sfm/order/SearchNoaudinOrderGeneralInfo_classic.jsp" /> </action> </action-mappings> </struts-config>

        ActionServlet是通过struts-config.xml配置文件来确定所要使用的Action的。

         Action类我们应该很熟悉,因为利用struts1框架进行项目开发时,我们大多数时候的工作就是重写     Action类的execute方法(当然,在开发大型WEB应用时,多半不叫execute,但其返回值,参数类型和参数个数是一样的),下面对execute的返回值,参数做个说明:

        返回值,ActionForward对象,(自:通过mapping对象的findForward(“add”)方法在xml中找到映射对应的jsp来表示Action的处理结果)表示Action处理请求结束后,需要转发的WEB资源(jsp页面等);    ActionMapping参数,这个参数实质上就是我们在struts-config.xml中配置的<action-mapping>可以通过打印                         mapping.getXXX来验证);    ActionForm,也就是在struts-config.xml中注册的ActionForm,用于封装页面表单数据;    HttpServletRequest,表示当前正在处理的HTTP请求,里面包含了要处理的请求信息,我们常用的request.getXXX;    HttpServletResponse,当前生成的返回给客户端的HTTP响应。

    客户端发送请求(Http Request),被struts1的核心控件器ActionServlet接收(通过Web.xml中<servlet-mapping><url-pattern>映射的路径),ActionServlet根据struts-config.xml里的映射关系找到对就的Action,若找不到就返回500错误到JSP页面。若有就Action里的 excute()方法里执行相应的逻辑操作,比如调用Model层的方法,然后通过ActionForward,跳转到对应的输出页面

    struts1的步骤:

    1.导入struts1在lib文件下的所有架包;

    2.把web-inf文件下的struts-config.xm文件复制到自己项目里面的web-inf下,把注释去掉只留下一对<struts-config>标签;

    3.把web-inf文件下的web.xml文件里的servlet配置复制到自己项目里面的web.xml里面;

    <servlet>     <servlet-name>action</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>

    4.创建有关的action类继承action重写他的execute方法;

    5.根据所写的有关action类配置<struts-config>文件里的东西如:

    <action-mappings>

    <action path="/addUser"   type="com.wangzhaohui.action.AddUserAction" >

     <forward name="scuess" path="/ok.jsp"></forward>  </action>

    </action-mappings>

    6.我们还可以写一个继承ActionForm的类,里面的写法和pojo类差不多,看需要接收哪些参数就写什么。配置好了就可来自动接收表单数据

    <struts-config>

    <form-beans> <form-bean  name="userForm" type="com.wangzhaohui.actionForm.UserActionForm"></form-bean> </form-beans> <action-mappings>

    <action path="/addUser"   type="com.wangzhaohui.action.AddUserAction"   name="userForm">  <forward name="scuess" path="/ok.jsp"></forward>  </action>

    </action-mappings>

    </struts-config>

    然后在action里面接收数据的时候就可以用如form.getXX来自动接受表单数据了。

    (view)视图层里面的.do请求都被actionservlet中央控制器(在web.xml里面配置好的)接收到,会读取配置文件(srtuts-config)找到相应的请求,分发给相应的action进行处理。进行处理的时候需要传几个参数:request,response,mapping(把配置拿出来封装成一个对象取出来), 还有一个actionForm(根据配置文件里配置的name=“”来自动接收表单数据,最终调用业逻辑,拿到一些数据返回回来,返回actionservlet的是一个actionForward的跳转信息,通过mapping.findForward找到然后servlet里面它会帮你自动的挑战到相应的页面

    转载请注明原文地址: https://ju.6miu.com/read-679583.html

    最新回复(0)