Подтвердить что ты не робот

Как вывести HTML из JSP <%!...%> блок?

Я только начал изучать технологию JSP и наткнулся на стену.

Как вы выводите HTML из метода в <%!...% > Блок объявлений JSP?

Это не работает:

<%! 
void someOutput() {
    out.println("Some Output");
}
%>
...
<% someOutput(); %>

Сервер говорит, что нет "выхода".

U: Я знаю, как переписать код с этим методом, возвращая строку, но есть ли способ сделать это внутри <%! void() {}% > ? Хотя это может быть неоптимальным, это все еще интересно.

4b9b3361

Ответ 1

Вы не можете использовать переменную '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";
    }
}

Ответ 2

<%!
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);
%>

Попробуй, это сработало для меня!

Ответ 3

Все, что вам нужно сделать, - передать объект JspWriter в ваш метод как параметр i.e.

void someOutput(JspWriter stream)

Затем вызовите его через:

<% someOutput(out) %>

Объект writer является локальной переменной внутри _jspService, поэтому вам нужно передать ее в свой служебный метод. То же самое относится ко всем другим встроенным ссылкам (например, запрос, ответ, сеанс).

Отличный способ увидеть, что происходит, - использовать Tomcat в качестве вашего сервера и перейти в каталог "work" для файла ".java", созданного на вашей странице "jsp". Кроме того, в weblogic вы можете использовать компилятор страницы "weblogic.jspc" для просмотра Java, который будет сгенерирован при запросе страницы.

Ответ 4

Я полагаю, это помогло бы:

<%! 
   String someOutput() {
     return "Some Output";
  }
%>
...
<%= someOutput() %>

В любом случае, неплохо иметь код в представлении.

Ответ 5

Простой альтернативой может быть следующее:

<%!
    String myVariable = "Test";
    pageContext.setAttribute("myVariable", myVariable);
%>

<c:out value="myVariable"/>
<h1>${myVariable}</h1>

Вы можете просто использовать переменную каким-либо образом в коде jsp

Ответ 6

Вы можете сделать что-то вроде этого:

<%!
String myMethod(String input) {
    return "test " + input;
}
%>

<%= myMethod("1 2 3") %>

Это приведет к выводу test 1 2 3 на страницу.

Ответ 7

слишком поздно, чтобы ответить на него, но это поможет другим

<%! 
     public void printChild(Categories cat, HttpServletResponse res ){
       try{
          if(cat.getCategoriesSet().size() >0){
              res.getWriter().write("") ; 
          }
       }catch(Exception exp){

       }
     }

%>

Ответ 8

Вы можете сделать что-то вроде этого:

<%

out.print("<p>Hola</p>");    
out.print("<p>Cómo estás?</p>");

%>