Custom Tags -> SKIP_BODY után EVAL_PAGE nem megy

Fórumok

Sziasztok,

Az alábbi kódban ha a "condition" nem teljesül, tehát SKIP_BODY következik be, az EVAL_PAGE nem fut le. Azért, mert akkor a doEndTag sem fut le? Ha igen, hogyan lehet megoldani, hogy mégis meglegyen az EVAL_PAGE? Ebben a témakörben eléggé új vagyok :)

Azt szeretném elérni, ha ebből nem derülne ki, hogy a JSP-mben feltétel alapján írok ki valamit vagy sem.:

{px:mytag someParam="ertekeldki"}ha az átadott érték a tag-ben megadott feltételeknek megfelel, ezt kiírom szépen{/px:mytag}
(hiába tettem code blokkba, nem jelent meg a kacsacsőr miatt szóval ezért lett {} :D)

Előre is köszi a válaszokat!


public class SomeHandler extends BodyTagSupport {

private String someParam;

public SomeHandler() {
super();
}

public void setSomeParam(String name) {
someParam = name;
}

@Override
public int doStartTag() throws JspException {
if (condition) {
return SKIP_BODY;
} else {
return EVAL_BODY_BUFFERED;
}
}

@Override
public int doEndTag() throws JspException {
try {
if (bodyContent != null) {
bodyContent.writeOut(bodyContent.getEnclosingWriter());
}
} catch (IOException e) {
throw new JspException("Error: " + e.getMessage());
}

bodyContent.clearBody();

return EVAL_PAGE;
}
}

Hozzászólások

Te a someParam értékének függvényében szeretnél kiíratni valamit? Mert szerintem akkor elég a doStartTag()-et felülírni:

@Override
public int doStartTag() throws JspException {
if (someparam.equals("ertekeldki")) {
try{
JSPWriter out = pageContext.getOut();
out.write("ha az átadott érték a tag-ben megadott feltételeknek megfelel, ezt kiírom szépen");
catch(Exception e) { throw new JSPException(e.getMessage())) }
}

return EVAL_BODY_BUFFERED;
}

U.i.: erősen skicc és már nagyon rég nem használtam TagSupportot :)

a someParam értékének függvényében szeretném kiíratni a body-t vagy sem. Így a pontos :)
Most azt próbálom éppen ki, hogy a doStartTag-ben csak EVAL_BODY_BUFFERED, és a doEndTag-ben valósítom meg a feltételt, aminek függvényében a bodyContent-et vagy kiírom vagy nem, aztán mindig EVAL_BODY

ez így ebben a formában helyes? (hogy működő-e, azt mindjárt kiderítem :))

most ebben a formában működik:

public class SomeHandler extends BodyTagSupport {

private String someParam;

public SomeHandler() {
super();
}

public void setSomeParam(String name) {
someParam = name;
}

@Override
public int doStartTag() throws JspException {
return EVAL_BODY_BUFFERED;
}

@Override
public int doEndTag() throws JspException {
boolean writeOut = false;

if (feltétel) {
writeOut = true;
} else {
writeOut = false;
}

if (writeOut == true) {
try {
if (bodyContent != null) {
bodyContent.writeOut(bodyContent.getEnclosingWriter());
}
} catch (IOException e) {
throw new JspException("Error: " + e.getMessage());
}
}

bodyContent.clearBody();

return EVAL_PAGE;
}
}

De nem csak azt szeretném, hogy működjön, hanem azt is, hogy helyes megoldás legyen, ne gány. Szóval, erről mi a vélemény? :)


import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class SomeTag extends BodyTagSupport {

	private static final long serialVersionUID = 1L;

	private String someParam;

	public void setSomeParam(String someParam) {
		this.someParam = someParam;
	}

	@Override
	public int doEndTag() throws JspException {
		try {
			if (someParam.equals("oks")) {
					pageContext.getOut().write(getBodyContent().getString());
			} else {
				pageContext.getOut().write("a megadott paraméter nem oké...");
			}
		} catch (IOException e) {
			throw new JspException(e.getMessage());
		}

		return EVAL_PAGE;
	}

	@Override
	public void release() {
		someParam = null;
		super.release();
	}
}

Ne kacsacsőrös code-ot hanem szögletes-zárójelescode-ot használj. Amit szeretnél arra ez bőségesen elég ;)
U.i.: Google-be keress rá arra amiből származtatsz(v. implementálsz) és olvasgasd az API-t. Ott le van írva mindenféle hasznos dolog :)