Struts 2相关配置与基本操作演示(案例Demo)
阅读原文时间:2024年07月08日阅读:1

Struts 2

       Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts
2的体系结构与Struts 1的体系结构区别巨大。Struts 2以WebWork为核心,採用拦截器的机制来处理用户的请求,这种设计也使得业务逻辑控制器能够与ServletAPI全然脱离开,所以Struts 2能够理解为WebWork的更新产品。尽管从Struts 1到Struts 2有着太大的变化,可是相对于WebWork。Struts 2的变化非常小。【本文的演示项目以Struts 2.3.16 版本号为例】

【转载使用。请注明出处:http://blog.csdn.net/mahoking/article/details/35984507

Struts 2 IOC

           对于IoC来说。常见的就是Spring框架的了。而且在眼下Java EE开发中,使用SSH框架时,也主要依赖于Spring框架所提供的IoC功能。

但Struts2框架本身也提供了IoC的功能。

IoC(Inversion of Control)。随着Java社区中轻量级容器(Lightweight
Contianer)的推广而越来越为大家耳熟能详。

值得一提的是,Spring确实是一个值得学习的框架,由于有越来越多的开源组件,如iBATIS(新版本号为Mybatis)等。都放弃与Spring重叠的功能的开发。因此,Struts 2推荐大家通过Spring实现控制反转。

       控制反转(Inversion of Control。IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题。也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(DependencyInjection,简称DI)和依赖查找。依赖注入应用比較广泛。

         1、依赖查找(Dependency Lookup):容器提供回调接口和上下文环境给组件。EJB和Apache Avalon都使用这种方式。

         2、依赖注入(Dependency Injection):组件不做定位查询,仅仅提供普通的Java方法让容器去决定依赖关系。

后者是时下最流行的IoC类型。其又有接口注入(Interface Injection)。设值注入(Setter Injection)和构造子(器)注入(ConstructorInjection)三种方式。

【如想深入了解。须要读者自行拓展阅读】

Struts 2 ValueStack(值栈)与OGNL

        值栈ValueStack是Struts2框架核心组件,它提供对上下文信息和运行环境中元素的訪问机制。

其在底层实现了一个栈,但与传统栈的实现有所不同。

        值栈由下面4个层级对象组成:

        (1) 暂时对象:这些对象在请求处理过程中须要暂时保存。比方集合中当前正在迭代的元素;

        (2) 模型对象:当Action实现了ModelDriven接口时,模型对象就会被存放在栈中被运行的Action前面;否则不存在这个级别的内容;

        (3) Action对象:此对象为当前正在运行的action。

        (4) 命名对象:不论什么对象都能够被赋予一个标志符而成为命名对象。比方与HTTP同等作用域的对象集合相应的Struts2命名对象,#application、#session、#request、#attr和#parameters等。

        值栈的使用方式:

        栈的传统使用方式是压栈和出栈。

对于值栈则是通过使用OGNL(ObjectGraph Navigational Language对象导航语言)语法编写的特定表达式来查找,或者是在该表达式之上求值。

        OGNL表达式【该部分的应用。会在演示Demo中涉及】

  •  使用圆点符号和表达式求值
  •  调用被检索对象的方法
  •  结合自己定义标签使用

      常见使用方法:

      (1) person.name  调用getPerson().getName()

      (2) #session.user从会话对象中获取user属性对象

      (3) #session.shopcart.size()获取会话中购物车的数量

      (4) top
获取值栈最顶层对象 【该部分须要读者,自行拓展阅读】

       【转载使用。请注明出处:http://blog.csdn.net/mahoking/article/details/35984507

第一步:创建Web项目 StrutsDemo
第二步:加入所需的jar文件(包)   參见【相关Jar文件】
项目完整结构截图例如以下:

第三步:加入并编辑struts.xml



第四步:编写Action 对象【本例涉及IOC与非IOC两种方式】

1、 非IOC方式Action

/**
* 非IoC方式Action
* @author Mahc
*/
public class UnIOCmode {
private String message;
private ArrayList persons = new ArrayList();
public String method() {
// 获得ActionContext实例,以便訪问Servlet API
ActionContext ctx = ActionContext.getContext();

// 获取Parameter
// Map paramMap = ctx.getParameters(); 获取的对象为String[]
if(null!=ctx.getParameters().get("msg")){
String[] msg = (String[])ctx.getParameters().get("msg");
System.out.println(msg[0]);
}

    // Java  Servlet  HttpServletRequest 对象操作  
    String servletMsg = ServletActionContext.getRequest().getParameter("msg");  
    System.out.println(servletMsg);  
    //  

// ctx.getParameters().put("msg", "parameter信息"); 待检測

// 向application域存入数据
// Map applicationMap = ctx.getApplication();
ctx.getApplication().put("msg", "application信息");

// 向session域存入数据
// Map sessionMap = ctx.getSession();
ctx.getSession().put("msg", "seesion信息");

// 向request域存入数据
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("msg", "request信息");

    //////////////////////////////////////////  
    System.out.println("Struts2 非IOC 配置成功!

");
message = "Success";
//////////////////////////////////////////

    Person p = new Person();  
    p.setAge(25);  
    p.setBirthday(new Date());  
    p.setName("pla1");  
    persons.add(p);  
    // 为persons赋值  
    for(int i=1;i<4;i++){  
        Person person = new Person();  
        person.setAge(19+i);  
        person.setBirthday(new Date());  
        person.setName("pla"+i);  
        persons.add(person);  
    }  
    return "msg";  
}

public String getMessage() {  
    return message;  
}

public void setMessage(String message) {  
    this.message = message;  
}

public ArrayList<Person> getPersons() {  
    return persons;  
}

public void setPersons(ArrayList<Person> persons) {  
    this.persons = persons;  
}  

}

2、 IOC方式Action

/**
* IOC方式Action
* @author Mahc
*/
public class IOCmode extends ActionSupport implements ServletRequestAware ,SessionAware,ApplicationAware,ParameterAware{

private HttpServletRequest request;  
private Map<String,Object> sessionMap;  
private Map<String,Object> applicationMap;  
private Map parameterMap;

private ArrayList<Person> persons = new ArrayList<Person>();  
private String message;

public String getMessage() {  
    return message;  
}

public void setMessage(String message) {  
    this.message = message;  
}

public void setServletRequest(HttpServletRequest request) {  
    this.request = request;  
}

public void setSession(Map<String, Object> session) {  
    sessionMap = session;  
}

public void setApplication(Map<String, Object> application) {  
    applicationMap = application;  
}

public void setParameters(Map<String, String\[\]> parameter) {  
    parameterMap = parameter;  
    if(null!=parameterMap.get("ioc\_msg")){  
        String\[\] ioc\_msgs = (String\[\]) parameterMap.get("ioc\_msg");  
        System.out.println("ioc\_msg========="+ioc\_msgs\[0\]);  
    }  
}

public String method(){

// 向application域存入数据
applicationMap.put("ioc_msg", "application信息_ioc");

// 向session域存入数据
sessionMap.put("ioc_msg", "session信息_ioc");

// 向request域存入数据
request.setAttribute("ioc_msg", "request信息_ioc");

    //////////////////////////////////////////  
    System.out.println("Struts2  IOC 配置成功。");  
    message = "IOC\_SUCCESS";  
    //////////////////////////////////////////

    //□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□  
    Person p = new Person();  
    p.setAge(25);  
    p.setBirthday(new Date());  
    p.setName("pla1");  
    persons.add(p);  
    // 为persons赋值  
    for(int i=1;i<4;i++){  
        Person person = new Person();  
        person.setAge(19+i);  
        person.setBirthday(new Date());  
        person.setName("pla"+i);  
        persons.add(person);  
    }  
    //□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

    return "IOC\_SUCCESS";  
}

public ArrayList<Person> getPersons() {  
    return persons;  
}

public void setPersons(ArrayList<Person> persons) {  
    this.persons = persons;  
}  

}

第五步:编写相关JSP页面 

【IOC.jsp相应IOC方式。unIOC.jsp相应非IOC方式】

1、 unIOC.jsp

<%@ page language="java" import="java.util.\*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%>



    <title>首页</title>  
    <meta http-equiv="pragma" content="no-cache">  
    <meta http-equiv="cache-control" content="no-cache">  
    <meta http-equiv="expires" content="0">  
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
    <meta http-equiv="description" content="This is my page">  
</head>

<body>  
    <p>  
        parameters:  
        <s:property value="#parameters.msg" />  
    </p>  
    <p>  
        request.msg:  
        <s:property value="#request.msg" />  
    </p>  
    <p>  
        session.msg:  
        <s:property value="#session.msg" />  
    </p>  
    <p>  
        application.msg:  
        <s:property value="#application.msg" />  
    </p>  
    <p>  
        attr.msg:  
        <s:property value="#attr.msg" />  
    </p>  
    <hr />  
    <%=request.getAttribute("msg")%>  
    ${message}

    <h3>  
        用于过滤和投影(projecting)集合  
    </h3>

    <p>  
        年龄大于20  
    </p>

    <ul>  
        <!-推断年龄-->

        <s:iterator value="persons.{?#this.age>20}">

            <li>  
                <s:property value="name" />  
                - 年龄:  
                <s:property value="age" />  
            </li>

        </s:iterator>

    </ul>

    <p>  
        姓名为pla1的年龄:  
        <s:property value="persons.{?#this.name=='pla1'}.{age}\[0\]" />  
    </p>

    <hr />

    <h3>  
        构造Map  
    </h3>

    <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />

    <p>  
        The value of key "foo1" is  
        <s:property value="#foobar\['foo1'\]" />  
    </p>

    <hr />

    <h4>  
        %符号的使用方法  
    </h4>

    <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />

    <p>  
        The value of key "foo1" is  
        <s:property value="#foobar\['foo1'\]" />  
    </p>

    <p>  
        不使用%:  
        <s:url value="#foobar\['foo1'\]" />  
    </p>

    <p>  
        使用%:  
        <s:url value="%{#foobar\['foo1'\]}" />  
    </p>  
</body>  

2、 IOC.jsp

<%@ page language="java" import="java.util.\*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%>



首页

<body>  
    <p>  
        parameters:  
        <s:property value="#parameters.ioc\_msg" />  
    </p>  
    <p>  
        request.ioc\_msg:  
        <s:property value="#request.ioc\_msg" />  
    </p>  
    <p>  
        session.ioc\_msg:  
        <s:property value="#session.ioc\_msg" />  
    </p>  
    <p>  
        application.ioc\_msg:  
        <s:property value="#application.ioc\_msg" />  
    </p>  
    <p>  
        attr.msg:  
        <s:property value="#attr.ioc\_msg" />  
    </p>  
    <hr />  
    <%=request.getAttribute("ioc\_msg")%>  
    ${message}

    <h3>  
        用于过滤和投影(projecting)集合  
    </h3>

    <p>  
        年龄大于20  
    </p>

    <ul>  
        <!-推断年龄-->

        <s:iterator value="persons.{?

#this.age>20}">

            <li>  
                <s:property value="name" />  
                - 年龄:  
                <s:property value="age" />  
            </li>

        </s:iterator>

    </ul>

    <p>  
        姓名为pla1的年龄:  
        <s:property value="persons.{?

#this.name=='pla1'}.{age}[0]" />

    <hr />

    <h3>  
        构造Map  
    </h3>

    <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />

    <p>  
        The value of key "foo1" is  
        <s:property value="#foobar\['foo1'\]" />  
    </p>

    <hr />

    <h4>  
        %符号的使用方法  
    </h4>

    <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />

    <p>  
        The value of key "foo1" is  
        <s:property value="#foobar\['foo1'\]" />  
    </p>

    <p>  
        不使用%:  
        <s:url value="#foobar\['foo1'\]" />  
    </p>

    <p>  
        使用%:  
        <s:url value="%{#foobar\['foo1'\]}" />  
    </p>  
</body>  

第六步:编辑Action相应XML文件(struts-test.xml)

struts-test.xml文件位于src/ config/struts2文件夹下




/IOC.jsp
<action name="unioc_*" class="cn.mahaochen.web.UnIOCmode"

method="{1}">
/unIOC.jsp


第七步:測试操作
编辑index.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>


Struts2.3.16 高速使用

Struts2.3.16 高速使用




Struts2 非IOC方式


Struts2 非

IOC方式[含请求參数]


Struts2   IOC方式


Struts2

  IOC方式[含请求參数]





測试用URL

        http://127.0.0.1/StrutsDemo/test/unioc_method.action    非IOC方式測试
        http://127.0.0.1/StrutsDemo/test/ioc_method.action       IOC方式測试

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWFob2tpbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

  • struts2-core-2.3.16.jar
  • xwork-core-2.3.16.jar
  • commons-logging-1.1.3.jar
  • ognl-3.0.6.jar
  • commons-fileupload-1.3.jar
  • freemarker-2.3.19.jar
  • commons-io-2.2.jar
  • javassist-3.11.0.GA.jar
  • commons-lang-2.4.jar
  • commons-lang3-3.1.jar

下载演示项目 http://download.csdn.net/detail/ma_hoking/7561727

1、 http://www.java3z.com/cwbwebhome/article/article2/2938.html?id=1631
2、 http://blog.163.com/neu_lxb/blog/static/179417010201145104245861/

【转载使用,请注明出处:http://blog.csdn.net/mahoking/article/details/35984507