这篇博客主要是介绍Struts2学习过程中的收获,其中有许多内容是来源于网络(其他人的博客),但是鉴于网络上的内容不是很系统或存在误区,所以在此整理一番,以作备用。

当今常见的开发框架:

    数据流程MVC框架:Struts2,WebWorker,Spring MVC....

    数据关系容器框架: Spring,GUICE....

    数据操作持久层框架:Hibernate,IBatis...

所谓框架就是把通用的东西给你封装起来,最基本的事件处理逻辑关系已经确定,开发人员只需要在此基础上构建自己的代码,开发业务。当然许多公司都有自己内部的开发框架,提高了代码复用率和开发效率,但是最基本的框架还是离不开开源的几个框架(Struts2、Spring、Hibernate...)。


(一)Struts2概述

Struts2是从struts1发展而来,但是和struts1在框架的设计思想上截然不同,Struts2结合了WebWork的设计思想,是一个轻量级的MVC流程框架。MVC包含三个基础部分:Model、View和Controller,这三部分以最小的耦合协同工作,增加的程序的可扩展和可维护性:

   1)Model:JavaBean、EJB的EntityBean

   2)View:JSP、Struts的TabLib

   3)Controller:Struts的ActionServlet、Action

Struts2的简单处理流程:

   1)浏览器发送请求

   2)中新处理器根据struts.xml文件查找对应的处理请求Action类

   3)WebWork的拦截器自动对请求应用通用功能,如:WorkFlow、Validation等

   4)如果struts.xml文件中配置了Method参数,则调用Method参数对应的Action类中的Method方法,否则调用通用的execute()方法处理用户请求。

   Struts2的系统架构:   

【struts2】 学习系列(一)_博客

    • 橙色是Servlet Filters,过滤器链,所有的请求都要经过Filter链的处理。

    • 浅蓝色是Struts Core,Struts2的核心部分,Struts2中已经做好的功能,在实际开发中不需要动它们。

    • 浅绿色是Interceptors,Struts2的拦截器。Struts2提供了很多默认的拦截器,可以完成日常开发的绝大部分工作;当然,也可以自定义拦截器,用来实现具体业务需要的功能。

    • 浅***是User Created,由开发人员创建的,包括struts.xml、Action、Template,是每个使用Struts2来进行开发的人员都必须会的。

   各个模块说明:

    • FilterDispatcher是整个Struts2的调度中心,根据ActionMapper的结果来决定是否处理请求,如果ActionMapper指出该URL应该被Struts2处理,那么它将会执行Action处理,并停止过滤器链上还没有执行的过滤器。

    • ActionMapper提供了HTTP请求与action执行之间的映射,简单点说,ActionMapper会判断这个请求是否应该被Struts2处理,如果需要Struts2处理,ActionMapper会返回一个对象来描述请求对应的ActionInvocation的信息。

    • ActionProxy是一个特别的中间层,位于Action和xwork之间,使得我们在将来有机会引入更多的实现方式,比如通过WebService来实现等。

    • ConfigurationManager是xwork配置的管理中心,通俗的讲,可以把它看做struts.xml这个配置文件在内存中的对应。

    • struts.xml是Stuts2的应用配置文件,负责诸如URL与Action之间映射的配置、以及执行后页面跳转的Result配置等。

    • ActionInvocation:真正调用并执行Action,它拥有一个Action实例和这个Action所依赖的拦截器实例。ActionInvocation会执行这些拦截器、Action以及相应的Result。

    • Interceptor(拦截器):拦截器是一些无状态的类,拦截器可以自动拦截Action,它们给开发者提供了在Action运行之前或Result运行之后来执行一些功能代码的机会。类似于我们熟悉的javax.servlet.Filter。

    • Action:动作类是Struts2中的动作执行单元。用来处理用户请求,并封装业务所需要的数据。

    • Result:Result就是不同视图类型的抽象封装模型,不同的视图类型会对应不同的Result实现,Struts2中支持多种视图类型,比如Jsp,FreeMarker等。

    • Templates:各种视图类型的页面模板,比如JSP就是一种模板页面技术。

    • Tag Subsystem:Struts2的标签库,它抽象了三种不同的视图技术JSP、velocity、freemarker,可以在不同的视图技术中,几乎没有差别的使用这些标签

(二)构建测试用例

        1.  使用eclipse构建Dynamic Web Project工程

        2.  下载struts2,以struts-2.3.20为例

        3.  将Struts2-2.3.20 lib中的如下jar包导入eclipse工程中的WEB-INF/lib

                commons-fileupload-1.3.1.jar

                commons-io-2.2.jar

                commons-lang-2.4.jar

                commons-lang3-3.2.jar

                freemarker-2.3.19.jar

                javassist-3.11.0.GA.jar

                ognl-3.0.6.jar

                struts2-core-2.3.20.jar

                xwork-core-2.3.20.jar

        4. WEB-INF下面创建web.xml,添加如下内容       

    <?xml version="1.0" encoding="UTF-8"?>
     <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns="http://java.sun.com/xml/ns/javaee" 
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
             http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
        <filter-name>struts2</filter-name>
        <filter>
            <filter-class>
                org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
            </filter-class>
        </filter>
        <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
        </filter-mapping>
        <welcome-file-list>
          <welcome-file>Login.jsp</welcome-file>
        </welcome-file-list>
    </web-app>

       5.   在src下面创建struts.xml,配置action,示例如下

    <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>
        <package name="test" extends="struts-default">
        <action name="login" class="com.rankexam.control.LoginAction">
            <!-- 定义三个逻辑视图和物理资源之间的映射 -->
            <result name="input">/Login.jsp</result>
            <result name="error">/Error.jsp</result>
            <result name="success">/Welcome.jsp</result>
        </action>
        </package>
    </struts>

       6.   创建相应的类文件和jsp文件

         1)创建LoginAction

    package com.rankexam.control;
    import javax.servlet.http.HttpServletRequest;  


    import org.apache.struts2.ServletActionContext;  

    import com.opensymphony.xwork2.ActionContext;  
    import com.opensymphony.xwork2.ActionSupport;  

    import java.io.*;
    public class LoginAction extends ActionSupport{  
   
    private static final long serialVersionUID = 1L;  
      
    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;  
    }  
    public String execute() throws Exception { 
        System.out.println("username:"+getUsername());
        System.out.println("password:"+getPassword());
        if(getUsername().equals("baidu") && getPassword().equals("baidu")){  
            ActionContext.getContext().getSession().put("user", getUsername());  
            return "success";  
        }else{  
            return "error";  
        }  
        }  
    }

    2)创建Login.jsp       

    <%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

    <title>login</title>  
    </head>  
    <body>  

        <form action="login" method="get">
            用户名:<input type="text" name="username"><br>
            密 码:<input type="password" name="password"><br>
            <input type="submit" value="login">
        </form>
    </body>  
    </html>

    3)Error.jsp       

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="ISO-8859-1"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
    <title>login failed</title>  
    </head>  
    <body>  
        sorry login failed!
    </body>  
    </html>

    4)Welcome.jsp       

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="ISO-8859-1"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
    <title>login success</title>  
    </head>  
    <body>  
        ${sessionScope.user} welcome to login !
    </body>  
    </html>

    7. 部署应用到Tomcat 7,访问http://localhost:8080/project-name/


    注:文中有些地方来源于网络。