<c:if>显示了unkonwn tag
时间: 2024-02-27 20:51:48 浏览: 27
如果您在使用 `<c:if>` 标签时出现了 `unknown tag` 错误,这可能是由于缺少 JSTL(JavaServer Pages Standard Tag Library)标签库的支持。为了使用 JSTL 标签库,您需要将 JSTL 的相关 JAR 包添加到您的项目中,并在 JSP 页面中引入 JSTL 标签库的命名空间。
以下是一个引入 JSTL 标签库的示例代码:
```jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 在这里使用 <c:if> 标签 -->
<c:if test="${userRule == 0}">
<li> <a href="users.jsp">用户管理</a></li>
</c:if>
```
在上述代码中,我们使用了 JSP 页面中的 `taglib` 指令来引入 JSTL 标签库的命名空间,并在 `<c:if>` 标签中使用了 EL 表达式来引用我们从 Java Servlet 中传递过来的 `userRule` 变量。
如果您仍然遇到了 `unknown tag` 错误,请确保您已经正确地添加了 JSTL 相关的 JAR 包,并在 JSP 页面中正确地引入了 JSTL 标签库的命名空间。
相关问题
objectarx二次开发自定义实体,实体数据是一个结构体tag,结构体tag中包含另外一个结构体map、一个类指针Class*、一个bool,而结构体map保存的是一个long long int数据和一个vector<wstring>.类指针class中有一个vector<class2*>, class2是个基类,使用时会根据class中的int型的参数判断强制转换成不同子类进行绘制,子类中的数据也不相同,class2中包含了vector<AcGePoint3D>以及字符串、int等数据,请问如何保存读取这些数据到dwg
为了保存自定义实体及其数据到DWG文件中,您需要使用AutoCAD提供的ObjectARX API进行开发。下面是大致的步骤:
1. 定义自定义实体类,其中包含tag结构体、Class类指针、bool变量等成员变量。
```cpp
class MyEntity : public AcDbEntity
{
public:
ACDB_DECLARE_MEMBERS(MyEntity);
MyEntity();
virtual ~MyEntity();
// Overridden methods from AcDbEntity
virtual Adesk::Boolean subWorldDraw(AcGiWorldDraw* pWd);
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler) const;
virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* pFiler);
private:
tag m_tag;
Class* m_pClass;
bool m_bFlag;
};
```
2. 在实体类中实现`dwgOutFields`和`dwgInFields`方法,用于保存和读取实体数据到DWG文件中。
```cpp
Acad::ErrorStatus MyEntity::dwgOutFields(AcDbDwgFiler* pFiler) const
{
Acad::ErrorStatus es = AcDbEntity::dwgOutFields(pFiler);
if (es != Acad::eOk) return es;
// Write tag data
pFiler->writeInt32(m_tag.map.size());
for (auto it = m_tag.map.begin(); it != m_tag.map.end(); ++it)
{
pFiler->writeInt64(it->first);
pFiler->writeInt32(it->second.size());
for (const auto& str : it->second)
{
pFiler->writeBChunk(str.c_str(), str.size() * sizeof(wchar_t));
}
}
pFiler->writeInt64(reinterpret_cast<AcDbUIntPtr>(m_tag.ClassPtr));
pFiler->writeBool(m_tag.bFlag);
// Write Class data
pFiler->writeInt32(m_pClass->vec2.size());
for (const auto& pClass2 : m_pClass->vec2)
{
pFiler->writeInt32(pClass2->getType()); // Save type information
pFiler->writeBChunk(&pClass2->ptVec[0], pClass2->ptVec.size() * sizeof(AcGePoint3d));
pFiler->writeBChunk(pClass2->str.c_str(), pClass2->str.size() * sizeof(wchar_t));
pFiler->writeInt32(pClass2->n);
}
return pFiler->filerStatus();
}
Acad::ErrorStatus MyEntity::dwgInFields(AcDbDwgFiler* pFiler)
{
Acad::ErrorStatus es = AcDbEntity::dwgInFields(pFiler);
if (es != Acad::eOk) return es;
// Read tag data
int nSize = 0;
pFiler->readInt32(&nSize);
for (int i = 0; i < nSize; ++i)
{
long long llKey = 0;
pFiler->readInt64(&llKey);
int nVecSize = 0;
pFiler->readInt32(&nVecSize);
std::vector<std::wstring> vecStr;
for (int j = 0; j < nVecSize; ++j)
{
char* pBuf = nullptr;
int nLen = 0;
pFiler->readBChunk(&pBuf, &nLen);
vecStr.emplace_back(reinterpret_cast<wchar_t*>(pBuf), nLen / sizeof(wchar_t));
acutDelString(pBuf);
}
m_tag.map[llKey] = vecStr;
}
AcDbUIntPtr nPtr = 0;
pFiler->readInt64(reinterpret_cast<AcDbUIntPtr*>(&nPtr));
m_tag.ClassPtr = reinterpret_cast<Class*>(nPtr);
pFiler->readBool(&m_tag.bFlag);
// Read Class data
pFiler->readInt32(&nSize);
for (int i = 0; i < nSize; ++i)
{
int nType = 0;
pFiler->readInt32(&nType);
class2* pClass2 = nullptr;
if (nType == 1)
{
pClass2 = new class2A;
}
else if (nType == 2)
{
pClass2 = new class2B;
}
else
{
// Unknown type, skip
continue;
}
char* pBuf = nullptr;
int nLen = 0;
pFiler->readBChunk(&pClass2->ptVec[0], pClass2->ptVec.size() * sizeof(AcGePoint3d));
pFiler->readBChunk(&pBuf, &nLen);
pClass2->str = std::wstring(reinterpret_cast<wchar_t*>(pBuf), nLen / sizeof(wchar_t));
acutDelString(pBuf);
pFiler->readInt32(&pClass2->n);
m_pClass->vec2.emplace_back(pClass2);
}
return pFiler->filerStatus();
}
```
3. 在自定义实体的构造函数中初始化成员变量。
```cpp
MyEntity::MyEntity()
{
m_tag.ClassPtr = nullptr;
m_tag.bFlag = false;
m_pClass = new Class;
}
```
4. 在实体类中实现`subWorldDraw`方法,用于绘制实体。
```cpp
Adesk::Boolean MyEntity::subWorldDraw(AcGiWorldDraw* pWd)
{
// Draw entity using OpenGL
// ...
// Draw Class data
for (const auto& pClass2 : m_pClass->vec2)
{
if (auto pClass2A = dynamic_cast<class2A*>(pClass2))
{
// Draw class2A using OpenGL
// ...
}
else if (auto pClass2B = dynamic_cast<class2B*>(pClass2))
{
// Draw class2B using OpenGL
// ...
}
else
{
// Unknown type, skip
continue;
}
}
return Adesk::kTrue;
}
```
在AutoCAD中使用自定义实体时,可以使用下列代码进行创建并添加到当前图形数据库中:
```cpp
MyEntity* pEnt = new MyEntity;
AcDbObjectId objId;
Acad::ErrorStatus es = acdbHostApplicationServices()->workingDatabase()->addAcDbEntity(objId, pEnt);
if (es == Acad::eOk)
{
// Set entity properties
// ...
// Add entity to current space
AcDbBlockTableRecord* pBTR = nullptr;
es = acdbHostApplicationServices()->workingDatabase()->getModelSpace(pBTR, AcDb::kForWrite);
if (es == Acad::eOk)
{
es = pBTR->appendAcDbEntity(objId, pEnt);
pBTR->close();
}
}
else
{
delete pEnt;
}
```
当从DWG文件中读取自定义实体时,可以使用下列代码进行获取:
```cpp
AcDbObjectIdArray objIds;
acdbGetObjectsOfType(objIds, MyEntity::desc());
for (const auto& objId : objIds)
{
MyEntity* pEnt = nullptr;
Acad::ErrorStatus es = acdbOpenAcDbEntity(reinterpret_cast<AcDbEntity*&>(pEnt), objId, AcDb::kForRead);
if (es == Acad::eOk)
{
// Get entity properties
// ...
pEnt->close();
}
}
```
2023-06-17 23:47:22.786162: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'cudart64_110.dll'; dlerror: cudart64_110.dll not found 2023-06-17 23:47:22.786281: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine. 2023-06-17 23:47:24.419330: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'nvcuda.dll'; dlerror: nvcuda.dll not found 2023-06-17 23:47:24.419809: W tensorflow/stream_executor/cuda/cuda_driver.cc:263] failed call to cuInit: UNKNOWN ERROR (303) 2023-06-17 23:47:24.426229: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:169] retrieving CUDA diagnostic information for host: ����� 2023-06-17 23:47:24.426345: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:176] hostname: ����� 2023-06-17 23:47:24.430552: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX AVX2 To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags. Traceback (most recent call last): File "C:\Users\10290\Desktop\test\writer.py", line 20, in <module> write_reward_tb(summary_writer, rewards[i], i) File "C:\Users\10290\Desktop\test\writer.py", line 9, in write_reward_tb summary = tf.Summary(value=[tf.Summary.Value(tag='reward', simple_value=reward)]) AttributeError: module 'tensorflow' has no attribute 'Summary'分析错误原因
这个错误是由于TensorFlow 2.x版本中`tf.Summary`已被弃用所致。相反,你应该使用`tf.summary.Summary`。你需要将代码更新为:
```
summary = tf.summary.Summary(value=[tf.summary.Summary.Value(tag='reward', simple_value=reward)])
```
这样就可以避免这个错误了。另外,还需要注意,TensorFlow 2.x版本中`tf.summary.FileWriter`已经被弃用,应该使用`tf.summary.create_file_writer`来创建一个`tf.summary.FileWriter`的实例。