如何向jsp:attribute传递字面量String数组?
解决JSP标签传递String数组字面量的问题
你的问题出在使用${theArray}时,EL表达式会把数组对象转成它的字符串表示(比如[Ljava.lang.String;@xxxxxx),所以标签最终收到的是这个字符串,而非数组本身。这里给你几个可行的解决方案:
方案一:直接用Scriptlet传递数组(最直接)
保持你的标签属性定义不变:
<%@ attribute name="array" rtexprvalue="true" type="java.lang.String[]" %>
在JSP页面里直接通过标签属性传递数组对象,无需<jsp:attribute>:
<my:test array="<%= new String[] {"Something", "Something else"} %>" />
因为你已经设置了rtexprvalue="true",允许运行时表达式,所以scriptlet返回的String数组会直接传递给标签的array属性,标签能正确识别类型。
方案二:用EL 3.0+构造数组(更简洁)
如果你的项目使用EL 3.0及以上版本(对应Servlet 3.1+,web.xml版本≥3.1),可以直接在EL里构造数组:
<my:test array="${new String[] {'Something', 'Something else'}}" />
这种方式不需要scriptlet,代码更干净,但要确保容器支持EL 3.0(比如Tomcat 8+)。
方案三:如果一定要用<jsp:attribute>
不要用EL输出数组的字符串形式,而是用scriptlet直接传递数组对象:
<% request.setAttribute("theArray", new String[] {"Something", "Something else"}); %> <my:test> <jsp:attribute name="array"><%= request.getAttribute("theArray") %></jsp:attribute> </my:test>
这里通过scriptlet直接把数组对象传递给标签属性,避免了EL的字符串化转换。
总结一下,核心就是要让标签收到的是数组对象,而不是数组的字符串表示,上面的三种方法都能实现这个目的。
内容的提问来源于stack exchange,提问作者Kerdos Media
相关产品推荐
相关产品推荐

