BodyTag备用

本文介绍如何在JSP中实现带Body内容的自定义标签,并通过具体示例展示了如何利用BodyTag接口来控制标签体的迭代显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在自定义标签之HelloWorld中用Tag和TagSupport实现了简单的HelloWorld,那么这篇记录带Body的标签开发,带有Body的Tag必须要实现javax.servlet.jsp.tagext.BodyTag接口,BodyTag接口中定义了一些处理标签体的方法 。
通过实现BodyTag接口,就可以方便地操作标签体,比如可以让标签体迭代多次等。BodyTag的处理过程如下:前4步与一般的标签体一样
1:当容器创建一个新的标签实例后,通过setPageContext设置标签的页面上下文。
2:使用setParent方法设置这个标签的上一级标签。如果没有上一级嵌套,设置为空。
3:设置标签的属性。这个属性在标签库描述文件中定义。如果没有定义属性就不调用此类方法。
4:调用 doStartTag方法,这个方法可以返回EVAL_BODY_INCLUDE和SKIP_BODY。当返回EVAL_BODY_INCLUDE时,就计算标签的BODY,如果返回SKIP_BODY,就不计算标签的BODY。
5:调用setBodyContent设置当前的BodyContent
6:调用doInitBody。如果在计算BodyContent时需要进行一些初始化,就在这个方法中进行。
7:每次计算完BodyTag后调用 doAfterBody。如果返回EVAL_BODY_TAG,表示继续计算一次BodyTag,直到返回SKIP_BODY才继续执行第 8 步。
8:调用doEndTag方法,这个方法可以返回EVAL_PAGE或者SKIP_PAGE。当返回 EVAL_PAGE时,容器在标签结束时继续计算JSP页面的其他部份,如果返回SKIP_PAGE,容器将在标签结果时停止计算JSP页面的其他部分。
9:调用release()方法释放标签程序占用的任何资源

好了,废话我也不希望多说,下面来一个实例:
A:标签的实现代码

package eflylab;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.util.Hashtable;
import java.io.Writer;
import java.io.IOException;

public class BodyTagExample extends BodyTagSupport
{
int counts;//counts为迭代的次数。
public BodyTagExample()
{
super();
}

/** *//**
*设置counts属性。这个方法由容器自动调用。
*/
public void setCounts(int c)
{
this.counts=c;
}

/** *//**
*覆盖doStartTag方法
*/
public int doStartTag() throws JspTagException
{
System.out.println("doStartTag");
if(counts>0)
{
return EVAL_BODY_TAG;
}
else
{
return SKIP_BODY;
}
}

/** *//**
*覆盖doAfterBody方法
*/
public int doAfterBody() throws JspTagException
{
System.out.println("doAfterBody"+counts);
if(counts>1)
{
counts--;
return EVAL_BODY_TAG;
}
else
{
return SKIP_BODY;
}
}

/** *//**
*覆盖doEndTag方法
*/
public int doEndTag() throws JspTagException
{
System.out.println("doEndTag");
try
{
if(bodyContent != null)
{
bodyContent.writeOut(bodyContent.getEnclosingWriter());
}
}
catch(java.io.IOException e)
{
throw new JspTagException("IO Error: " + e.getMessage());
}
return EVAL_PAGE;
}

public void doInitBody() throws JspTagException{
System.out.println("doInitBody");
}
public void setBodyContent(BodyContent bodyContent)
{
System.out.println("setBodyContent");
this.bodyContent=bodyContent;

}


}
每次计算 完Body时,都会调用 doAfterBody方法。
B:标签描述文件mytag.tld中加入 <tag>
<name>loop</name>
<tag-class>eflylab.BodyTagExample</tag-class>
<body-content>jsp</body-content><!-- 必须为jsp -->
<attribute>
<name>counts</name><!-- 这个是我们资源源文件中的属性,同时源文件中必须要有setCounts(int counts)方法 -->
<required>true</required><!-- 必需要给定 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>C:测试页面
<%@ taglib uri="/demotag" prefix="bodytag" %>
<html>
<head>
<title>body tag</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<HR>
<bodytag:loop counts="5">
现在的时间是: <%=new java.util.Date()%><BR>
</bodytag:loop>
<HR>
</BODY>
</HTML>运行:

同时控制台:

