一直不知道OGNL是个什么东西,只知道在网页中可以采用下面两种常用的方式进行输入控制:
这两种有什么区别呢?今天对照着官方文档([url]http://struts.apache.org/2.2.1/docs/ognl.html[/url])做了一个小测试:
官方文档的原文是:
The Action instance is always pushed onto the value stack. Because the Action is on the stack, and the stack is the OGNL root, [b]references to Action properties can omit the # marker[/b]. But, to access other objects in the ActionContext, we must use the # notation so OGNL knows not to look in the root object, but for some other object in the ActionContext.
大致说的是:如果我们要取的值是Action的属性,可以省略#,如果不是,需要加上#。
我做了一个测试,代码如下:
1、信息输入页面index.jsp
2、处理输入信息的Action:
3、struts.xml
4、信息显示页:
5、运行结果:查看附件图片
总结:
OGNL中经常会有“#”、“%”、“$”三个符号。一般“#”都是像前文所述代表那些非值栈的对象。还有就是ognl.jsp中创建 Map对象时候用到。而“%”则是显示对象中的值。至于“$”则是用来显示属性文件中定义的值。比如某属性文件中定义了“kkk=10”则在 Struts2的struts.xml或者JSP文件中用“${kkk}”则系统会读取“10”这个值作为显示值。
需要还需要结合相关实例进行进一步的学习,下面这个网址不错,给出了OGNL的应用,很全面,需要的时候可以查阅:
[url]http://www.iteye.com/topic/646851[/url]
[url]http://www.iteye.com/topic/569156[/url]
${userName}
<s:property value="userName" />
这两种有什么区别呢?今天对照着官方文档([url]http://struts.apache.org/2.2.1/docs/ognl.html[/url])做了一个小测试:
官方文档的原文是:
The Action instance is always pushed onto the value stack. Because the Action is on the stack, and the stack is the OGNL root, [b]references to Action properties can omit the # marker[/b]. But, to access other objects in the ActionContext, we must use the # notation so OGNL knows not to look in the root object, but for some other object in the ActionContext.
大致说的是:如果我们要取的值是Action的属性,可以省略#,如果不是,需要加上#。
我做了一个测试,代码如下:
1、信息输入页面index.jsp
<form action="<%=request.getContextPath() %>/interceptor/login!login.action">
<label>用户名称:</label>
<input type="text" name="userName" id="userName" /><br/>
<label>用户密码:</label>
<input type="text" name="password" id="password" /><br/>
<input type="submit" value="提交">
</form>
2、处理输入信息的Action:
package com.interceptor.action;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private String userName;
@SuppressWarnings("unchecked")
public String login(){
Map session=ActionContext.getContext().getSession();
HttpServletRequest request = ServletActionContext.getRequest();
String password=request.getParameter("password");
session.put("password", password);
//request.setAttribute("password", password);这种方法也不能用OGNL取到值
return SUCCESS;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
3、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>
<constant name="struts.devMode" value="true" />
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<package name="interceptor" extends="struts-default" namespace="/interceptor">
<action name="login" class="com.interceptor.action.UserAction">
<result>/result.jsp</result>
</action>
</package>
</struts>
4、信息显示页:
<%@ page language="java" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Struts2</title>
<style type="text/css">
body{
font-size:14px;
}
</style>
</head>
<body>
<p>userName采用s:property标签:<s:property value="userName" /></p>
<p>userName采用EL表达式:${userName }</p>
<p>password采用s:property标签:<s:property value="password" /></p>
<p>password采用EL表达式:${password }</p>
</body>
</html>
5、运行结果:查看附件图片
总结:
OGNL中经常会有“#”、“%”、“$”三个符号。一般“#”都是像前文所述代表那些非值栈的对象。还有就是ognl.jsp中创建 Map对象时候用到。而“%”则是显示对象中的值。至于“$”则是用来显示属性文件中定义的值。比如某属性文件中定义了“kkk=10”则在 Struts2的struts.xml或者JSP文件中用“${kkk}”则系统会读取“10”这个值作为显示值。
需要还需要结合相关实例进行进一步的学习,下面这个网址不错,给出了OGNL的应用,很全面,需要的时候可以查阅:
[url]http://www.iteye.com/topic/646851[/url]
[url]http://www.iteye.com/topic/569156[/url]