Hatem
Hatem

Reputation: 369

Send list to jsp tag

I wanna to send the list element (Which is located on my JSP) :

${mylist}

To my custom tag mytag.tag , this is what I have in my JSP page :

<tags:mytag list="${mylist}" ></tagsmytag>

But When I send it like that , I cannot access its elements, here is mytag.tag :

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="springForm"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<%@attribute name="list" required="true"%>

<c:forEach items="${pageScope.list}"  var="listVar">
    <option value="${listVart[0]}">${listVar[1]}</option>
</c:forEach>

Backend Controller :

@ModelAttribute("mylist")
List<Permission> getAllActivePermissions(){
    return permissionService.getAllActivePermissions();
}

The exception is :

javax.el.PropertyNotFoundException: Property '0' not found on type java.lang.String
at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:237)
at javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:214)
at javax.el.BeanELResolver.property(BeanELResolver.java:325)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:85)
at org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:104)
at org.apache.el.parser.AstValue.getValue(AstValue.java:183)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185)
at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:1026)
at org.apache.jsp.tag.webmultiple_tag._jspx_meth_c_005fforEach_005f1(webmultiple_tag.java:454)
at org.apache.jsp.tag.webmultiple_tag._jspx_meth_springForm_005fselect_005f1(webmultiple_tag.java:413)
at org.apache.jsp.tag.webmultiple_tag._jspx_meth_c_005fotherwise_005f0(webmultiple_tag.java:375)
at org.apache.jsp.tag.webmultiple_tag.doTag(webmultiple_tag.java:222)
at org.apache.jsp.WEB_002dINF.pages.roles.newRole_jsp._jspx_meth_tags_005fmultiple_005f0(newRole_jsp.java:674)
at org.apache.jsp.WEB_002dINF.pages.roles.newRole_jsp._jspx_meth_springForm_005fform_005f0(newRole_jsp.java:566)
at org.apache.jsp.WEB_002dINF.pages.roles.newRole_jsp._jspService(newRole_jsp.java:378)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:487)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:412)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:339)
at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:209)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:267)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1221)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1005)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:952)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:947)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:695)

What's the problem with that ? what is the best strategy to send lists to the tags ?

Upvotes: 0

Views: 2319

Answers (3)

paul
paul

Reputation: 13471

set the value with set

     <c:set var="list" value=${myList} scope="request"/> 

    <c:forEach items="${list}"  var="listVar" varStatus="i">
        <option value="${listVar[0]}">${listVar[1]}</option>
    </c:forEach>

Upvotes: 0

Hatem
Hatem

Reputation: 369

I got the solution finally , I have to specify the type (list) to the attribute (list) :

<%@attribute name="list" required="true"%>

to be :

<%@attribute name="list" required="true" type="java.util.List" %>

Upvotes: 0

user3145373 ツ
user3145373 ツ

Reputation: 8146

try :

<c:forEach items="${mylist.list}"  var="listVar" varStatus="i">
    <option value="${listVar[0]}">${listVar[1]}</option>
</c:forEach>

here, mylist is ModelAttribute & list the name of List which you are sending from controller. also use varStatus attribute of c:foreach tag, never use direct index like you have used. If you want to use it then put it in condition that if list size > 0 then it ll go inside it.

You have also variable spelling mistake :

<option value="${listVar[0]}"> you have used listVart.

Look Here is a simple tutorial by mkyong.

Upvotes: 5

Related Questions