- 浏览: 3025952 次
- 性别:
- 来自: 河南
-
文章分类
- 全部博客 (340)
- Java综合 (26)
- 程序人生 (53)
- RIA-ExtJS专栏 (18)
- RIA-mxGraph专栏 (4)
- RIA-Flex4专栏 (43)
- 框架-Spring专栏 (16)
- 框架-持久化专栏 (22)
- 框架-Struts2专栏 (11)
- 框架-Struts专栏 (12)
- SQL/NOSQL (12)
- 报表/图表 (2)
- 工作流 (5)
- XML专栏 (4)
- 日常报错解决方案 (5)
- Web前端-综合 (12)
- Web/JSP (14)
- Web前端-ajax专栏 (14)
- Web前端-JQuery专栏 (9)
- IDE技巧 (6)
- FILE/IO (14)
- 远程服务调用 (2)
- SSO单点登录 (2)
- 资源分享 (22)
- 云计算 (1)
- 项目管理 (3)
- php专栏 (1)
- Python专栏 (2)
- Linux (1)
- 缓存系统 (1)
- 队列服务器 (1)
- 网络编程 (0)
- Node.js (1)
最新评论
-
hui1989106a:
我的也不能解压,360和好压都试了,都不行
《Spring in Action》完整中文版分享下载 -
temotemo:
这些example有些过时了,官方建议使用HBase-1.0 ...
Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询 -
zy8102:
非常感谢~
HeadFirst系列之七:《深入浅出SQL》原版高清PDF电子书分享下载 -
zy8102:
重命名了一下搞定了
HeadFirst系列之七:《深入浅出SQL》原版高清PDF电子书分享下载 -
zy8102:
为什么下载以后老解压不了呢?
HeadFirst系列之七:《深入浅出SQL》原版高清PDF电子书分享下载
要谈OGNL在Struts2中的应用,首先得明白OGNL到底是什么
OGNL 的历史
OGNL 最初是为了能够使用对象的属性名来建立 UI 组件 (component) 和 控制器 (controllers) 之间的联系,简单来说就是:视图 与 控制器 之间数据的联系。后来为了应付更加复杂的数据关系,Drew Davidson 发明了一个被他称为 KVCL(Key-Value Coding Language) 的语言。 Luke 参与进来后,用 ANTLR 来实现了该语言,并给它取了这个新名字,他后来又使用 JavaCC 重新实现了该语言。目前 OGNL 由 Drew 来负责维护。目前很多项目中都用到了 OGNL,其中不乏为大家所熟知的,例如几个流行的 web 应用框架:WebWork【当然struts2也可以说是WebWork升级版】,Tapestry 等。
什么是 OGNL?
OGNL 是 Object-Graph Navigation Language 的缩写,从语言角度来说:它是一个功能强大的表达式语言,用来获取和设置 java 对象的属性 , 它旨在提供一个更高抽象度语法来对 java 对象图进行导航,OGNL 在许多的地方都有应用,例如:
1)作为 GUI 元素(textfield,combobox, 等)到模型对象的绑定语言。
2)数据库表到 Swing 的 TableModel 的数据源语言。
3)web 组件和后台 Model 对象的绑定语言 (WebOGNL,Tapestry,WebWork,WebObjects) 。
4)作为 Jakarata Commons BeanUtils 或者 JSTL 的表达式语言的一个更具表达力的替代语言。
另外,java 中很多可以做的事情,也可以使用 OGNL 来完成,例如:列表映射和选择。对于开发者来说,使用 OGNL,可以用简洁的语法来完成对 java 对象的导航。通常来说:通过一个“路径”来完成对象信息的导航,这个“路径”可以是到 java bean 的某个属性,或者集合中的某个索引的对象,等等,而不是直接使用 get 或者 set 方法来完成
OGNL 的基本语法
OGNL 表达式一般都很简单。虽然 OGNL 语言本身已经变得更加丰富了也更强大了,但是一般来说那些比较复杂的语言特性并未影响到 OGNL 的简洁:简单的部分还是依然那么简单。比如要获取一个对象的 name 属性,OGNL 表达式就是 name, 要获取一个对象的 headline 属性的 text 属性,OGNL 表达式就是 headline.text 。 OGNL 表达式的基本单位是“导航链”,往往简称为“链”。最简单的链包含如下部分:
表达式组成部分 示例
属性名称 如上述示例中的 name 和 headline.text
方法调用 hashCode() 返回当前对象的哈希码。
数组元素 listeners[0] 返回当前对象的监听器列表中的第一个元素。
所有的 OGNL 表达式都基于当前对象的上下文来完成求值运算,链的前面部分的结果将作为后面求值的上下文。你的链可以写得很长,例如:
name.toCharArray()[0].numericValue.toString()
上面的表达式的求值步骤:
提取根 (root) 对象的 name 属性。
调用上一步返回的结果字符串的 toCharArray() 方法。
提取返回的结果数组的第一个字符。
获取字符的 numericValue 属性,该字符是一个 Character 对象,Character 类有一个 getNumericValue() 方法。
调用结果 Integer 对象的 toString() 方法。
上面的例子只是用来得到一个对象的值,OGNL 也可以用来去设置对象的值。当把上面的表达式传入 Ognl.setValue() 方法将导致 InappropriateExpressionException,因为链的最后的部分(toString())既不是一个属性的名字也不是数组的某个元素。了解了上面的语法基本上可以完成绝大部分工作了。
OGNL 表达式
1)常量:字符串:“ hello ” 字符:‘ h ’ 数字:除了像 java 的内置类型 int,long,float 和 double,Ognl 还有如例:
0.01B,相当于 java.math.BigDecimal,使用’ b ’或者’ B ’后缀。 100000H,相当于 java.math.BigInteger,使用’ h ’ 或 ’ H ’ 后缀。
2)属性的引用例如:user.name
3)变量的引用例如:#name
4)静态变量的访问使用 @class@field
5)静态方法的调用使用 @class@method(args), 如果没有指定 class 那么默认就使用 java.lang.Math.
6)构造函数的调用例如:new java.util.ArrayList();
其它的 Ognl 的表达式可以参考 Ognl 的语言手册。
OGNL的性能
OGNL,或者说表达式语言的性能主要又两方面来决定,一个就是对表达式的解析 (Parser),另一个是表达式的执行,OGNL 采用 javaCC 来完成 parser 的实现,在 OGNL 2.7 中又对 OGNL 的执行部分进行了加强,使用 javasisit 来 JIT(Just-In-Time) 的生成 byte code 来完成表达式的执行。 Ognl 给这个功能的名字是:OGNL Expression Compilation 。基本的使用方法是:
SimpleObject root = new SimpleObject();
OgnlContext context = (OgnlContext) Ognl.createDefaultContext(null);
Node node = (Node) Ognl.compileExpression(context, root, "user.name");
String userName = (String)node.getAccessor().get(context, root);
表达式语言主要有以下几大好处:
1)避免(MyType) request.getAttribute()和myBean.getMyProperty()之类的语句,使页面更简洁;
2)支持运算符(如+-*/),比普通的标志具有更高的自由度和更强的功能;
3)简单明了地表达代码逻辑,使用代码更可读与便于维护。
Struts 2中的表达式语言
Struts 2支持以下几种表达式语言:
1)OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言;
2)JSTL(JSP Standard Tag Library),JSP 2.0集成的标准的表达式语言;
3)Groovy,基于Java平台的动态语言,它具有时下比较流行的动态语言(如Python、Ruby和Smarttalk等)的一些起特性;
4)Velocity,严格来说不是表达式语言,它是一种基于Java的模板匹配引擎,具说其性能要比JSP好。
Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势:
支持对象方法调用,如xxx.doSomeSpecial();
支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;
支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(),这个表达式会返回80;
访问OGNL上下文(OGNL context)和ActionContext;
操作集合对象。
Struts2中ONGL的使用示例
index.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="refresh" content="0; url=ognl.action" />
</head>
</html>
User.java
package com.javacrazyer.web.action;
import java.util.Date;
public class User {
private Integer id;
private String loginname;
private Double score;
private Boolean gender;
private Character cha;
private Date birthday;
public User(){}
public User(Integer id, String loginname, Double score, Boolean gender,
Character cha, Date birthday) {
this.id = id;
this.loginname = loginname;
this.score = score;
this.gender = gender;
this.cha = cha;
this.birthday = birthday;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLoginname() {
return loginname;
}
public void setLoginname(String loginname) {
this.loginname = loginname;
}
public Double getScore() {
return score;
}
public void setScore(Double score) {
this.score = score;
}
public Boolean getGender() {
return gender;
}
public void setGender(Boolean gender) {
this.gender = gender;
}
public Character getCha() {
return cha;
}
public void setCha(Character cha) {
this.cha = cha;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String info() {
return "User [birthday=" + birthday + ", cha=" + cha + ", gender="
+ gender + ", id=" + id + ", loginname=" + loginname
+ ", score=" + score + "]";
}
}
OGNLAction.java
package com.javacrazyer.web.action;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class OGNLAction extends ActionSupport {
private static final long serialVersionUID = -2554018432709689579L;
private String loginname;
private String pwd;
private User user;
private Set<String> courseSet;
private List<String> list;
private Map<String,String> map;
private List<User> userList;
public String execute() throws Exception{
this.loginname = "xkkkkkkkkkkkkkkkkkkkkkkkk";
this.user = new User(123, "wrr", 88.9, true, 'B', new Date());
this.courseSet = new LinkedHashSet<String>();
this.courseSet.add("corejava");
this.courseSet.add("JSP/Servlet");
this.courseSet.add("S2SH");
this.list = new ArrayList<String>(this.courseSet);
this.map = new HashMap<String, String>();
this.map.put("x", "xxx");
this.map.put("y", "yyy");
this.map.put("z", "zzz");
ActionContext context = ActionContext.getContext();
context.put("uname", "cheney");
context.put("inte", Integer.valueOf(888888));
context.put("user2", new User(123, "xxk", 88.9, true, 'B', new Date()));
this.userList = new ArrayList<User>();
this.userList.add(new User(1, "zs", 48.9, true, 'D', new Date()));
this.userList.add(new User(2, "ls", 68.1, true, 'C', new Date()));
this.userList.add(new User(3, "ww", 78.2, false, 'B', new Date()));
this.userList.add(new User(4, "zl", 88.3, true, 'A', new Date()));
//-----------------------------------------------------------------
//推荐方式:不会跟Servlet API耦合
context.put("reqAtt", "往ActionContext中put的属性");
context.getSession().put("sesAtt", "往ActionContext.getSession()中put的属性");
context.getApplication().put("appAtt", "往ActionContext.getApplication()中put的属性");
ServletActionContext.getRequest().setAttribute("reqAtt2", "Request作用域中的属性");
ServletActionContext.getRequest().getSession().setAttribute("sesAtt2", "Session作用域中的属性");
ServletActionContext.getServletContext().setAttribute("appAtt2", "Application作用域中的属性");
return SUCCESS;
}
public String getAppName(){
return "这是OGNL的使用示例代码";
}
public String getLoginname() {
return loginname;
}
public void setLoginname(String loginname) {
this.loginname = loginname;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Set<String> getCourseSet() {
return courseSet;
}
public void setCourseSet(Set<String> courseSet) {
this.courseSet = courseSet;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
}
src/struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<!-- 请求参数的编码方式 -->
<constant name="struts.i18n.encoding" value="UTF-8"/>
<!-- 指定被struts2处理的请求后缀类型。多个用逗号隔开 -->
<constant name="struts.action.extension" value="action,do,go,xkk"/>
<!-- 当struts.xml改动后,是否重新加载。默认值为false(生产环境下使用),开发阶段最好打开 -->
<constant name="struts.configuration.xml.reload" value="true"/>
<!-- 是否使用struts的开发模式。开发模式会有更多的调试信息。默认值为false(生产环境下使用),开发阶段最好打开 -->
<constant name="struts.devMode" value="false"/>
<!-- 设置浏览器是否缓存静态内容。默认值为true(生产环境下使用),开发阶段最好关闭 -->
<constant name="struts.serve.static.browserCache" value="false" />
<!-- 是否允许在OGNL表达式中调用静态方法,默认值为false -->
<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
<!-- 指定由spring负责action对象的创建
<constant name="struts.objectFactory" value="spring" />
-->
<!-- 是否开启动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
<package name="my" extends="struts-default" namespace="/">
<action name="ognl" class="com.javacrazyer.web.action.OGNLAction">
<result>/ognl_info.jsp</result>
</action>
</package>
</struts>
ognl_info.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>OGNL的使用</title>
</head>
<body>
<h3>OGNL的使用</h3><hr/>
访问Action中的普通属性: <s:property value="loginname"/><br/>
访问Action中的对象属性: <s:property value="user.birthday"/><br/>
访问Action中的Set属性: <s:property value="courseSet.toArray()[0]"/><br/>
访问Action中的List属性: <s:property value="list[0]"/><br/>
访问Action中的Map属性的键: <s:property value="map.keys.toArray()[1]"/><br/>
访问Action中的Map属性的值: <s:property value="map.values.toArray()[1]"/><br/>
访问Action中的Map属性的指定键对应的值: <s:property value="map['z']"/><br/>
访问Action中的Map属性的大小: <s:property value="map.size"/><br/>
<hr/>
访问ActionContext中的普通属性:<s:property value="#inte"/><br/>
访问ActionContext中的对象属性:<s:property value="#user2.loginname"/><br/>
<hr/>
访问Action中的普通方法:<s:property value="getAppName()"/><br/>
访问ActionContext中的某个对象上的普通方法:<s:property value="#user2.info()"/><br/>
<hr/>
访问静态属性:<s:property value="@java.lang.Math@PI"/><br/>
访问静态方法:<s:property value="@java.lang.Math@floor(44.56)"/><br/>
访问Math类中的静态方法:<s:property value="@@floor(44.56)"/><br/>
<hr/>
调用java.util.Date的构造方法:<s:date name="new java.util.Date()" format="yyyy-MM-dd HH:mm:ss"/><br/>
调用java.util.Date的构造方法创建对象,再调用它的方法:<s:property value="new java.util.Date().getTime()"/><br/>
<hr/>
投影查询:获取userList中所有loginname的列表:<s:property value="userList.{loginname}"/><br/>
选择查询:获取userList中所有score大于60的loginname列表:<s:property value="userList.{?#this.score>60.0}.{loginname}"/><br/>
选择查询:获取userList中所有score大于60并且gender为true的loginname列表:<s:property value="userList.{?(#this.score>60.0 && #this.gender)}.{loginname}"/><br/>
选择查询:获取userList中所有score大于60并且gender为true的第一个元素的loginname:<s:property value="userList.{^(#this.score>60.0 && #this.gender)}.{loginname}"/><br/>
选择查询:获取userList中所有score大于60并且gender为true的最后一个元素的loginname:<s:property value="userList.{$(#this.score>60.0 && #this.gender)}.{loginname}"/><br/>
<hr/>
访问名为xxx的请求参数对应的第一个值:<s:property value="#parameters.xxx[0]"/><br/>
访问通过ActionContext中放入Request中的属性:<s:property value="#request.reqAtt"/><br/>
访问通过ServletActionContext中放入Request中的属性:<s:property value="#request.reqAtt2"/><br/>
访问通过ActionContext中放入Session中的属性:<s:property value="#session.sesAtt"/><br/>
访问通过ServletActionContext中放入Session中的属性:<s:property value="#session.sesAtt2"/><br/>
访问通过ActionContext中放入ServletContext中的属性:<s:property value="#application.appAtt"/><br/>
访问通过ServletActionContext中放入ServletContext中的属性:<s:property value="#application.appAtt2"/><br/>
直接访问属性域中指定名称的属性对应的值:<s:property value="#attr.sesAtt2"/><br/>
<br/><br/><hr/>
<s:iterator value="userList" status="vs">
<s:if test="%{#vs.odd}">
<span style="color: red">
<s:property value="#vs.count"/>: <s:property value="loginname"/>,<s:date name="birthday" format="yyyy-MM-dd HH:mm:ss"/><br/>
</span>
</s:if>
<s:else>
<span style="color: blue">
<s:property value="#vs.count"/>: <s:property value="loginname"/>,<s:date name="birthday" format="yyyy-MM-dd HH:mm:ss"/><br/>
</span>
</s:else>
</s:iterator>
<hr/><s:debug/>
</body>
</html>
总结:
在上边大家都好奇为什么都用struts的S标签,因为OGNL是通常要结合Struts 2的标志一起使用,如<s:property value="xx" />等
Action类与JSP页面之间的数据传递
1) 通过HttpServletRequest,HttpSession,ServletContext来传递数据。
a) Action中传数据:在Action类的请求处理方法中先获取各个作用域对象
ServletActionContext.getRequest();
ServletActionContext.getRequest().getSession();
ServletActionContext.getServletContext();
然后调用相应的setAttribute(String "键", Object 值);
b) 在JSP页面中取数据:可以使用EL表达式或代码片段来取出对应作用域中属性值。
c) 页面中的请求参数传递到Action中时,Action中直接定义对应名称的属性,并提供setter方法即可封装此数据。
2) 通过ActionContext实例来传递数据。 ActionContext针对每个正在执行Action的线程中绑定一份。
a) Action中通过ActionContext传递数据。
ActionContext提供了put(String "键", Object 值); //数据不会映射到HttpServletRequest中。
ActionContext提供的getSession().put(String "键", Object 值); //数据会自动映射到HttpSession中。
ActionContext提供的getApplication().put(String "键", Object 值); //数据会自动映射到ServletContext中。
b) 在JSP页面取数据:struts2推荐使用OGNL来取ActionContext中的数据。
1. Struts2中的OGNL的使用。
2. OGNL:对象图导航语言。通过OGNL表达式可以获取对象的属性,调用对象的方法,或构造出对象。
1) OGNL上下文中有一个根对象。这个根对象可以直接获取。不需要#。
2)支持常量:
字符串常量、字符常量、
数值常量:int、long、float、double
布尔常量:true、false
Null常量 : null
支持操作符:支持Java的所有操作符,还支持特有的操作符: ,、 {}、in、not in;
Struts2中的OGNL:
1) Struts2将ActionContext设置为OGNL上下文,并将值栈(ValueStack)作为OGNL的根对象放置到ActionContext中。
2) Struts2总是把当前Action实例放置在值栈的栈顶。所以,在OGNL中引用Action中的属性也可以省略“#”。
常用标签
1) <s:property value="OGNL"/>
2) <s:date name="OGNL" format=""/>
3) <s:if test="OGNL"></s:if><s:elseif test="OGNL"></s:elseif><s:else></s:else>
★4) <s:iterator value="OGNL" status="vs">...</s:iterator>
5) <s:debug/>
struts2中#、%和$这三个符号的使用方法【摘自max struts2教程】
一、"#"的用法
1、 访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:
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) #attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止
2、用于过滤和投影(projecting)集合,如books.{?#this.price<100};
3、构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。
二、"%"的用法
“%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。例如在Ognl.jsp中加入以下代码:
<h3>%的用途</h3>
<p><s:url value="#foobar['foo1']" /></p>
<p><s:url value="%{#foobar['foo1']}" /></p>
三、"$"的用法
1、用于在国际化资源文件中,引用OGNL表达式
2、在Struts 2配置文件中,引用OGNL表达式
例如:
<action name="AddPhoto" class="addPhoto">
<interceptor-ref name="fileUploadStack" />
<result type="redirect">ListPhotos.action? albumId=${albumId}</result>
</action>
评论
但是为什么这个并没有看到%的出现呢??
二、"%"的用法
“%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。例如在Ognl.jsp中加入以下代码:
<h3>%的用途</h3>
<p><s:url value="#foobar['foo1']" /></p>
<p><s:url value="%{#foobar['foo1']}" /></p>
发表评论
-
struts2中关于ActionMessage在redirect传递时丢失问题的解决方案
2011-01-24 09:32 4337首先来看一段ACTION代码 @ParentPacka ... -
Struts2温习(10)--文件上传
2010-11-16 20:41 5649自接触这么多种技术的上传来看,还是Struts2的上传最好用, ... -
Struts2温习(9)--国际化的应用
2010-11-16 15:11 15381. Java对国际化的支持: Java内部使用unicode ... -
Struts2温习(8)--表单验证的两种方式
2010-11-16 10:32 49191. Struts2中的输入校验 2. 编码方式校验 1) ... -
Struts温习(7)--自定义类型转换器
2010-11-16 10:08 3284一、概述 在B/S应用中,将字符串请求参数转换 ... -
Struts2温习(6)--拦截器(Inteceptor)的使用
2010-11-15 21:36 2273Interceptor(以下译为拦截器)是Struts ... -
Struts2温习(4)--基于注解方式Action配置
2010-11-15 19:37 22879还是已登录来说明下这个Action的配置,这里要说的Actio ... -
Struts2温习(3)--ActionSuppot的使用
2010-11-15 17:29 2351之前在第一个示例中,使用到的Acrtion是没有继承任何方法的 ... -
Struts2温习(2)--工作原理图解
2010-11-15 10:11 1988就上篇文章的第一个完整的登录示例,我们本节来讲解下Struts ... -
Struts2温习(1)--最基本的示例
2010-11-15 10:01 3094有关Struts1的知识大部分都已经温习完毕,今天开始转向St ...
相关推荐
最近温习ssh2整合编程,顺便浏览下struts2有什么更新的消息,下载了新版本的struts2的2.1.8.1版,使用的是MyEclipse8.0开发,但是问题就随之而来了。MyEclipse8.0中自带的struts2版本是2.1.6,spring版本有2.0,2.5...
化工仪表及自动化讲稿.doc
内容概要:《2025智能移动机器人电机与减速机产品发展蓝皮书》由新战略移动机器人产业研究所根据CMR产业联盟统计数据编写,涵盖了国内外超30家电机及减速机企业的业务数据和移动机器人本体企业应用现状的综合分析。报告指出,2024年中国智能移动机器人电机市场规模约为11.6亿元,销售量约105万台,其中轮式移动机器人占比最大,达62.80%。未来市场将呈现“人形机器人引领增长、工业AGV/AMR稳健扩容、商用服务机器人快速渗透”的格局,预计到2030年人形机器人将占据大部分市场。智能移动机器人动力系统将朝着“更高效、更聪明、更绿色”的方向发展,推动机器人从“工具”向“智能体”转变。; 适合人群:从事智能移动机器人及相关领域的研发人员、投资者、电机及减速机厂商等专业人士。; 使用场景及目标:①帮助本体企业进行产品选型;②为投资方提供市场趋势和投资机会的参考;③指导电机及减速机厂商制定发展战略和市场布局。; 其他说明:蓝皮书的数据来源于国内外超过30家电机及减速机企业和超过35家机器人企业的调研,采用多种调研方式确保数据的准确性和可靠性。报告覆盖了工业移动机器人(AGV/AMR)、人形机器人及商用服务机器人等领域,不包括家用扫地机器人和农业机器人。
论文模板-html5蓝色智能电子产品网站源码-实训商业源码.zip
内容概要:本文介绍了基于内容的新闻推荐系统的技术实现与功能特点。该系统主要采用Java EE技术栈,包括Java、Eclipse、MySQL、Spring、SpringMVC、Mybatis等技术,结合TF-IDF算法和余弦相似度算法,通过对用户浏览行为的分析,挖掘用户的兴趣偏好,为用户提供个性化新闻推荐。系统分为前台和后台两大功能模块,前台提供新闻分类查看、详情阅读、评论互动等功能,后台支持系统设置、用户管理、新闻管理等操作。项目的完整源码、数据库及相关文档均包含在内,便于部署和二次开发。 适合人群:对Java EE技术栈有一定了解的研发人员和技术爱好者。 使用场景及目标:适用于希望深入了解基于内容的推荐算法及其实际应用的开发者,尤其是那些想要构建类似新闻推荐系统的团队。通过学习该项目,能够掌握推荐系统的架构设计、算法实现及前后台功能开发。 阅读建议:建议读者先熟悉Java EE相关技术和推荐算法的基本概念,再逐步深入研究项目源码和文档,结合实际运行环境进行实践探索。
内容概要:本文详细介绍了如何在微电网优化中处理风光不确定性的问题。文中首先阐述了风光不确定性带来的挑战,接着引入了机会约束和概率序列的概念,作为描述和处理不确定性的数学工具。随后,文章深入解析了一段基于MATLAB环境并使用CPLEX求解器的代码,该代码通过构建数学模型,定义目标函数和约束条件,最终实现了对风光不确定性的有效处理和优化。最后,文章强调了这段代码的学习价值,鼓励研究者借鉴其方法,进一步探索和完善微电网优化策略。 适合人群:从事微电网研究和技术开发的专业人士,尤其是那些关注可再生能源不确定性和优化算法的研究者。 使用场景及目标:适用于希望深入了解微电网优化中不确定性处理方法的研究者和技术人员,旨在提高微电网系统的稳定性和可靠性。 阅读建议:读者可以通过学习这段代码,掌握如何将机会约束和概率序列应用于实际问题中,同时也可以将其作为一个参考范例,启发更多创新的方法和策略。
工程项目管理中风险防控、签证管理及反索赔.ppt
论文模板-(PC+WAP)教育咨询服务类网站pbootcms模板 教育培训出国留学机构网站源码-实训商业源码.zip
实训商业源码-呆瓜助手-毕业设计.zip
论文模板-html5工业设备网站源码-实训商业源码.zip
论文模板-beginning-实训商业源码.zip
第七章-Android常用高级控件.ppt
GIS设备超声波法局部放电测试作业指导书.doc
实训商业源码-餐饮酒店装饰设计类网站-毕业设计.zip
实训商业源码-服务器在线测速系统源码-毕业设计.zip
内容概要:本文探讨了三相异步电机的MARS(模型参考自适应)控制技术及其在Matlab中的仿真应用。首先介绍了三相异步电机的基本概念和特点,强调了其在电力工程和控制系统中的重要性和广泛应用。接着详细解释了MARS控制原理,即通过动态调整控制器参数,使系统能够适应外部环境变化和模型不确定性,从而提高电机的运行效率和稳定性。最后,通过具体的Matlab仿真实验展示了MARS控制算法的具体实现步骤,包括电机参数设置、控制算法编码、仿真结果分析等。 适合人群:从事电力工程、自动化控制领域的研究人员和技术人员,尤其是对先进电机控制技术和仿真工具有一定兴趣的专业人士。 使用场景及目标:适用于需要深入了解三相异步电机高级控制策略的研究项目或工业应用。主要目标是掌握MARS控制技术的工作机制,并能够在实际工作中运用Matlab进行相关仿真实验。 其他说明:文中提供的代码片段为初步实现MARS控制算法的示例,读者可根据具体需求进一步优化和完善。此外,文章还鼓励读者探索更多关于MARS控制技术的可能性和发展方向。
电子商务网站规划书.doc
内容概要:本文介绍了利用ABAQUS软件进行连续驱动摩擦焊接仿真的方法。首先,文章详细阐述了如何建立一个二维轴对称的热力耦合计算模型,以更真实地反映焊接过程中的热力行为。接着,重点讨论了两种关键的网格处理技术——网格重画(remesh)和网格求解变换(map solution),这两种技术分别用于提高计算精度和效率,以及适应材料变形和热传导变化。最后,通过实际代码片段展示了如何在ABAQUS中应用这些技术。研究结果表明,这种方法不仅能加深对摩擦焊接机理的理解,还能为优化焊接工艺提供重要参考。 适合人群:从事机械工程、材料科学及相关领域的研究人员和技术人员,尤其是那些希望深入了解摩擦焊接仿真技术的人。 使用场景及目标:适用于需要模拟和优化摩擦焊接过程的研究项目。主要目标是通过仿真技术提升对焊接过程的理解,改进焊接工艺,提高产品质量和生产效率。 其他说明:文中提供的代码片段可以帮助读者快速上手ABAQUS软件的相关操作,同时理论部分也为进一步研究提供了坚实的基础。
实训商业源码-电子数码产品配件网站源码-毕业设计.zip
内容概要:本文详细介绍了威纶通触摸屏程序设计中的60个实用案例,涵盖了从简单到复杂的多种功能实现方法。首先介绍了欢迎界面跳转的功能,通过系统寄存器设置开机后的自动跳转。接着讲解了配方查询功能,展示了如何将配方记录保存为CSV格式并进行查询。然后讨论了定时锁屏功能,推荐使用触摸事件绑定到全局脚本来实现更可靠的锁屏机制。最后深入探讨了曲线显示功能,采用双缓冲技术实现了实时数据显示和历史数据存储。文中还提到了一些注意事项和技术限制,如计时器精度、CSV文件大小限制以及数组长度限制等。 适合人群:从事工业控制系统开发的技术人员,尤其是熟悉威纶通触摸屏的开发者。 使用场景及目标:帮助开发者理解和应用威纶通触摸屏的各种实用功能,提高开发效率和系统可靠性。具体应用场景包括但不限于自动化生产线、设备监控、配方管理等领域。 其他说明:文中提供的代码片段均为经过实战验证的有效解决方案,但在实际项目中需要根据具体情况适当调整。同时提醒开发者关注威纶通平台的一些技术限制,避免因超出限制而导致的问题。