struts 订阅
Struts是Apache软件基金会(ASF)赞助的一个开源项目。它最初是Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。它通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller(MVC)设计模式的应用框架,是MVC经典设计模式中的一个经典产品。 展开全文
Struts是Apache软件基金会(ASF)赞助的一个开源项目。它最初是Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。它通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller(MVC)设计模式的应用框架,是MVC经典设计模式中的一个经典产品。
信息
使用人员
JavaWeb网站开发人员
外文名
Struts
平    台
Java
中文名
struts
实    质
基于MVC的WEB框架
struts结构
在Struts中,已经由一个名为ActionServlet的Servlet充当控制器(Controller)的角色,根据描述模型、视图、控制器对应关系的struts-config.xml的配置文件,转发视图(View)的请求,组装响应数据模型(Model)。在MVC的模型(Model)部分,经常划分为两个主要子系统(系统的内部数据状态与改变数据状态的逻辑动作),这两个概念子系统分别具体对应Struts里的ActionForm与Action两个需要继承实现超类。在这里,Struts可以与各种标准的数据访问技术结合在一起,包括Enterprise Java Beans(EJB),JDBC与JNDI。在Struts的视图(View)端,除了使用标准的JavaServer Pages(JSP)以外,还提供了大量的标签库使用,同时也可以与其他表现层组件技术(产品)进行整合,比如Velocity Templates,XSLT等。通过应用Struts的框架,最终用户可以把大部分的关注点放在自己的业务逻辑(Action)与 映射关系的配置文件(struts-config.xml)中。 [1] 
收起全文
精华内容
参与话题
问答
  • K8 Struts2 Exploit(Struts2综合漏洞利用工具)

    千次下载 热门讨论 2015-05-30 09:29:02
    Struts2漏洞检测工具 Struts2漏洞测试工具 K8 struts2 exploit Test Struts2 GetShell 目前已支持以下struts2漏洞编号 (S2-005 s2-009 s2-013 s2-016 s2-019 s2-020) [+] S2-020 CVE-2014-0094 支持GetShell (这洞...
  • Struts2——(1)Struts2入门

    千次阅读 多人点赞 2013-10-22 23:23:30
    1、Struts2历史,与Struts1的关系  两者的内部基于的原理完全不同,Struts2是基于WebWork发展而来的框架。  两者都是基于MVC实现的框架。  Struts1是Apach推出的。  WebWork是opensyfry推出的。  Strut2是...
    1、Struts2历史,与Struts1的关系
    两者的内部基于的原理完全不同,Struts2是基于WebWork发展而来的框架。
    两者都是基于MVC实现的框架。
    Struts1是Apach推出的。
    WebWork是opensyfry推出的。
    Strut2是以WebWork为核心,引入Struts1的特性(Struts2由Apach推出)。
    2、Struts2的特点
    (1)由Action组件承担Struts1中ActionForm和Action的功能。
    (2)Action非常灵活,可以使用一个普通的Class来充当。
    (3)Action可测性强。
    (4)提供了大量的Result组件(可以自定义),简化了处理响应的实现。
    (5)提供了大量的拦截器组件。
    (6)易于扩展、整合、维护。
    3、Struts2的MVC实现
    控制器实现:StrutsPrepareAndExecuteFilter 以前是(1.8之前)FilterDispatcher
    Servlet可以成为控制器,Filter也可以成为控制器(相似的特点:可以直接获得请求, 可以写大量java代码)
    视图实现:各种类型的Result,支持各种视图组件的响应
    struts2标签(框架自带的标签),提供了分支,循环,显示等功能。
    模型实现:普通的POJO(Action)更加灵活,
    ValueStack组件,用于封装请求相关信息,例如request、session等
    4、Strut2开发入门
    (1)创建web工程,引入Struts2 jar包
    jar包下载地址:http://struts.apache.org/download.cgi#struts216
    下载后解压的完整jar包如下图:

    至少需要如下6 个jar包:(注意:不可将jar包全部拷贝到lib下,里面部分plug-in插件jar包会冲突)

    struts2-core-2.1.6.jar

    freemarker-2.3.13.jar

    commons-logging-1.0.4.jar

    ognl-2.6.11.jar

    xwork-2.1.2.jar

    commons-fileupload-1.2.1.jar 

    (2)在web.xml中配置控制器,添加控制器的配置文件struts.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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
      <display-name>myproject</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
      <filter>
        <filter-name>struts2</filter-name>
        <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>
    </web-app>
    struts.xml可参考struts2-core jar包根目录下的struts-default.xml文件,格式完全相同,下面是部分配置:
    <struts>
    <package name="package名字" extends="struts-default">
    <action name="请求名"class="对应action路径">
    <result name="响应字符串" type="响应方式">xxx.jsp</result>
    </action>
    </package>
    </struts>
    注意:上面的请求名不要带扩展名
      struts2只响应扩展名为.action的请求,或者不带扩展名
      struts.xml放在src目录下
      Action中默认执行方法public String execute();


        
    展开全文
  • Struts2中的OGNL详解

    万次阅读 多人点赞 2011-10-07 22:54:06
    首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象...

     

    首先了解下OGNL的概念

    OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。

    此外,还得先需弄懂OGNL的一些知识:

     

    1.OGNL表达式的计算是围绕OGNL上下文进行的。
    OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。它里面可以存放很多个JavaBean对象。它有一个上下文根对象。
    上下文中的根对象可以直接使用名来访问或直接使用它的属性名访问它的属性值。否则要加前缀“#key”。

     

     

     

     

    2.Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。如:<s:propertyvalue="xxx"/>。

     

     

     

     

    3.Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。

     

     

     

     

    4.值栈(ValueStack) :
    可以在值栈中放入、删除、查询对象。访问值栈中的对象不用“#”。
    Struts2总是把当前Action实例放置在栈顶。所以在OGNL中引用Action中的属性也可以省略“#”。
     
    5.调用ActionContext的put(key,value)放入的数据,需要使用#访问。

    OGNL中重要的3个符号:#、%、$:

    #、%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分,需要时间的积累才渐渐弄清楚……
    1.#符号

    #符号的用途一般有三种。

    —    访问非根对象属性,例如#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute("msg") 。

    —    用于过滤和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#this.name=='pla1'}.{age}[0]。

    —    用来构造Map,例如示例中的#{'foo1':'bar1', 'foo2':'bar2'}。

    2.%符号

    %符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值,这个类似js中的eval,很暴力。

    3.$符号

    $符号主要有两个方面的用途。

    —    在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。

    —    在Struts 2框架的配置文件中引用OGNL表达式,例如:

     

    <validators>  
        <field name="intb">  
                <field-validator type="int">  
                <param name="min">10</param>  
                <param name="max">100</param>  
                <message>BAction-test校验:数字必须为${min}为${max}之间!</message>  
            </field-validator>  
        </field>  
    </validators> 

     

    下面通过代码对OGNL有更深的了解:

    action类OgnlAction.java:
    package com.tjcyjd.test.action;
    
    import java.util.Date;
    import java.util.LinkedList;
    import java.util.List;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.struts2.ServletActionContext;
    import org.apache.struts2.convention.annotation.Action;
    import org.apache.struts2.convention.annotation.Namespace;
    import org.apache.struts2.convention.annotation.ParentPackage;
    import org.apache.struts2.convention.annotation.Result;
    import org.apache.struts2.convention.annotation.Results;
    import org.springframework.stereotype.Controller;
    
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    
    @Controller
    @Namespace("/test")
    @ParentPackage("struts-default")
    @Results( { @Result(name = "success", location = "/other_test/showognl.jsp"),
    		@Result(name = "fail", location = "/bbs/admin_login.jsp"),
    		@Result(name = "input", location = "/bbs/admin_login.jsp") })
    public class OgnlAction extends ActionSupport {
    	private static final long serialVersionUID = -1494290883433357310L;
    	private List<Person> persons;
    
    	@Action("ognlTest")
    	public String ognlTest() throws Exception {
    		// 获得ActionContext实例,以便访问Servlet API
    		ActionContext ctx = ActionContext.getContext();
    		// 存入application
    		ctx.getApplication().put("msg", "application信息");
    		// 保存session
    		ctx.getSession().put("msg", "seesion信息");
    		// 保存request信息
    		HttpServletRequest request = ServletActionContext.getRequest();
    		request.setAttribute("msg", "request信息");
    		// 为persons赋值
    		persons = new LinkedList<Person>();
    		Person person1 = new Person();
    		person1.setName("pla1");
    		person1.setAge(26);
    		person1.setBirthday(new Date());
    		persons.add(person1);
    
    		Person person2 = new Person();
    		person2.setName("pla2");
    		person2.setAge(36);
    		person2.setBirthday(new Date());
    		persons.add(person2);
    
    		Person person3 = new Person();
    		person3.setName("pla3");
    		person3.setAge(16);
    		person3.setBirthday(new Date());
    		persons.add(person3);
    
    		return SUCCESS;
    
    	}
    
    	public List<Person> getPersons() {
    		return persons;
    	}
    
    	public void setPersons(List<Person> persons) {
    		this.persons = persons;
    	}
    }
    

    jsp页面showognl.jsp:
    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>  
      
    <%@ taglib prefix="s" uri="/struts-tags" %>  
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/ xhtml1/DTD/xhtml1-transitional.dtd">  
      
    <html xmlns="http://www.w3.org/1999/xhtml">  
      
    <head>  
      
        <title>Struts2 OGNL 演示</title>  
      
    </head>  
      
    <body>      
      
        <h3>访问OGNL上下文和Action上下文</h3>  
      
        <!-使用OGNL访问属性值-->  
      
        <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 />  
      
        <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>  
      
      	<hr />
       		<%  
                request.setAttribute("req", "request scope");  
                request.getSession().setAttribute("sess", "session scope");  
                request.getSession().getServletContext().setAttribute("app",  
                        "aplication scope");  
            %>  
       		1.通过ognl表达式获取 属性范围中的值  
            <br>  
            <s:property value="#request.req" />  
            <br />  
            <s:property value="#session.sess" />  
            <br />  
            <s:property value="#application.app" />  
            <br />  
            <hr>  
      
           2.通过<span style="background-color: #fafafa;">ognl表达式创建list 集合 ,并且遍历出集合中的值  
            <br>  
            <s:set name="list" value="{'eeeee','ddddd','ccccc','bbbbb','aaaaa'}"></s:set>  
            <s:iterator value="#list" var="o">  
                <!-- ${o }<br/> -->  
                <s:property />  
                <br />  
            </s:iterator>  
            <br />  
            <hr>  
      
           3.通过ognl表达式创建Map 集合 ,并且遍历出集合中的值  
            <br>  
            <s:set name="map"  
                value="#{'1':'eeeee','2':'ddddd','3':'ccccc','4':'bbbbb','5':'aaaaa'}"></s:set>  
            <s:iterator value="#map" var="o">  
                <!--      ${o.key }->${o.value }<br/>   -->  
                <!-- <s:property value="#o.key"/>-><s:property value="#o.value"/><br/>   -->  
                <s:property value="key" />-><s:property value="value" />  
                <br />  
            </s:iterator>  
            <br />  
            <hr>  
          4.通过ognl表达式 进行逻辑判断  
            <br>  
            <s:if test="'aa' in {'aaa','bbb'}">  
                aa 在 集合{'aaa','bbb'}中;  
            </s:if>  
            <s:else>  
                aa 不在 集合{'aaa','bbb'}中;  
            </s:else>  
            <br />  
            <s:if test="#request.req not in #list">  
                	不 在 集合list中;  
            </s:if>  
            <s:else>  
               	 在 集合list中;  
            </s:else>  
            <br />  
            <hr>  
            
           5.通过ognl表达式 的投影功能进行数据筛选  
            <br>  
            <s:set name="list1" value="{1,2,3,4,5}"></s:set>  
            <s:iterator value="#list1.{?#this>2}" var="o">  
                <!-- #list.{?#this>2}:在list1集合迭代的时候,从中筛选出当前迭代对象>2的集合进行显示 -->  
                ${o }<br />  
            </s:iterator>  
            <br />  
            <hr>  
           6.通过ognl表达式 访问某个类的静态方法和值  
            <br>  
            <s:property value="@java.lang.Math@floor(32.56)" />  
      
            <s:property value="@com.rao.struts2.action.OGNL1Action@aa" />  
            <br />  
            <br />  
            <hr>  
          7.ognl表达式 迭代标签 详细  
            <br>  
            <s:set name="list2"  
                value="{'aa','bb','cc','dd','ee','ff','gg','hh','ii','jj'}"></s:set>  
            <table border="1">  
                <tr>  
                    <td>索引 </td>  
                    <td>值</td>  
                    <td>奇?</td>  
                    <td> 偶?</td>  
                    <td>首?</td>  
                    <td> 尾?</td>  
                    <td>当前迭代数量</td>  
                </tr>  
                <s:iterator value="#list2" var="o" status="s">  
                    <tr bgcolor="<s:if test="#s.even">pink</s:if>">  
                        <td>  
                            <s:property value="#s.getIndex()" />  
                        </td>  
                        <td>  
                            <s:property />  
                        </td>  
                        <td>  
                            <s:if test="#s.odd">Y</s:if>  
                            <s:else>N</s:else>  
                        </td>  
                        <td>  
                            <s:if test="#s.even">Y</s:if>  
                            <s:else>N</s:else>  
                        </td>  
                        <td>  
                            <s:if test="#s.first">Y</s:if>  
                            <s:else>N</s:else>  
                        </td>  
                        <td>  
                            <s:if test="#s.isLast()">Y</s:if>  
                            <s:else>N</s:else>  
                        </td>  
                        <td>  
                        <s:property value="#s.getCount()"/>  
                    </td>  
                    </tr>  
                </s:iterator>  
            </table>  
            <br>  
            <hr>       
            
            
           8.ognl表达式:  if/else if/else 详细<br>  
            <% request.setAttribute("aa",0); %>  
            <s:if test="#request.aa>=0 && #request.aa<=4">  
                	在0-4之间;  
            </s:if>  
            <s:elseif test="#request.aa>=4 && #request.aa<=8">  
                	在4-8之间;  
            </s:elseif>  
            <s:else>  
               	 大于8;  
            </s:else>  
            <br>  
            <hr>  
        9.ognl表达式: url 详细<br>  
            <% request.setAttribute("aa","sss"); %>  
            <s:url action="testAction" namespace="/aa/bb">  
                <s:param name="aa" value="#request.aa"></s:param>  
                <s:param name="id">100</s:param>  
            </s:url>  
            <br/>  
            <s:set name="myurl" value="'http://www.baidu.com'"></s:set>  
            value以字符处理:   <s:url value="#myurl"></s:url><br>  
            value明确指定以ognl表达式处理:    <s:url value="%{#myurl}"></s:url>  
            <br>  
            <hr>  
        10.ognl表达式: checkboxlist 详细<br>  
            1> .list 生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>  
            name:checkboxlist的名字<br>  
            list:checkboxlist要显示的列表<br>  
            value:checkboxlist默认被选中的选项,checked=checked<br>  
            <s:checkboxlist name="checkbox1" list="{'上网','看书','爬山','游泳','唱歌'}" value="{'上网','看书'}" ></s:checkboxlist>  
            <br>  
           	 以上生成代码:<br>  
            <xmp>  
                <input type="checkbox" name="checkbox1" value="上网" id="checkbox1-1" checked="checked"/>  
                <label for="checkbox1-1" class="checkboxLabel">上网</label>  
                <input type="checkbox" name="checkbox1" value="看书" id="checkbox1-2" checked="checked"/>  
                <label for="checkbox1-2" class="checkboxLabel">看书</label>  
                <input type="checkbox" name="checkbox1" value="爬山" id="checkbox1-3"/>  
                <label for="checkbox1-3" class="checkboxLabel">爬山</label>  
                <input type="checkbox" name="checkbox1" value="游泳" id="checkbox1-4"/>  
                <label for="checkbox1-4" class="checkboxLabel">游泳</label>  
                <input type="checkbox" name="checkbox1" value="唱歌" id="checkbox1-5"/>  
                <label for="checkbox1-5" class="checkboxLabel">唱歌</label>"  
            </xmp>  
            2> .Map 生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>  
            name:checkboxlist的名字<br>  
            list:checkboxlist要显示的列表<br>  
            listKey:checkbox 的value的值<br>  
            listValue:checkbox 的lablel(显示的值)<br>  
            value:checkboxlist默认被选中的选项,checked=checked<br>  
            <s:checkboxlist name="checkbox2" list="#{1:'上网',2:'看书',3:'爬山',4:'游泳',5:'唱歌'}" listKey="key" listValue="value" value="{1,2,5}" ></s:checkboxlist>  
            <br>  
                           以上生成代码:<br>  
            <xmp>  
                <input type="checkbox" name="checkbox2" value="1" id="checkbox2-1" checked="checked"/>  
                <label for="checkbox2-1" class="checkboxLabel">上网</label>  
                <input type="checkbox" name="checkbox2" value="2" id="checkbox2-2" checked="checked"/>  
                <label for="checkbox2-2" class="checkboxLabel">看书</label>  
                <input type="checkbox" name="checkbox2" value="3" id="checkbox2-3"/>  
                <label for="checkbox2-3" class="checkboxLabel">爬山</label>  
                <input type="checkbox" name="checkbox2" value="4" id="checkbox2-4"/>  
                <label for="checkbox2-4" class="checkboxLabel">游泳</label>  
                <input type="checkbox" name="checkbox2" value="5" id="checkbox2-5" checked="checked"/>  
                <label for="checkbox2-5" class="checkboxLabel">唱歌</label>  
            </xmp>  
            <hr>  
    </body>  
    </html>  

    总结OGNL的使用方法:

    访问属性

    名字属性获取:<s:property value="user.username"/><br>

    地址属性获取:<s:property value="user.address.addr"/><br>

    访问方法

    调用值栈中对象的普通方法:<s:property value="user.get()"/><br>

    访问静态属性和方法

    调用Action中的静态方法:<s:property value="@struts.action.LoginAction@get()"/>

    调用JDK中的类的静态方法:<s:property value="@java.lang.Math@floor(44.56)"/><br>

    调用JDK中的类的静态方法(同上):<s:property value="@@floor(44.56)"/><br>

    调用JDK中的类的静态方法:<s:property value="@java.util.Calendar@getInstance()"/><br>

    调用普通类中的静态属性:<s:property value="@struts.vo.Address@TIPS"/><br>

    访问构造方法

    调用普通类的构造方法:<s:property value="new struts.vo.Student('李晓红' , '美女' , 3 , 25).username"/>

     

    1.5. 访问数组

    获取List:<s:property value="testList"/><br>

    获取List中的某一个元素(可以使用类似于数组中的下标获取List中的内容):

    <s:property value="testList[0]"/><br>

    获取Set:<s:property value="testSet"/><br>

    获取Set中的某一个元素(Set由于没有顺序,所以不能使用下标获取数据):

    <s:property value="testSet[0]"/><br> ×

    获取Map:<s:property value="testMap"/><br>

    获取Map中所有的键:<s:property value="testMap.keys"/><br>

    获取Map中所有的值:<s:property value="testMap.values"/><br>

    获取Map中的某一个元素(可以使用类似于数组中的下标获取List中的内容):

    <s:property value="testMap['m1']"/><br>

    获取List的大小:<s:property value="testSet.size"/><br>

     

    访问集合 – 投影、选择(? ^ $)

    利用选择获取List中成绩及格的对象:<s:property value="stus.{?#this.grade>=60}"/><br>

    利用选择获取List中成绩及格的对象的username:

    <s:property value="stus.{?#this.grade>=60}.{username}"/><br>

    利用选择获取List中成绩及格的第一个对象的username:

    <s:property value="stus.{?#this.grade>=60}.{username}[0]"/><br>

    利用选择获取List中成绩及格的第一个对象的username:

    <s:property value="stus.{^#this.grade>=60}.{username}"/><br>

    利用选择获取List中成绩及格的最后一个对象的username:

    <s:property value="stus.{$#this.grade>=60}.{username}"/><br>

    利用选择获取List中成绩及格的第一个对象然后求大小:

    <s:property value="stus.{^#this.grade>=600}.{username}.size"/><br>

    集合的伪属性

    OGNL能够引用集合的一些特殊的属性,这些属性并不是JavaBeans模式,例如size(),length()等等. 当表达式引用这些属性时,OGNL会调用相应的方法,这就是伪属性.

    集合

    伪属性

    Collection(inherited by Map, List & Set)

    size ,isEmpty

    List

    iterator

    Map

    keys , values

    Set

    iterator

    Iterator

    next , hasNext

    Enumeration

    next , hasNext , nextElement , hasMoreElements

     

     Lambda   :[…]

    格式::[…]

    使用Lambda表达式计算阶乘:

    <s:property value="#f = :[#this==1?1:#this*#f(#this-1)] , #f(4)"/><br>

    OGNL中#的使用

    #可以取出堆栈上下文中的存放的对象.

    名称

    作用

    例子

    parameters

    包含当前HTTP请求参数的Map

    #parameters.id[0]作用相当于

    request.getParameter("id")

    request

    包含当前HttpServletRequest的属性(attribute)的Map

    #request.userName相当于

    request.getAttribute("userName")

    session

    包含当前HttpSession的属性(attribute)的Map

    #session.userName相当于

    session.getAttribute("userName")

    application

    包含当前应用的ServletContext的属性(attribute)的Map

    #application.userName相当于

    application.getAttribute("userName")

    attr

    用于按request > session > application顺序访问其属性(attribute)

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    获取Paraments对象的属性:<s:property value="#parameters.username"/>

    OGNL中%的使用

    用%{}可以取出存在值堆栈中的Action对象,直接调用它的方法.

    例如你的Action如果继承了ActionSupport .那么在页面标签中,用%{getText('key')}的方式可以拿出国际化信息.

     OGNL中$的使用

    “$”有两个主要的用途

    l         用于在国际化资源文件中,引用OGNL表达式

    l         在Struts 2配置文件中,引用OGNL表达式

     值栈

    ValueStack对象。这个对象贯穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。当Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的相应属性放到ValueStack对象的顶层节点(ValueStack对象相当于一个栈)。

    在Action中获得ValueStack对象:ActionContext.getContext().getValueStack()

    l         Top语法

    使用Top获取值栈中的第二个对象:<s:property value="[1].top.对象"/>

    l         N语法

    使用N获取值栈中的第二个对象:<s:property value="[1].对象"/>

    l         @语法

    调用action中的静态方法:<s:property value="@vs1@静态方法"/> vs:值栈 1:表示第一个。

     
    展开全文
  • Struts2视频_全面开战

    万人学习 2015-05-12 16:23:30
    本Java视频教程对 Struts2 庞杂的技术点进行抽丝剥茧,提炼出企业开发的核心技术和重要技能。每个技术点都配备案例和代码,对于拦截器、Struts2 运行流程分析、值栈等技术点的讲授更是深入解析源代码,授之以渔。
  • 初识Struts2

    千次阅读 2014-11-09 22:41:43
    先简单的写一个小例子: 第一步:在web.xml中加入拦截器配置。... org.apache.struts2.dispatcher.FilterDispatcher filter>  struts2  /*   第二步:把空的struts.xml配置文件放到项目src下面。  

    先简单的写一个小例子:

    第一步:在web.xml中加入拦截器配置。

             <filter>

            <filter-name>struts2</filter-name>

     <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

    </filter>

    <filter-mapping>

            <filter-name>struts2</filter-name>

            <url-pattern>/*</url-pattern>

    </filter-mapping>

     

    第二步:把空的struts.xml配置文件放到项目src下面。

      

    第四部:编写自定义的action类。

    package test;

    import com.opensymphony.xwork2.ActionSupport;

    public class HelloAction extends ActionSupport {

        private String str;

        public String hello() {

           this.str = "hello!!!";

           return "success";

        }

        public String getStr() {

           return str;

        }

        public void setStr(String str) {

           this.str = str;

        }

    }

     

    第三步:编写struts.xml配置文件。

    <struts>

        <package name="test" namespace="/np" extends="struts-default">

           <action name="hello" class="test.HelloAction" method="hello">

               <result name="success">/hello.jsp</result>

           </action>

        </package>

    </struts>

     

    第四步:启动tomcat,在浏览器中访问:

             http://localhost:8080/hello/np/hello.action

             hello 是项目名字

             np 命名空间,对应namespace里面的字符串。

             hello.action 其中hello对应action里面的字符串,“.action”表示请求的是一个action。

     

    运行机制

    1)客户端在浏览器中输入一个url地址。

    2)这个url请求通过http协议发送给tomcat。

    3)tomcat根据url找到对应项目里面的web.xml文件。

    4)在web.xml里面会发现有struts2的配置。

    5)然后会找到struts2对应的struts.xml配置文件。

    6)根据url解析struts.xml配置文件就会找到对应的class。

    7)调用完class返回一个字String,根据struts.xml返回到对应的jsp。

     

    struts2流程

     

    一个请求在Struts2框架中的处理大概分为以下几个步骤:

    1)  客户端初始化一个指向Servlet容器(例如Tomcat)的请求。

    2)  这个请求经过一系列的过滤器(Filter)。

    3)  接着StrutsPrepareAndExecuteFilter被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action。

    4)  如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。

    5)  ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类。

    6)  ActionProxy创建一个ActionInvocation的实例。

    7)  ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

    8)  一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。

    Struts2的核心就是拦截器。Struts.xml中所有的package都要extends="struts-default"。同理与所有的Java类都要extends自Object一样。struts-default.xml里面就是要做以上事情。

     

    struts2工作原理:

        编程原理:

             用户发送http请求---》Web服务器(tomcat)--》加载web.xml(web部署描述文件)文件-执行struts核心控制器(

            StrutsPrepareAndExecuteFilter或者filterDispatcher)--> 加载struts.xml文件,通过请求action名字找到匹配的action  -->在action中调用(execute)(业务层|数据层) -->执行result=“"--> 通过result找到struts.xml与result名字匹配结果--》转发到页面返回给调用者

        程序调用:

        struts内部原理图:

        (1)用户发送http请求--》启动web服务器    ---》加载web.xml(web部署描述文件)配置文件 ---》执行web.xml中相应过滤器

                 ActionContextCleanUp:清除页面中的属性

                 other filter(SiteMesh:装饰过滤器)

                 SiteMesh作用:页面布局、装饰

                 StrutsPrepareAndExecuteFilter:struts2核心控制器   

           注意:(a)使用SiteMesh(装饰过滤器),struts2容器 不在管理页面中属性,需要调用ActionContextCleanUp完成销毁

                     (b)过滤器执行是有顺序

                     ActionContextCleanUp-->SiteMesh-->StrutsPrepareAndExecuteFilter

          (2)中央控制器StrutsPrepareAndExecuteFilter询问ActionMapper是否需要请求action

          (3)如果需要请求action,FilterDispatcher就会调用它的代理(ActionProxy)加载配置文件

          (4)ActionProxy会调用Configuration Manager读取strus.xml配置文件注意:只加载一次   

           (5)根据请求名字,ActionProxy(action代理)调用 所有拦截器(Inertceptor),ActionProxy(action代理) 创建Action Invocation,去执行所对应action类, 根据Action类中名字找到匹配result页面  (jsp、freeMarker、Velocity)等技术,在此执行拦截器

            注意:struts2拦截器和servlet过滤器功能相同, 并比filter强大 拦截器执行顺序:先进后出

            (6)相应给用户(HttpServletResponse)

    工作原理图:


     

     

     

    展开全文
  • struts2必备jar包官方绿色版

    万次下载 热门讨论 2012-10-08 18:02:42
    struts2最新官网的jar包,已经是最少的包的无法再删除了, commons-fileupload-1.2.2.jar commons-io-2.0.1.jar commons-lang3-3.1.jar commons-logging-1.1.1.jar freemarker-2.3.19.jar javassist-3.11.0.GA.jar ...
  • Struts2

    千次阅读 2019-01-30 08:26:39
    Struts2是一个WEb端的MVC框架。 MVC模式: 模型:分为业务模型和数据模型 视图:负责显示页面,渲染模型 控制器:接收用户请求,调用模型处理用户请求,选择视图 目前在Model2中我们使用Servlet作为控制器: ...

    Struts2是一个WEb端的MVC框架。

    • MVC模式:
    • 模型:分为业务模型和数据模型
    • 视图:负责显示页面,渲染模型
    • 控制器:接收用户请求,调用模型处理用户请求,选择视图
    • 目前在Model2中我们使用Servlet作为控制器:
    • Servlet作为控制器的过程
    1. 接收用户请求
    2. 将参数封装为java中的对象
    3. 调用service来处理业务逻辑
    4. 根据service返回的结果选择视图
    • Filter作为控制器比Servlet更强
    • 同时filter还多了filefilterChina

    Servlet仅仅解决了底层问题很多东西需要手动(封装、验证访问数据、呈现表示层(返回一个页面、Servlet提供转发和重定向))

    编写Struts的hello

    1. 解压apps目录下的Struts2-blank.war包
    2. 创建动态web工程
    3. 将包导入lib
    4. 在项目中添加Struts2的核心控制器,接管发送的所有请求(Struts核心控制器就是过滤器只需在web.xml中引入该过滤器)
    5. 创建自己的Action类,Struts2中的Action就是一个POJO(java的的普通类)
    6. 配置文件放在SRC下

       

       

      http://localhost:8080/项目名/文件名

      因为有俩个控制器一个action 一个filter.StrutsPrepareAndExecuteFilter

      filter找文件名之间有对应关系

      有全类名访问

      
      
      public class Hello {
      	public String execute() {
      		System.out.println("你好");
      		return "success";
      	}
      }
      

      配置文件

      <filter>
              <filter-name>struts2</filter-name>
              <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>

       

    展开全文
  • 依赖注入又名控制反转,控制反转就是由容器控制对象之间的关系,而非传统实现中,由程序代码直接操控。...struts2通过插件的形式来集成Spring,插件的Jar文件包含在struts-spring-plugin-2.0.11.jar的文件中。<s
  • 深入浅出Struts2

    万人学习 2015-10-17 12:12:18
    本课程主要讲授如何使用Struts2框架开发Web应用程序,其特色在于其讲解的过程中,通过当堂编写代码的讲授方式讲解“关键知识点”,这些“关键知识点”可保证学生从始至终都写出可运行的程序。
  • Struts 2读书笔记-----Struts 2知识总结

    千次阅读 多人点赞 2012-03-19 08:09:45
    历时三个星期的时间终于把Struts 2 给看完了。中间断断续续的学习,在这个过程中学到了很多东西,也真正的明白了时间是挤出来的。大三了课程越来越来多了,有自己学校的课程要学习,又是各种各样的实验,时间的真...
  • Struts2框架搭建

    千次阅读 多人点赞 2014-07-01 22:34:29
    使用Struts2版本为:struts-2.3.16.3 一、向web项目中添加struts2依赖库 commons-fileupload-1.3.1.jar commons-io-2.2.jar commons-lang3-3.1.jar commons-logging-1.1.3.jar freemarker-2.3.19.jar javassist-...
  • 深入理解Struts2

    千次阅读 热门讨论 2016-01-29 10:58:02
    简介 Struts 2Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制...
  • SpringMVC & Struts2

    千次阅读 热门讨论 2016-01-22 14:37:52
    这两个框架可谓Java中的经典,Java开发必懂的框架,不过最近
  • Struts2 json plugin实战2

    千次阅读 2010-07-29 08:50:00
    首先是在struts2的工程里添加struts2-json-plugin.xxx.jar库,如果是使用的maven,添加以下dependency   <groupId>org.apache.struts <artifactId>struts2-json-plugin <version>2.1.8.1 ...
  • 如何自学Struts2Struts2文件上传[视频]
  • Struts2概述及与Struts1的对比

    千次阅读 2015-12-19 09:58:47
    Struts2 概述1,仍然是一个基于请求响应的MVC框架2,Struts2不是Struts1的升级3,Struts2与Struts1的体系结构差距非常大4,Struts2采用了另一个MVC框架WebWork的核心设计5,Struts2更优秀:松耦合设计。。 Struts1...
  • Struts1 和 Struts2

    万次阅读 多人点赞 2013-03-15 20:46:06
    关于Struts2的出现缘由和好处就不多说啦,看了几篇总结的不错的文章,整理下贴出来,共同学习了。 Action的区别 对于有着丰富的Struts1.x开发经验的朋友来说,都十分的清楚Action是整个Struts框架的核心内容,当然...
  • struts2图片显示

    千次阅读 2014-03-26 21:06:44
    struts2图片显示即是文件下载一、配置struts.xml struts.xml中配置stream结果类型,并配置contentType、inputName、contentDisposition、bufferSize参数即可 application/octet-stream inputStream ...
  • 如何自学Struts2Struts2配置文件[视频]
  • Java struts2 框架

    千次阅读 2015-01-22 22:56:07
    Struts 2Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理...
  • struts2核心配置

    千次阅读 2012-09-05 10:58:24
    这个文件是struts2框架默认加载的配置文件。它定义struts2一些核心的bean和拦截器。  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  "http://struts.apache.org/dtds/struts-
  • Struts2 新特性

    千次阅读 2006-09-01 16:08:00
    Struts2与Struts1的对比 Action 类: • Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。 • Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的...
  • JavaEE Struts2框架

    千次阅读 2012-11-18 19:07:47
    目前有很多MVC框架,其中Struts2是一个被广泛使用的开源框架。但是,它的前身并不是Struts1,而是另一个优秀的开源框架WebWork,Struts2综合了Struts1和WebWork两大框架的优点。其全新的Struts 2的体系结构与Struts ...
  • NOTE:Struts2

    千次阅读 2009-08-07 12:29:00
    2009-3-28 struts2 ANNOTATION 1org.apache.struts2.dispatcher.FilterDispatcher ANNOTATION 2actionPackagesmanning (annotation) 过滤器struts2拦截所有http请求,所以说,struts正是通过这个过滤器来完成充当...
  • struts2-config-browser-plugin插件的作用是查看Struts2的配置信息,例如Action的命名控件,别名等。 最常见的错误是Action无法映射到,这时这个插件的价值就体现出来了,轻轻松松帮你找到错误。 用法: 1....
  • struts 2读书笔记-----struts2的开发流程

    千次阅读 2012-02-16 13:00:06
    一、将struts 2的lib文件夹下地commons-fileupload.jar、commons-io.jar、freemarker.jar、javassist.jar、ognl.jar、struts2-core.jar和xwork-core.jar必需类复制到web应用的WEB-INF/lib路径下。如果需要在web应用...
  • 接上一篇博客,这篇博客讲述一下2——9小标题的内容,这些问题都可以在struts2配置文件中设置(当然有的也可以在Struts.properties属性文件,web.xml中进行设置),而且常规开发中也基本都是在struts2配置文件中设置...
  • Struts2开发框架

    千人学习 2017-01-02 09:54:12
    本课程主要讲解Struts 2.x开发框架的实现机制以及运行原理分析,同时讲解了Struts 2.x中提供的数据验证、上传、拦截器、转换器等概念,并且针对于拦截器的操作进行了合理的结构设计,以提升代码的可重用性。...

空空如也

1 2 3 4 5 ... 20
收藏数 192,350
精华内容 76,940
关键字:

struts