Я только начал изучать технологию JSP и наткнулся на стену.
*Как вывести HTML из метода в <%! ... %> блока декларации JSP?
Это'не работает:
<%!
void someOutput() {
out.println("Some Output");
}
%>
...
<% someOutput(); %>
Server says there's no “out”.
U: Я знаю, как переписать код, в котором этот метод возвращает строку, но есть ли способ сделать это внутри <%! void () { } %> ? Пусть это и неоптимально, но все же интересно.
Внутри директив нельзя использовать переменную 'out' (как и другие "предопределенные" переменные скриптлета).
JSP-страница транслируется вашим веб-сервером в Java-сервлет. В tomcats, например, все, что находится внутри скриптов (которые начинаются "<%"), вместе со всем статическим HTML транслируется в один гигантский Java-метод, который записывает вашу страницу, строка за строкой, в экземпляр JspWriter под названием "out". Именно поэтому в скриптлетах можно использовать параметр "out" напрямую. Директивы же (начинающиеся с "<%!") транслируются как отдельные Java-методы.
В качестве примера можно привести очень простую страницу (назовем ее foo.jsp):
<html>
<head/>
<body>
<%!
String someOutput() {
return "Some output";
}
%>
<% someOutput(); %>
</body>
</html>
будет выглядеть примерно так (для наглядности многие детали пропущены):
public final class foo_jsp
{
// This is where the request comes in
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
// JspWriter instance is gotten from a factory
// This is why you can use 'out' directly in scriptlets
JspWriter out = ...;
// Snip
out.write("<html>");
out.write("<head/>");
out.write("<body>");
out.write(someOutput()); // i.e. write the results of the method call
out.write("</body>");
out.write("</html>");
}
// Directive gets translated as separate method - note
// there is no 'out' variable declared in scope
private String someOutput()
{
return "Some output";
}
}
<%!
private void myFunc(String Bits, javax.servlet.jsp.JspWriter myOut)
{
try{ myOut.println("<div>"+Bits+"</div>"); }
catch(Exception eek) { }
}
%>
...
<%
myFunc("more difficult than it should be",out);
%>
Попробуйте это, это работает для меня!
Полагаю, это поможет:
<%!
String someOutput() {
return "Some Output";
}
%>
...
<%= someOutput() %>
В любом случае, иметь код в представлении - не самая лучшая идея.
Все, что вам нужно сделать, это передать объект JspWriter в метод в качестве параметра, т.е.
void someOutput(JspWriter stream)
Затем вызвать его через:
<% someOutput(out) %>
Объект writer является локальной переменной внутри _jspService, поэтому его необходимо передать в метод утилиты. То же самое относится и ко всем остальным встроенным ссылкам (например, request, response, session).
Отличным способом посмотреть, что происходит, является использование Tomcat в качестве сервера и поиск в каталоге 'work' файла '.java', созданного на вашей странице 'jsp'. В качестве альтернативы в weblogic можно использовать компилятор страниц 'weblogic.jspc' для просмотра Java-файла, который будет сгенерирован при запросе страницы.
Простой альтернативой может быть следующее:
<%!
String myVariable = "Test";
pageContext.setAttribute("myVariable", myVariable);
%>
<c:out value="myVariable"/>
<h1>${myVariable}</h1>
Вы могли бы просто использовать переменную в код JSP
Вы можете сделать что-то вроде этого:
<%!
String myMethod(String input) {
return "test " + input;
}
%>
<%= myMethod("1 2 3") %>
Это будет выход теста 1 2 3 к странице.
слишком поздно, чтобы ответить на него, но в этом помочь другим
<%!
public void printChild(Categories cat, HttpServletResponse res ){
try{
if(cat.getCategoriesSet().size() >0){
res.getWriter().write("") ;
}
}catch(Exception exp){
}
}
%>
Вы можете сделать что-то вроде этого: <БР>
<%
out.print("<p>Hey!</p>");
out.print("<p>How are you?</p>");
%>