这里打印的内容就是调用标签中方法的顺序。可以看出除了doAfterBody外,其他方法都只调用了一次。doAfterBody在每次循环完后都会调用。
void NXDlg::TimeReset() { if(m_BodyDataHtr.size()) { std::vector<std::string> allFile = XQ_ask_all_files_of_type(m_bodyPath + "\\","*.lg"); for(size_t i = 0; i < allFile.size(); i++) { tag_t bodyTag = atoi(allFile[i].c_str()); if(m_bodyHtr.count(bodyTag)) { //读的方式打开TXT bool isOk = false; ifstream open_txt(m_bodyPath + "\\" + allFile[i]); // XQ_write_window_n(m_bodyPath + "\\" + allFile[i]); std::string findStr = "fileSize="; size_t nSize = 0; if(open_txt.is_open())//判断是否打开 { std::string temp0; while(std::getline(open_txt,temp0))//获取每一行的信息 { if((nSize = temp0.find(findStr)) != -1) { double fileSize = (atof(temp0.substr(findStr.size() + nSize,temp0.size()).c_str())); if(fileSize < 0) { m_tree1.SetItemText(m_bodyHtr[bodyTag],3,XQ_get_Cstr("优化失败")); std::string bodyFile = m_bodyPath + "\\" + XQ_get_str(bodyTag) + ".prt"; std::string newExeFile = m_bodyPath + "\\" + XQ_get_str(bodyTag) + ".exe"; open_txt.close();//关闭TXT文档 std::string lgFile = m_bodyPath + "\\" + XQ_get_str(bodyTag) + ".lg"; std::string delFile = m_bodyPath + "\\" + XQ_get_str(bodyTag); // XQ_write_window_n(bodyFile); XQ_DeleteFile(bodyFile); XQ_DeleteFile(newExeFile); XQ_Del_file_to_recycleBin(delFile.c_str()); XQ_DeleteFile(lgFile); m_optBodys.erase(bodyTag); } else { fileSize = fileSize / (1024 * 1024); m_tree1.SetItemText(m_bodyHtr[bodyTag],3,XQ_get_Cstr(fileSize,4)); } isOk = true; } } open_txt.close();//关闭TXT文档 } if(!isOk) { m_tree1.SetItemText(m_bodyHtr[bodyTag],3,XQ_get_Cstr("优化中……")); } } // XQ_write_window_n(XQ_get_str(bodyTag)); } // XQ_write_window_n("2"); } }解释一下
最新发布
03-22
void createDiam(tag_t viewTag, tag_t bodyTag, tag_t edge1, tag_t edge2, double fristEdgeP1[3], double secondEdgeP1[3], double dimOrigin[3]) { NXOpen::Session* theSession = NXOpen::Session::GetSession(); NXOpen::Part* workPart(theSession->Parts()->Work()); NXOpen::Part* displayPart(theSession->Parts()->Display()); NXOpen::Annotations::RapidDimensionBuilder* dimBuilder = workPart->Dimensions()->CreateRapidDimensionBuilder(nullptr); NXOpen::Annotations::Dimension* nullNXOpen_Annotations_Dimension(NULL); NXOpen::Annotations::RapidDimensionBuilder* rapidDimensionBuilder1; rapidDimensionBuilder1 = workPart->Dimensions()->CreateRapidDimensionBuilder(nullNXOpen_Annotations_Dimension); rapidDimensionBuilder1->Driving()->SetDrivingMethod(NXOpen::Annotations::DrivingValueBuilder::DrivingValueMethodReference); NXOpen::View* nullNXOpen_View(NULL); rapidDimensionBuilder1->Measurement()->SetDirectionView(nullNXOpen_View); rapidDimensionBuilder1->Style()->DimensionStyle()->SetNarrowDisplayType(NXOpen::Annotations::NarrowDisplayOptionNone);//标注尺寸在线上 NXOpen::Drawings::BaseView* baseView1(dynamic_cast<NXOpen::Drawings::BaseView*>((NXObjectManager::Get(viewTag)))); NXOpen::Drawings::DraftingBody* draftingBody1(dynamic_cast<NXOpen::Drawings::DraftingBody*>(NXObjectManager::Get(bodyTag))); NXOpen::Drawings::DraftingCurve* draftingCurve1(dynamic_cast<NXOpen::Drawings::DraftingCurve*>(NXObjectManager::Get(edge1))); NXOpen::Point3d point1(fristEdgeP1[0], fristEdgeP1[1], fristEdgeP1[2]); NXOpen::Point3d point(0.0, 0.0, 0.0); //rapidDimensionBuilder1->FirstAssociativity()->SetValue(NXOpen::InferSnapType::SnapTypeMid, draftingCurve1, baseView1, point1, NULL, nullNXOpen_View, point); rapidDimensionBuilder1->FirstAssociativity()->SetValue(draftingCurve1, baseView1, point1); NXOpen::Drawings::DraftingCurve* draftingCurve2(dynamic_cast<NXOpen::Drawings::DraftingCurve*>(NXObjectManager::Get(edge2))); NXOpen::Point3d point1_3(secondEdgeP1[0], secondEdgeP1[1], secondEdgeP1[2]); NXOpen::Point3d point2_3(0.0, 0.0, 0.0); rapidDimensionBuilder1->SecondAssociativity()->SetValue(NXOpen::InferSnapType::SnapTypeMid, draftingCurve2, baseView1, point1_3, NULL, nullNXOpen_View, point2_3); NXOpen::Point3d point2(dimOrigin[0], dimOrigin[1], 0.0); rapidDimensionBuilder1->Origin()->Origin()->SetValue(NULL, nullNXOpen_View, point2);//标注原点 NXOpen::NXObject* nXObject1; nXObject1 = rapidDimensionBuilder1->Commit(); } 以上代码的 NXOpen::Drawings::DraftingBody* draftingBody1(dynamic_cast<NXOpen::Drawings::DraftingBody*>(NXObjectManager::Get(bodyTag))); NXOpen::Drawings::DraftingCurve* draftingCurve1(dynamic_cast<NXOpen::Drawings::DraftingCurve*>(NXObjectManager::Get(edge1)));是什么,该怎么获取参数
03-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值