2008-09-26 7 views
30

방금 ​​JSP 기술을 배우기 시작했고 벽을 가로 질러 왔습니다.JSP에서 HTML을 출력하는 방법 <%! ... %> 블록?

< %의 메소드에서 HTML을 어떻게 출력합니까! ... %> JSP 선언 블록?

이 작동하지 않습니다

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

서버 ” 나갈 “ 없다 말한다.

U : 문자열을 반환하는이 메서드로 코드를 다시 작성하는 방법을 알고 있지만 내부에서이 작업을 수행하는 방법이 있습니다. < %! void() {} %>? 비 최적 일지라도, 여전히 흥미 롭습니다.

답변

27

지시어 내에서 'out'변수 (또는 다른 "미리 선언 된"Scriptlet 변수)를 사용할 수 없습니다.

JSP 페이지가 웹 서버에 의해 Java 서블릿으로 변환됩니다. 예를 들어, 톰캣 내부의 모든 스크립팅 릿 ("< %"로 시작하는)은 모든 정적 HTML과 함께 하나의 거대한 Java 메소드로 변환되어 페이지를 줄 단위로 "out"이라는 JspWriter 인스턴스에 기록합니다. 이것이 스크립트 레트에서 직접 "out"매개 변수를 사용할 수있는 이유입니다. 반면에 지시어 ("< %!"로 시작하는)는 별도의 Java 메소드로 번역됩니다. 예를 들어

, 매우 간단한 페이지 (의이 foo.jsp에 호출하자) :

:

<html> 
    <head/> 
    <body> 
     <%! 
      String someOutput() { 
       return "Some output"; 
      } 
     %> 
     <% someOutput(); %> 
    </body> 
</html> 

이 (명확성을 위해 무시 세부의 많은)이 같은 뭔가를 찾고 끝낼 것

+0

멋진 답변을 보내 주셔서 감사합니다.하지만 제가 찾고있는 것은 아닙니다. – ansgri

+3

표현식 구문 <%= %>을 사용하지 않으면 someOutput에 대한 호출이 out.write 문에 배치되지 않습니다. 스크립틀릿 구문을 사용하면 인라인으로 삽입됩니다. –

+1

paradoja의 대답은 나를 위해 일했지만 이것은 그렇지 않습니다. – mr5

8

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"; 
    } 
} 
나는이 도움이 될 가정 :

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

어쨌든,보기에 코드가 좋은 생각이 아니다.

9

당신이해야 할 모든 통해 호출 즉

void someOutput(JspWriter stream) 

다음 매개 변수로 당신의 방법에의 JspWriter의 개체를 전달할 수 있습니다 :

<% someOutput(out) %> 

작가 객체가 _jspService 내부의 지역 변수 그래서 유틸리티 메소드에 전달해야합니다. 다른 모든 내장 참조 (예 : 요청, 응답, 세션)에도 동일한 내용이 적용됩니다.

무슨 일이 일어나는지 확인하는 가장 좋은 방법은 Tomcat을 서버로 사용하고 'jsp'페이지에서 생성 된 '.java'파일의 'work'디렉토리로 이동하는 것입니다. 또는 weblogic에서 'weblogic.jspc'페이지 컴파일러를 사용하여 페이지가 요청 될 때 생성 될 Java를 볼 수 있습니다.

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

시험해보세요.

-1

당신은 같은 것을 할 수 있습니다

<% 

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

%> 
+1

질문은 특히 물음표와 함께 '<%! %>'에 관한 것입니다. – ansgri

3

당신은 같은 것을 할 수 있습니다 : 페이지에

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

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

이 출력됩니다 test 1 2 3을.

6

간단한 대안은 다음과 같습니다

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

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

를 이용해서 간단하게 대답

1

너무 늦게 JSP 코드 내에서 어떤 방식으로 변수를 사용할 수 있지만이 도움 다른 사람

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

     } 
    } 

%> 
관련 문제