Как вывести HTML из JSP <%!...%> блок?
Я только начал изучать технологию JSP и наткнулся на стену.
Как вы выводите HTML из метода в <%!...% > Блок объявлений JSP?
Это не работает:
<%!
void someOutput() {
out.println("Some Output");
}
%>
...
<% someOutput(); %>
Сервер говорит, что нет "выхода".
U: Я знаю, как переписать код с этим методом, возвращая строку, но есть ли способ сделать это внутри <%! void() {}% > ? Хотя это может быть неоптимальным, это все еще интересно.
Ответы
Ответ 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>");
%>