现在的位置: 首页 > 综合 > 正文

Struts2 学习笔记 12 OGNL part1

2019年08月31日 ⁄ 综合 ⁄ 共 2916字 ⁄ 字号 评论关闭

  Struts2 的Action 和Result我们们都学习过了。现在开始进行OGNL的学习。OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。

  我们整体用一个项目不断增加代码,功能来学习。

struts.xml include了ognl.xml 配置文件在ognl.xml里。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="ognl" extends="struts-default" >
		
		<action name="ognl" class="com.tfj.struts2.ognl.OgnlAction">
			<result>/ognl.jsp</result>
		</action>
	</package>	
</struts>	

主页只有一个连接访问http://localhost:8080/Struts2_2001_OGNL/ognl?username=u&password=p 传递两个参数username=u,password=p。


调用OgnlAction.java 和User.java

OgnlAction.java

package com.tfj.struts2.ognl;

import com.opensymphony.xwork2.ActionSupport;

public class OgnlAction extends ActionSupport{
	private String username;
	private String password;
	private User user;
	
	public OgnlAction() {
		
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		return SUCCESS;
	}

	
}

User.java

package com.tfj.struts2.ognl;

public class User {
	private int age=8;
	
	
	public User() {
		System.out.print(age);
	}
	public User(int age){
		super();
		this.age=age;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		
		return "user"+age;
	}
	
	
	
}

重点在ognl.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%
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>Ognl表达式学习</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">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
    <ol>
    	<li>访问值栈中的action的普通属性:username=<s:property value="username"/></li>
    	<li>访问值栈中对象的普通属性:<s:property value="user.age"/></li>
    </ol>
    <s:debug></s:debug>
  </body>
</html>

由页面的结果可以看到,我们可以访问得到username,但是user.age的值却是空(我们在User.java里已经定义他的默认值是8),那么为什么得不到呢?我们debug一下看看。


user的值是空,那么我们就传进去一个值。访问http://localhost:8080/Struts2_2001_OGNL/ognl?username=u&password=p&user.age=9

   

这时候就得到了user9,那么我们很自然想到是user的对象没有创建。

结论:如果传递了user的值,那么struts就会帮我们创建一个user对象。如果不传递user的值,就需要我们手动创建一个user对象,在本项目可以再OgnlAction.java里Private User user = new User();即可,大家可以自己试一试。

如果有一个在Cat类OgnlAction.java 里Cat对象,内部还有一个Dog 对象名字叫friend,Dog有name属性,那么我们要访问值栈中的内容就需要<s:property value="cat.friend.name"/>这样就可以访问了,同样的需要传递进去一个参数使得对象初始化。


抱歉!评论已关闭.