Struts是如何实现MVC的

来源:互联网 发布:巨人网络借壳后股价 编辑:程序博客网 时间:2024/04/30 10:29

转载自:http://blog.csdn.net/laner0515/article/details/11266827


上篇文章说到用servlet实现的一些弊端,下面,我们就解决一下这个问题,我们用struts来实现一个登陆的实例。

首先,了解一下struts与MVC的一一对应关系:

Model:The Model portion of an MVC-based system can be often bedivided into two major subsystems -- the internal state of the system and theactions that can be taken to change that state. (from apache softwarefoundation)

Model是由ActionActionForm等构成。Action对象封装了具体的处理逻辑,调用业务逻辑模块,可以用JavaBeanEJB等组件技术来处理数据库的访问,并且把响应提交到合适的View组件中。

View:The View portion of a Struts-based application is mostoften constructed using JavaServer Pages (JSP) technology and PresentationComponents. (from apache software foundation)

View部分是通过JSP技术实现的。Struts还提供了自定义的标记库,通过使用这些自定义标记创建的JSP表单,可以实现和Model部分中的ActionForm的映射,完成对用户数据的封装。

 Controller: ActionServlet and ActionMapping

Controller功能由ActionServletActionMapping对象构成,核心是ActionServlet,它用来接受客户端的请求。ActionServlet包括一组基于配置的ActionMapping对象,每个ActionMapping对象实现了一个请求到一个具体的Model部分中Action处理器对象之间的映射。

 

用一个图简单说明一下struts:



同时,这里是一般struts的调用流程:


我们根据这个流程来实现一下用户登录功能:

 

在这里,有一个非常重要的配置就是struts-config

[html] view plaincopy
  1. <form-beans>  
  2.     <form-bean name="loginForm" type="com.bjpowernode.struts.LoginActionForm"/>  
  3.           
  4. </form-beans>  
  5. <action-mappings>  
  6.     <action path="/login"  
  7.             type="com.bjpowernode.struts.LoginAction"  
  8.             name="loginForm"  
  9.             scope="request"  
  10.             >  
  11.         <forward name="success" path="/login_success.jsp"></forward>          
  12.         <forward name="error" path="/login_error.jsp"></forward>  
  13.     </action>  
  14. </action-mappings>  
  15.   
  16. eb的配置:  
  17.   <servlet>  
  18.    <servlet-name>action</servlet-name>  
  19.    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>  
  20.    <init-param>  
  21.      <param-name>config</param-name>  
  22.      <param-value>/WEB-INF/struts-config.xml</param-value>  
  23.    </init-param>  
  24.    <init-param>  
  25.      <param-name>debug</param-name>  
  26.      <param-value>2</param-value>  
  27.    </init-param>  
  28.    <init-param>  
  29.      <param-name>detail</param-name>  
  30.      <param-value>2</param-value>  
  31.    </init-param>  
  32.    <load-on-startup>2</load-on-startup>  
  33.  </servlet>  
  34.   
  35.   
  36.  <!-- Standard Action Servlet Mapping -->  
  37.  <servlet-mapping>  
  38.    <servlet-name>action</servlet-name>  
  39.    <url-pattern>*.do</url-pattern>  
  40.  </servlet-mapping>  

LoginAction类:

[html] view plaincopy
  1.  package com.bjpowernode.struts;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5.   
  6. import org.apache.struts.action.Action;  
  7. import org.apache.struts.action.ActionForm;  
  8. import org.apache.struts.action.ActionForward;  
  9. import org.apache.struts.action.ActionMapping;  
  10.   
  11. /**  
  12.  * 登陆Action  
  13.  * 负责取得表单数据、调用业务逻辑、返回转向信息  
  14.  * @author laner  
  15.  *  
  16.  */  
  17. public class LoginAction extends Action {  
  18.   
  19.       
  20.     public ActionForward execute(ActionMapping mapping, ActionForm form,  
  21.             HttpServletRequest request, HttpServletResponse response)  
  22.             throws Exception {  
  23.         LoginActionForm laf = (LoginActionForm)form;  
  24.         String username = laf.getUsername();  
  25.         String password = laf.getPassword();  
  26.           
  27.         if("admin".equals(username) && "admin".equals(password)){  
  28.             //登陆成功  
  29.             return mapping.findForward("success");  
  30.         }else{  
  31.             //登陆失败  
  32.             return mapping.findForward("error");  
  33.         }  
  34.           
  35.         //return super.execute(mapping, form, request, response);  
  36.     }  
  37.   
  38. }  

LoginActionForm类,注意表单的属性必须和ActionForm中的get和set的属性一致

[html] view plaincopy
  1. package com.bjpowernode.struts;  
  2.   
  3. import org.apache.struts.action.ActionForm;  
  4.   
  5. /*  
  6.  * 登陆ActionForm,负责表单数据收集  
  7.  * 表单的属性必须和ActionForm中的get和set的属性一致  
  8.  *   
  9.  */  
  10.   
  11. public class LoginActionForm extends ActionForm {  
  12.     public String getUsername() {  
  13.         return username;  
  14.     }  
  15.     public void setUsername(String username) {  
  16.         this.username = username;  
  17.     }  
  18.     public String getPassword() {  
  19.         return password;  
  20.     }  
  21.     public void setPassword(String password) {  
  22.         this.password = password;  
  23.     }  
  24.     private String username;  
  25.     private String password;  
  26. }  


同时,看一下我们的表单:

[html] view plaincopy
  1. <form action="login.do" method = "post">  
  2.         用户名:<input type = "text" name ="username"><br>  
  3.         密     码:<input type ="text" name="password"><br>  
  4.         <input type ="submit" value="登陆"><br>  
  5.     </form>  

这样,基本上就完成了,而且解决了之前遗留的问题,但是我们仅仅做出来是不够的,我们需要明白他的大概工作原理,下面用一张时序图来表述一下利用struts的大概调用关系



 

所以,当我们一步步调用的时候,就发现我们之前servlet中写的其实就是一个简易的struts,他把我们认为很繁琐的东西进行了抽象与封装,但是在使用struts框架时,因为他必须符合多种情况,所以让我们的系统做了很多对当前功能来说无用的判断,所以,sturts并不能提高程序运行的效率,相反,它反而降低了效率,但是,它使开发效率和维护效率大大增加了,这也就是使用框架的好处之一。

0 0
原创粉丝点击