Struts原理及环境搭建

struts是一个基于MVC的Web开发框架。使用Struts的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。如果我们想混合使用Servlets和JSP的优点来建立可扩展的应用,struts是一个不错的选择。
那么学习struts首先就是要理解它的框架实现原理,以及如何搭建它的开发环境。
正如上所说,struts是基于MVC的,其框架原理如下:

0_13193375420051.gif

ActionServlet 是一个中央控制器,核心控制类,它与一般的servlet一样继承与HttpServlet。
ActionForm 用于页面收集数据,其实可以理解为页面数据的实体类。并且它可以自动转换成相应的数据类型,如age是int类型,那么从ActionForm获取getAge时的类型也会是int类型,而不用以前类似(Integer)request.getAttribute("age")那样强制转换了。需要注意的是ActionForm的get、set方法后的名称必须与页面中数据名称相同,且首字母大写,(如:页面为age,ActionForm中则为getAge、setAge)
Action 是业务逻辑层控制器,返回类型为ActionForward,他是底层Model的核心控制类,根据业务逻辑来组建表单数据与Model层的交流调用,处理完业务逻辑后返回最终要转向的页面信息ActionForward类。
ActionForward 是封装了页面转向信息的一个对象,也可以看做是一个实体类。目的是方便信息传递和调用。

0_1319337581jIwF.gif

Struts环境搭建
1. 首先要下载struts的jar包,地址 http://struts.apache.org/
2. 解压后将lib文件夹里的jar包都加入到项目中
3. 在webapps文件夹中解压struts-blank.war,将其中的struts-config.xml拷贝到项目中
4. 配置web.xml部署ActionServlet。这个格式是相对固定的,所以一般复制即可
  1. <servlet>

  2. <servlet-name>action</servlet-name>

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

  4. <init-param>

  5. <param-name>config</param-name>

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

  7. </init-param>

  8. <init-param>

  9. <param-name>debug</param-name>

  10. <param-value>2</param-value>

  11. </init-param>

  12. <init-param>

  13. <param-name>detail</param-name>

  14. <param-value>2</param-value>

  15. </init-param>

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

  17. </servlet>


  18. <servlet-mapping>

  19. <servlet-name>action</servlet-name>

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

  21. </servlet-mapping>

<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>
    <init-param>
        <param-name>debug</param-name>
        <param-value>2</param-value>
    </init-param>
    <init-param>
        <param-name>detail</param-name>
        <param-value>2</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>
 
<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>
5. 配置struts-config.xml部署Action、ActionForm。其中type均为你项目中Action和ActionForm所在包的完整路径;name可以随便起,但是Action中的name必须与它用到的ActionForm的name相一致;再有就是action中要添加scope="request"这个属性,因为scope默认是session,这个可以根据实际情况自己定。
  1. <struts-config>

  2. <form-beans>

  3. <form-beanname="loginForm"type="com.wang.struts.LoginActionForm"></form-bean>

  4. <!-- 可以有多个ActionForm -->

  5. </form-beans>


  6. <action-mappings>

  7. <actionpath="/login"type="com.wang.struts.LoginAction"name="loginForm"scope="request">

  8. <forwardname="success"path="/login_success.jsp"></forward>

  9. <forwardname="error"path="/login_error.jsp"></forward>

  10. </action>

  11. <!-- 可以有多个Action -->

  12. </action-mappings>

  13. </struts-config>

<struts-config>
    <form-beans>
        <form-bean name="loginForm" type="com.wang.struts.LoginActionForm"></form-bean>
        <!-- 可以有多个ActionForm -->
    </form-beans>
 
    <action-mappings>
        <action path="/login" type="com.wang.struts.LoginAction" name="loginForm" scope="request">
            <forward name="success" path="/login_success.jsp"></forward>
            <forward name="error" path="/login_error.jsp"></forward>
        </action>
        <!-- 可以有多个Action -->
    </action-mappings>
</struts-config>

6. 必须继承Action的类。代码示例:

  1. package com.wang.struts;  


  2. import javax.servlet.http.HttpServletRequest;  

  3. import javax.servlet.http.HttpServletResponse;  


  4. import org.apache.struts.action.Action;  

  5. import org.apache.struts.action.ActionForm;  

  6. import org.apache.struts.action.ActionForward;  

  7. import org.apache.struts.action.ActionMapping;  


  8. publicclass LoginAction extends Action {  

  9. public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {  

  10.        LoginActionForm loginActionForm = (LoginActionForm)form;  

  11.        String username = loginActionForm.getUsername();  

  12.        String password = loginActionForm.getPassword();  

  13. if ("admin".equals(username) && "admin".equals(password)) {  

  14. return mapping.findForward("success");  

  15.        } else {  

  16. return mapping.findForward("error");  

  17.        }  

  18.    }  

  19. }  

package com.wang.struts;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
 
public class LoginAction extends Action {
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        LoginActionForm loginActionForm = (LoginActionForm)form;
        String username = loginActionForm.getUsername();
        String password = loginActionForm.getPassword();
        if ("admin".equals(username) && "admin".equals(password)) {
            return mapping.findForward("success");
        } else {
            return mapping.findForward("error");
        }
    }
}

7. 必须继承ActionForm的类。示例代码:

  1. package com.wang.struts;  


  2. import org.apache.struts.action.ActionForm;  


  3. publicclass LoginActionForm extends ActionForm {  

  4. private String username;  

  5. private String password;  

  6. public String getUsername() {  

  7. return username;  

  8.    }  

  9. publicvoid setUsername(String username) {  

  10. this.username = username;  

  11.    }  

  12. public String getPassword() {  

  13. return password;  

  14.    }  

  15. publicvoid setPassword(String password) {  

  16. this.password = password;  

  17.    }  

  18. }  

package com.wang.struts;
 
import org.apache.struts.action.ActionForm;
 
public class LoginActionForm extends ActionForm {
    private String username;
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}
8. login.jsp、success.jsp、error.jsp这三个页面略。需要注意的就是login.jsp中的页面元素要注意与ActionForm中的对应。
好啦,这样struts的环境框架就基本搭建好了。以上这都是学习Struts的基础,因此必须多加练习呀。