Struts2 OGNL案例
一>>原始类型与包装类型
先定义两个实体类User和Address
User
package cn.entity;
public class User {
private String name;
private int age;
private Address address;
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Address
package cn.entity;
public class Address {
private String country; // 国家
private String city; // 城市
private String street; // 街道
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
}
创建出一个action先创建出两个成员变量 然后在核心方法中实例化成员变量。
package cn.action; import cn.entity.Address;
import cn.entity.User; import com.opensymphony.xwork2.ActionSupport; public class ShowOriginalAndJavaBeanAction extends ActionSupport {
private User user;
private String message;
public String execute(){
setUser(new User());
getUser().setName("jbit");
getUser().setAge(23);
Address address=new Address();
address.setCountry("中国");
address.setCity("北京");
address.setStreet("长安街");
getUser().setAddress(address);
setMessage("展示原始类型和JavaBean");
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
核心配置:struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" extends="struts-default">
<action name="showOriginalAndJavaBeanAction" class="cn.action.ShowOriginalAndJavaBeanAction">
<result>result.jsp</result>
</action>
</package>
</struts>
result页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'result.jsp' starting page</title> </head> <body>
信息:<s:property value="message" default="展示数据" /><br/>
姓名:<s:property value="user.name" /><br/>
年龄:<s:property value="user.age" /><br/>
国家:<s:property value="user.address.country" />
<s:debug></s:debug>
</body>
</html>
property标签用于输出ValueStack中对象属性的值,其中value属性用来指定要输出对象的属性,如果没有value属性,则默认输出ValueStack栈顶的对象,类型为Object;default属性是属性值为空时默认的默认值,类型为String
效果展示:

二>>多值类型请求参数的处理
如果在请求中出现多个值对应同一个请求参数的情况,Struts2会将这样的数据转换为面向集合的数据类型,如集合,数组
1.数组
表单代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> </head> <body>
<s:form action="ArraysDataTransfer.action">
<s:textfield name="hobbies" label="爱好:"/>
<s:textfield name="hobbies" label="爱好:"/>
<s:textfield name="hobbies" label="爱好:"/> <s:textfield name="numbers[0]" label="数字:"/>
<s:textfield name="numbers[1]" label="数字:"/>
<s:textfield name="numbers[2]" label="数字:"/>
<s:submit value="提交"/>
</s:form>
</body>
</html>
第一个数组属性是hobbies,接收提交的爱好信息;第二个数组属性是numbers,接收提交的数字,如果数据转移要正常工作,这些属性必须存在ValueStack中。在Action类中公开这些属性
ArraysDataTransferAction
package cn.action;
import com.opensymphony.xwork2.ActionSupport;
public class ArraysDataTransferAction extends ActionSupport {
private String[] hobbies;
private Double[] numbers=new Double[3];
public String execute(){
System.out.println("hobbies的长度是"+hobbies.length);
for(int i=0;i<hobbies.length;i++){
System.out.println("hobbies数组中第"+i+"个元素是:"+hobbies[i]);
}
System.out.println("numbers的长度是"+numbers.length);
for(int i=0;i<numbers.length;i++){
System.out.println("numbers数组中第"+i+"个元素是:"+numbers[i]);
}
return SUCCESS;
}
public String[] getHobbies() {
return hobbies;
}
public void setHobbies(String[] hobbies) {
this.hobbies = hobbies;
}
public Double[] getNumbers() {
return numbers;
}
public void setNumbers(Double[] numbers) {
this.numbers = numbers;
}
}
struts.xml
<action name="ArraysDataTransfer" class="cn.action.ArraysDataTransferAction">
<result name="success">result2.jsp</result>
</action>
result2.jsp
<body>
请查看控制台的输出
</body>
2.集合
使用List与使用数组几乎相同,仅有不同的是集合类型可以借助泛型实现
表单代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> </head> <body>
<s:form action="listDataTransfer">
<s:textfield name="hobbies" label="爱好:"/>
<s:textfield name="hobbies" label="爱好:"/>
<s:textfield name="hobbies" label="爱好:"/> <s:textfield name="numbers[0]" label="数字:"/>
<s:textfield name="numbers[1]" label="数字:"/>
<s:textfield name="numbers[2]" label="数字:"/> <s:textfield name="users.name" label="姓名:"/>
<s:textfield name="users.name" label="姓名:"/>
<s:textfield name="users.name" label="姓名:"/>
<s:submit value="提交"/>
</s:form>
</body>
</html>
相同名称参数有多个数据输入,可以将具有相同名称的参数看作一个集合,特殊说明的是users.name,当ognl解析这个表达式时,会首先定位user属性,与之不同的是,user是一个指定了元素为User对象的List。
ListDataTransferAction
package cn.action;
import com.opensymphony.xwork2.ActionSupport;
import cn.entity.User;
import java.util.*;
public class ListDataTransferAction extends ActionSupport {
private List<String> hobbies;
private List<Double> numbers;
private List<User> users;
public String execute(){
System.out.println("hobbies的长度是"+hobbies.size());
for(int i=0;i<hobbies.size();i++){
System.out.println("hobbies数组中第"+i+"个元素是:"+hobbies.get(i));
}
System.out.println("numbers的长度是"+numbers.size());
for(int i=0;i<numbers.size();i++){
System.out.println("numbers数组中第"+i+"个元素是:"+numbers.get(i));
}
System.out.println("users的长度是"+users.size());
for(int i=0;i<users.size();i++){
System.out.println("users数组中第"+i+"个元素是:"+users.get(i).getName());
}
return SUCCESS;
}
public List<String> getHobbies() {
return hobbies;
}
public void setHobbies(List<String> hobbies) {
this.hobbies = hobbies;
}
public List<Double> getNumbers() {
return numbers;
}
public void setNumbers(List<Double> numbers) {
this.numbers = numbers;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
struts.xml
<action name="listDataTransfer" class="cn.action.ListDataTransferAction">
<result>result2.jsp</result>
</action>
result2.jsp
<body>
请查看控制台的输出
</body>
三>>访问集合对象
package cn.action; import java.util.ArrayList;
import java.util.List; import cn.entity.Address;
import cn.entity.User; import com.opensymphony.xwork2.ActionSupport; public class ShowArraysAndListAction extends ActionSupport { private String[] hobbies;
private List<Double> numbers;
private List<User> users; private User user; public String execute() throws Exception {
users=new ArrayList<User>();
user=new User();
user.setUsername("火狐");
user.setPassword("11");
Address address=new Address();
address.setCountry("中国");
address.setCity("北京");
address.setStreet("长安街");
user.setAddress(address);
users.add(user);
user=new User();
user.setUsername("hh");
user.setPassword("10");
Address address2=new Address();
address2.setCountry("中国");
address2.setCity("北京");
address2.setStreet("海淀");
user.setAddress(address);
users.add(user);
return SUCCESS; } public String[] getHobbies() {
return hobbies;
} public void setHobbies(String[] hobbies) {
this.hobbies = hobbies;
} public List<Double> getNumbers() {
return numbers;
} public void setNumbers(List<Double> numbers) {
this.numbers = numbers;
} public List<User> getUsers() {
return users;
} public void setUsers(List<User> users) {
this.users = users;
} }
实体类
User
package cn.entity;
public class User {
//用户输入的姓名
private String username;
//用户输入的密码
private String password;
private Address address;
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
/*
* 获取名字
* @return 名字
*/
public String getUsername() {
return username;
}
/*
* 设置名字
* @para name名字
*/
public void setUsername(String username) {
this.username = username;
}
/*
* 获取密码
* @return 密码
*/
public String getPassword() {
return password;
}
/*
* 设置密码
* @para password密码
*/
public void setPassword(String password) {
this.password = password;
}
}
Address
package cn.entity;
public class Address {
private String country; // 国家
private String city; // 城市
private String street; // 街道
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
}
struts.xml
<action name="showArrayAndListAction" class="cn.action.ShowArraysAndListAction">
<result name="success">result.jsp</result>
</action>
result.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'result.jsp' starting page</title> </head> <body>
迭代数组输出:<br/>
<s:iterator value="hobbies">
<s:property /><br/>
</s:iterator>
迭代集合(元素类型为Double):<br/> <s:iterator value="numbers">
<s:property /><br/>
</s:iterator> 迭代集合(元素类型为User):<br/> <s:iterator value="users">
用户名:<s:property value="username" /><br />
密码:<s:property value="password" /><br />
国家:<s:property value="address.country" /><br />
</s:iterator> <s:debug></s:debug>
</body>
</html>
效果:

Struts2 OGNL案例的更多相关文章
- Struts2(Ognl)
OGNL(Object-Graph Navigation Language)全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整 ...
- 三、第一个Struts2应用案例(编码步骤)
第一个Struts2应用案例(编码步骤) 编写2个jsp hello.jsp <body> <a href="${pageContext.request.conte ...
- 案例45-crm练习改写客户列表使用struts2&OGNL
1 修改CustomerAction代码 2 修改jsp/customer/list.jsp代码 <%@ page language="java" contentType=& ...
- 【Java EE 学习 36】【struts2】【struts2系统验证】【struts2 ognl值栈】【struts2 ongl标签】【struts2 UI标签】【struts2模型驱动和令牌机制】
一.struts2系统验证 1.基于struts2系统验证的方式实际上就是通过配置xml文件的方式达到验证的目的. 2.实际上系统校验的方法和手工校验的方法在底层的基本实现是相同的.但是使用系统校验的 ...
- Struts2 OGNL使用详解(转)
OGNL OGNL ( Object Graph Navigation Language ),对象图导航语言.这是一种强大的表达式语言,通过它可以非常方便的来操作对象属性. 在 Struts2 中,O ...
- Struts2入门案例
struts2最简便的案例 Struts 2是一个MVC框架,以WebWork框架的设计思想为核心,吸收了Struts 1的部分优点.Struts 2拥有更加广阔的前景,自身功能强大,还对其他框架 ...
- Struts2 OGNL 自动转换Date类型的一些注意事项
Strut2 有比较完善的使用OGNL的jsp标签自动转化为对应的后台对象的功能. 这里java.util.Date的自动转化有一些需要注意的地方(局部转换): 1.必须要在struts的xml文件中 ...
- Struts2 OGNL 字符串自定义转化对象细节
要使用Struts2的自定义对象转化,需要几个要点: 1.要有继承DefaultTypeConverter的实现类,要重写convertValue,并且参数value转化而来的String是Strin ...
- struts2 OGNL表达式
一.OGNL OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对 ...
随机推荐
- js设置、获取单值cookie和多值cookie
js设置.获取单值cookie和多值cookie,代码如下: var CookieUtil = (function () { var Cookie = function () { // 获取单值coo ...
- mybatis中的延迟加载
一.延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 延迟加载:先 ...
- IOS应用内存释放机制
这是由iOS系统管理决定的,但APP退出在后台后,只有10秒的持续运行时间,然后暂停.但该APP还在内存中,当出现内存警告,也就是别的APP要运行,而此时内存又不足的情况下,系统会回收停在后台APP所 ...
- SharePoint 2013 搜索高级配置(Search Scope)
前言:SharePoint 2013集成了Fast Search,而后在配置上与2010及之前版本都有一些区别,如果需要开启搜索的文档,请参考我之前写的博客,博客地址附后.下面,我们开始了解下,Sha ...
- 从头开始构建LINUX [LFS]
“LINUX就是这个范”有一章专门介绍了Linux的构建,过程详细,很有意思.结合这方面的资料简要汇集一下 LFS 这个站点提供了从源代码构建一个Linux的详细步骤 书 http://archive ...
- Android中GridView通过自定义适配器(未优化)实现图文视图排列
Android中GridView组件用来以网格方式排列视图,与矩阵类似,当屏幕上有很多元素(文字.图片或其他元素)需要显示时,可以使用该组件.下面我们通过代码实现如下图例(为了方便截图,将事件处理(土 ...
- Android Studio调试方法学习笔记
(注:本人所用Android Studio的Keymap已设为Eclipse copy) 1.设置断点 只有设置断点,才好定位要调试什么地方,否则找不到要调试的地方,无法调试.(调试过程中也可以增加断 ...
- Android屏幕适配
安卓分辨率的相关知识 http://leoray.leanote.com/post/android-resolution Android内存占用公式 系统内存 = 像素宽 * 像素高 * 像素所占用的 ...
- IOS RunLoop浅析 二
上一篇我们说了runloop 的几种模式,那么我们在模式中又要做些什么呢??? 模式中有三个模块: 事件源(输入源) Source Source: 按照官方文档分类 Port-Based Custom ...
- iOS 本地推送通知
1.什么是本地推送通知 不需要联网的情况下,应用程序经由系统发出的通知 2.本地推送的使用场景 定时提醒,如玩游戏.记账.闹钟.备忘录等 3.实现本地推送通知的步骤 创建本地推送通知的对象UILoca ...