Argiropoulos Stavros
Argiropoulos Stavros

Reputation: 9533

Dynamically generate Javascript with JSP in IE

I try to do something like that 1.

<head><% out.println("<script type=\"text/javascript\">"); out.println("function myfunction(){"); out.println("for(int i=0;i<10;i++){"); out.println("alert(message+i);"); out.println("}}"); out.println("</script></head>"); %>

and use it like that

<body><input type="button" value="abcd" onclick="myfunction();"/></body>

That is generate javascript within my jsp Pages.And it works fine but only in chrome and not in IE.I then tried this 2.

<head><%StringBuffer dynamicJavaScript = new StringBuffer();dynamicJavaScript.append("\n<script type=\"text/javascript\">");dynamicJavaScript.append("\n</script>");%></head>

and use it like that again inside the tag

<%=dynamicJavaScript%>

In a weird way only if i include both of these solutions (1. & 2.) it works in IE. Have yoy got any ideas? Thank you

Upvotes: 1

Views: 3209

Answers (1)

BalusC
BalusC

Reputation: 1109635

function my function(){

This is syntactically invalid in two ways: 1) my is wrong here. 2) function is a reserved keyword.

With regard to generating Javascript code dynamically, I strongly recommend you to not use scriptlets for this, but just taglibs/EL. Your first line can be perfectly replaced with help of JSTL (just drop jstl-1.2.jar in /WEB-INF/lib) c:forEach:

<head>
    <script type="text/javascript">
        function myFunction() {
            // <c:forEach begin="0" end="10" var="i">
                alert(message${i});
            // </c:forEach>
        }
    </script>
</head>

Much better readable, isn't it?

Update as per the comments, you can also iterate over a Collection with c:forEach. Replace the particular piece by:

            <c:forEach items="${bean.vector}" var="item">
                alert('${item}');
            </c:forEach>

..where ${bean} is your bean which is been placed in any of the page, request, session or application scopes and ${bean.vector} requires having a getter with that name in the Bean class like

public class Bean {
    public Vector<String> getVector() {
        return this.vector;
    }
}

To learn more about JSTL, consult Sun Java EE tutorial part II chapter 7. To learn more about EL, consult Java EE tutorial part II chapter 5.

That said, the Vector is considered legacy and you should be using the improved ArrayList instead which has already replaced it over a decade ago (more about Collections framework in this Sun tutorial). In this line, I would also recommend to throw all those >10 year old tutorials/books away and go read the more recent ones.

Upvotes: 2

Related Questions