add.jsp: <body> <s:form action="AddUserAction"> <s:textfield name="user.userName" label="Your name" /> <s:textfield name="user.address.address" label="Your address" /> <s:textfield name="user.address.zipCode" label="Your zipCode" /> <s:textfield name="user.address.phone" label="Your phone" /> <s:textfield name="array" label="不使用下标的数组" /> <s:textfield name="array" label="不使用下标的数组" /> <s:textfield name="initArray[0]" label="使用下标的数组" /> <s:textfield name="initArray[1]" label="使用下标的数组" /> <s:textfield name="list[0]" label="List" /> <s:textfield name="list[1]" label="List" /> <s:textfield name="map['user1'].userName" label="Map" /> <s:textfield name="map.user2.userName" label="Map" /> <s:submit/> </s:form> </body>
success.jsp: <body> <h4>User: <s:property value="user.userName" /> add success.</h4> <h4>Address:<s:property value="user.address.address" /></h4> <h4>zipCode:<s:property value="user.address.zipCode" /></h4> <h4>phone :<s:property value="user.address.phone" /></h4> <!-- set 将对象设置为ActionContext中的属性映射,默认作用域是Action --> <s:set name="username" scope="session" value="user.userName" /> <h4>Hello <s:property value="#session['username']" /></h4> <!-- push 将ActionContext中的对象放入ValueStack顶端,方便标签内访问。 --> <s:push value="user"> <h4>Show userName(<s:property value="userName" />) by push user in ValueStack.</h4> </s:push> <!-- bean 创建一个类的实例,默认放置在ValueStack中,标签外访问需要设置var为实例指定一个引用,该引用会作为命名参数存在于ActionContext --> <s:bean name="com.jaeson.hibernatestudy.bean.User" var="bean"> <s:param name="userName">jaesonchen</s:param> <h4>User bean for User.getUserName()=<s:property value="getUserName()" /></h4> </s:bean> <s:if test="#bean.userName == 'jaesonchen1'"> <h4>if show #bean.userName=<s:property value="#bean.userName" /></h4> </s:if> <s:elseif test="user.address.zipCode == 100086"> <h4>elseif show user.zipCode=<s:property value="user.address.zipCode" /></h4> </s:elseif> <s:else> <h4>else show nothing</h4> </s:else> <!-- iterator 遍历Collection Map Enum Iterator Array,支持在ActionContect中定义一个保存遍历状态的变量 --> <s:iterator value="array" status="itStatus"> <li> <s:property value="#itStatus.count" /> <s:property value="array[#itStatus.index]" /> </s:iterator> <s:iterator value="list" status="itStatus"> <li> <s:property value="#itStatus.count" /> <s:property /> </s:iterator> <s:iterator value="map" status="itStatus"> <li> <s:property value="key" /> <s:property value="value.userName" /> </s:iterator> <!-- Map遍历的类型为Entry(key, value),默认情况下listKey指向key,listValue指向value --> <s:select name="selectList" list="{'chenzq','jaeson','jaesonchen'}" label="select a name"/> <s:select name="selectList" list="list" label="select a num"/> <s:select name="selectMap" list="map" listValue="value.userName" label="select a username"/> <s:radio name="radioList" list="{'chenzq','jaeson','jaesonchen'}" label="radio a name" /> </body>
import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.context.annotation.Scope; import com.opensymphony.xwork2.ActionSupport; import com.jaeson.hibernatestudy.bean.User; import com.jaeson.springstudy.service.CommonService; @SuppressWarnings("all") @Scope("prototype") @Controller("userAction") public class UserAction extends ActionSupport { @Override public String execute() { this.getCommonService().saveOrUpdate(this.getUser()); //throw new RuntimeException("throw in UserAction"); return SUCCESS; } @Override public void validate() { if (this.getUser().getUserName().length() == 0) { this.addFieldError("user.userName", "userName is required."); } } /** * 使用相同名字array提交时,不需要初始化数组。 * 使用initArray[0]提交时,必须初始化数组,否则初始化错误 ognl.OgnlException: target is null for setProperty。 * List Map等集合类型时,两种提交方式都不能初始化集合。 * 在类型转换错误需要返回input时,使用无下标提交的集合每一个输入框都会显示全部的集合内容,最佳实践使用集合下标。 */ private String[] array; private double[] initArray = new double[10]; private List<Integer> list; private Map<String, User> map; private User user; @Resource(name = "commonService") private CommonService commonService; public User getUser() { return this.user; } public void setUser(User user) { this.user = user; } public String[] getArray() { return array; } public void setArray(String[] array) { this.array = array; } public double[] getInitArray() { return initArray; } public void setInitArray(double[] initArray) { this.initArray = initArray; } public List<Integer> getList() { return list; } public void setList(List<Integer> list) { this.list = list; } public Map<String, User> getMap() { return map; } public void setMap(Map<String, User> map) { this.map = map; } public CommonService getCommonService() { return this.commonService; } public void setCommonService(CommonService commonService) { this.commonService = commonService; } }
struts.xml:
<action name="AddUserAction" class="userAction">
<result name="success">/success.jsp</result>
<result name="input">/add.jsp</result>
</action>
相关推荐
在Struts中,OGNL(Object-Graph Navigation Language)和Value Stack(VS)是两个核心概念,它们对于理解Struts的工作原理至关重要。 **OGNL:对象图导航语言** OGNL是一种强大的表达式语言,它允许在对象图中进行...
// paramName已自动填充为请求参数值 System.out.println(paramName); return SUCCESS; } } ``` 在JSP页面中,可以通过OGNL表达式访问这些属性。 3. **ActionSupport类的便利方法** Struts2提供了一个基类...
- `ActionForm`通过`populate`方法自动填充表单数据,但其灵活性有限。 #### Struts2: - Struts2允许直接使用POJO作为模型数据,无需特定的`ActionForm`。 - 提供了`ModelDriven`接口,允许为每个Action配置不同的...
而Struts2.x则更加灵活,可以直接将Action作为数据绑定的目标,利用其强大的数据绑定机制(包括OGNL表达式语言)进行数据的自动填充和转换,同时也支持传统的ActionForm模式,但提供了更丰富的数据绑定选项和更简单...
当用户提交表单时,Struts2会自动将表单数据填充到对应的Action属性中,无需手动获取HTTP请求参数。 此外,Struts2还提供了丰富的插件系统,如Tiles插件,可以方便地进行页面布局。同时,Struts2与Spring框架的集成...
Struts2通过值栈(ValueStack)管理请求范围内的数据,这使得开发者能够在控制器和视图之间传递数据变得非常简单。 ##### 1. 值栈(ValueStack) - **自动注入**: 当用户提交表单时,表单的数据会被自动填充到对应的...
当表单提交后,Struts1会自动将表单数据填充到ActionForm对象中。相比之下,Struts2可以直接使用普通的Java对象(即POJO)作为数据模型,并提供了多种数据绑定机制,包括ModelDriven机制,允许为每个Action指定一个...
- **Struts2**:除了支持JSTL外,还引入了强大的OGNL表达式语言,这使得开发者可以在页面上轻松访问Action中的数据和执行方法。 #### 五、绑定值到页面(View) - **Struts1**:通常使用标准JSP标签来展示数据。 ...
Action类可以引用Form类实例,Struts2会自动将表单提交的数据填充到Form实例中。Form类可以通过注解`@Namespace`、`@Result`等进行配置,以指定其在应用中的作用域和处理结果。 6. **结果类型(Result Type)**:...
通过以上内容,我们可以看到Struts2框架不仅提供了强大的功能,如OGNL表达式语言和ValueStack数据管理工具,还允许开发者通过自定义拦截器等方式来扩展框架的行为,从而满足更加复杂的应用场景需求。这对于理解和...
**Object-Graph Navigation Language (OGNL)** 是 **Struts2** 中用来访问和设置对象属性的强大工具。OGNL 提供了一种简单而强大的语法来访问 Java 对象模型中的属性值。 - **OGNL 基本用法**: - `Ognl.getValue...
它是Struts2框架的一个核心特性之一,被广泛应用于框架的数据访问、表单填充等方面。 #### Struts2与OGNL的关系 Struts2框架采用了OGNL作为其默认的表达式语言,它通过OGNL实现了对Java对象的灵活操作。Struts2的...
`expression`参数包含OGNL表达式,而`valueStack`参数决定是否在表达式中访问`ValueStack`对象。 #### `email` 和 `url` 这两个验证器分别用于电子邮件地址和URL的格式验证,确保字段中的值符合标准格式。 #### `...
Struts2会自动将请求参数值填充到这个属性中,无需手动获取。 2. **使用Parameters拦截器**:Struts2的拦截器机制使得在Action执行前可以进行预处理,Parameters拦截器就是负责处理请求参数的。它会遍历请求的所有...
- **ValueStack**:Struts2的ValueStack机制,使得模型对象的属性可以直接在JSP页面中访问,增强了数据的传递和展示。 4. **JSP的EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)** -...
- 结合OGNL(Object-Graph Navigation Language)表达式,动态地访问和操作对象属性,实现灵活的数据绑定。 以上是对Struts2标签库的详细概述,涵盖了常用标签的使用方法和注意事项。了解并熟练应用这些标签,能够...
同时,Struts2框架允许通过ValueStack和OGNL表达式来方便地在Action和视图之间传递数据。 接着,我们提到**数据库**,在这个项目中,可能是用来存储和检索生成图表所需的数据。开发者需要先建立相应的数据库表,并...
无论是哪种方式,一旦表单提交,Struts会自动将请求参数值填充到对应的ActionForm或Action类属性中,这个过程就涉及到了类型转换。 至于标签的使用,Struts提供了一系列的自定义标签,如`html`、`bean`、`logic`等...
在Action执行前,框架会自动实例化模型对象,并填充到`ValueStack`中。 15. **Scoped Model Driven (范围模型驱动)** - **功能**:类似于Model Driven,但支持指定模型的作用域,如Session或Request。这样可以在...