JSP中的级联DropDown列表

时间:2014-11-27 20:06:34

标签: java jquery html jsp jstl

我是JSP新手我试图为我的问题找到解决方案,但不幸的是我不能。 所以我想要做的是有2个下拉菜单,当我从第一个列表中选择一个值时,必须过滤第二个下拉列表。 这是我到目前为止所做的: Servlet将对象传递给jsp:

    getServletContext().setAttribute("foodDetails", fds.findAll());

    request.getRequestDispatcher(url).forward(request, response);

在jsp代码中,我创建两个下拉列表并使用以下代码填充列表:

   <tr>
    <td>Detay Tipi 1</td>   
     <td>
       <select name="tip" id="tip" onchange="">     
         <option value="porsiyon">porsiyon</option>
         <option value="extra">extra</option>
       </select>  
     </td>
     <td>
        <select name="tip2" id="tip2" onchange="">
          <option value"Lütfen Tip Seçiniz">Lütfen Tip Seçiniz</option>
        </select>  
     </td>
   </tr>

因此,当用户从第一个下拉列表中选择“porsiyon”时,将使用$ {foodDetails}中的值填充第二个列表。为了达到这个目的,我使用下面的代码覆盖了第一个下拉的onchange方法:

  <script type="text/javascript">
     $(document).ready(function(){
     $("#tip").change(function(){
     tip2.length = 1;
     var x=$(this).val();
     <c:forEach var="fd" items="${foodDetails}">
     <c:if test="${fd.detailcategory == x}"> 
     tip2.options[tip2.options.length]  = new Option("${fd.name}","${fd.name}");
     </c:if>
     </c:forEach>
       });
       });
</script>
不幸的是,当我切换

时,这不起作用
  var x=$(this).val();

具有静态值,如:

  <c:set var="x" scope="session" value='ekstra'/>

它就像魅力一样,其中c被定义为:

  <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>. 

我可能犯了一个非常明显的错误,但我无法弄清楚是什么。这是我的第一个jsp页面,所以对我来说很容易:)  PS:我认为不需要课程来回答这个问题,但是fooddetails有一个fooddetail列表,其中fooddetail.detailcategory可以是“porsiyon”或“ekstra”。

感谢,

1 个答案:

答案 0 :(得分:0)

问题与你的脚本没有触发onchange事件有关,正如你在embebed片段中看到的那样,你正试图在客户端而不是在服务器中调用JSTL函数侧。

您可以尝试以下操作:

  1. 创建一个构建基于JSON的响应的JSP。
  2. 使用AJAX
  3. 调用JSP
  4. 通过您的回复迭代以检索已过滤的结果。
  5. 假设您有一个foodDetails.jsp,它接收一个名为category的过滤参数。使用此参数,您可以从JSP构建基于JSON的响应。

    foodDetails.jsp

    "{filteredList: "
    <c:forEach var="fd" "items="${foodDetails}">
        <c:if test="${fd.detailcategory == category}">
            "${fd.detailcategory},"     
        </c:if>
    </c:forEach>
    "}"
    

    从您的客户端(Web浏览器)

    每当foodDetails.jsp事件被触发时,您都可以使用 AJAX 致电onchange ...

    jQuery(document).ready(function(){
            jQuery("#tip").change(function() {
        var category = jQuery(this).val();
        addFilteredItems(category);
    });
    
    function addFilteredItems(category) {
        jQuery.ajax({
            type: "GET",
            url: "/path/to/the/foodDetails.jsp?category=" + category,
            dataType: "json"
            _: jQuery.now()
        }).done(function(data) {
            jQuery.each(data, function(k, v) {
                var result = v["filteredList"];
                jQuery.each(result.split(","), function() {
                    var item = jQuery(this).val();
                    // add options
                });
            });
        });
    }
    

    jQuery(document).ready(function(){
      jQuery("#tip").change(function(){
        var x= $(this).val();
        alert(x);
      });
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <tr>
      <td>Detay Tipi 1</td>   
        <td>
          <select name="tip" id="tip" onchange="">     
            <option value="porsiyon">porsiyon</option>
            <option value="extra">extra</option>
          </select>  
        </td>
        <td>
          <select name="tip2" id="tip2" onchange="">
            <option value"Lütfen Tip Seçiniz">Lütfen Tip Seçiniz</option>
          </select>  
        </td>
    </tr>