1

我有我的第一个下拉列表id="bfnsCode",我想将该值用于我的下一个下拉列表 id="taxtCode" 以便能够根据第一个下拉列表显示新的一组值。这是我的代码:

<div class="BIR" style="display: none;">
            <div>
            <label style="font-size: 17px;">BIR-Form Number</label><br>         
                <select name="bfnsCode" id="bfnsCode" class="sel" style="width: 245px; margin-left: 0;">
                    <option selected="selected" value=""></option>
                    <%
                        TblBIRFormNoDAO birdao = DAOFactory.getDaoManager(TblBIRFormNo.class);

                        HttpSession live = request.getSession(true);
                        TblUserInformation user = (TblUserInformation) live.getAttribute("user");

                        List<TblBIRFormNo> birtypelist =  null;                     

                        if(user.getRcoCode() != null){
                            birtypelist =birdao.getAllBirFormNumber();
                        }else{

                        }

                        String birtypeoptions = "";

                        if( birtypelist!=null) {
                            if( birtypelist.size()>0 ) {
                            for(int i=0; i<birtypelist.size();i++) {
                            TblBIRFormNo taxtype = (TblBIRFormNo) birtypelist.get(i);
                            birtypeoptions += "<option value='"+taxtype.getBfnsCode()+"'>"+taxtype.getBfnsCode()+"</option>";                                       
                            taxtype = null;
                                }
                            }
                        }

                        birdao = null;
                        birtypelist = null;
                        %>
                        <%=birtypeoptions%>

                </select>   
            <br><br>
            <label style="font-size: 17px;">Tax Type</label><br>            
                <select name="taxtCode" id="taxtCode" class="sel" style="margin-left: 0;">
                    <option selected="selected" value=""></option>
                    <%
                        TblTaxTypeDAO taxdao = DAOFactory.getDaoManager(TblTaxType.class);

                        List<TblTaxType> taxtypelist =  null;

                        String tax = request.getParameter("bfnsCode");
                        Debugger.print("test : "+tax);

                        if(tax != null){
                            taxtypelist = taxdao.findAlltaxtCode(tax);
                        }else{
                            taxtypelist = taxdao.getAllTaxTypes();
                        }

                        String taxtypeoptions = "";

                        if( taxtypelist!=null) {
                            if( taxtypelist.size()>0 ) {
                            for(int i=0; i<taxtypelist.size();i++) {
                            TblTaxType taxtype = (TblTaxType) taxtypelist.get(i);
                            taxtypeoptions += "<option value='"+taxtype.getTaxtCode()+"'>"+taxtype.getTaxtCode()+"</option>";                                       
                            taxtype = null;
                                }
                            }
                        }

                        taxdao = null;
                        taxtypelist = null;
                        %>
                        <%=taxtypeoptions%>         

                </select>   

如您所见,我在下拉税中使用request.getParameter("bfnsCode")调用该值,但它给了我一个空值。

ListBIRFormNo.java(用于c:forEach的 servlet )

public class ListBIRFormNo extends HttpServlet {
private static final long serialVersionUID = 1L;

private List<TblBIRFormNo> birtypelist;

public List<TblBIRFormNo> getTblBIRFormNo() {
    return birtypelist;
}
public void setTblBIRFormNo(List<TblBIRFormNo> birtypelist) {
    this.birtypelist = birtypelist;
}
private HttpServletRequest request;

public void setServletRequest(HttpServletRequest request){
    this.request = request;
}

public String execute(){
    Debugger.border();
    try{
        TblBIRFormNoDAO birdao = DAOFactory.getDaoManager(TblBIRFormNo.class);

        HttpSession live = request.getSession(true);
        TblUserInformation user = (TblUserInformation) live.getAttribute("user");

        if(user.getRcoCode() != null){
            birtypelist =birdao.getAllBirFormNumber();          
        }else{
            //no-op
        }

        //expose 'birtypelist' as an attribute
        request.setAttribute("birtypelist", birtypelist); 

    }catch(Exception e){
        e.printStackTrace();
        Debugger.print(" EXCEPTION :"+e.getStackTrace());
        Debugger.endDebug(this.getClass().toString());
        Debugger.border();
    }
    Debugger.border();
    return null;
}

}

4

1 回答 1

1

我认为您可能误解了请求处理生命周期。request.getParameter("bfnsCode")获得非空值的唯一方法是调用的参数bfnsCode是否与当前请求一起发送。这不是您在这里的情况(据我所知),因为您的所有代码都在单个请求的上下文中执行。所以是的,bfnsCode在您检查它时将为空。

如果您希望一个选择框在同一页面中响应另一个选择框,那通常/最好使用 JavaScript 完成。您希望在第一个盒子上有一个onchangeonkeyup(或两者)事件处理程序<select>,并且您希望实现它以便它从第一个盒子获取值,然后使用它来更新第二个盒子(通过制作 AJAX调用以加载相关数据,或者通过从您为页面设置的某些缓存加载正确的数据集)。这听起来比实际上要复杂(尤其是如果您使用像 jQuery 这样的 JavaScript 框架),但是您无法像当前方法那样使用纯服务器端代码来解决问题。

请考虑重构您的实现,以便它不会将 Java 代码直接嵌入到 JSP 页面中。您可以将与检查用户和查询表单列表相关的业务逻辑移动到Servlet实现(或 Struts 提供的等效类似 Servlet 的构造;Action我相信它是),然后使用<c:forEach>标签将选项附加到您的<select>元素(即 Sotirios 在他的评论中所说的)。

例如,在您的Servlet/Action代码中,您可以birtypelist按照当前的方式进行设置,然后执行以下操作:

if(user.getRcoCode() != null){
    birtypelist =birdao.getAllBirFormNumber();
}else{
    //no-op
}

//expose 'birtypelist' as an attribute
request.setAttribute("birtypelist", birtypelist);  

...然后在您的 JSP 页面中,您可以使用:

<select name="bfnsCode" id="bfnsCode" class="sel" style="width: 245px; margin-left: 0;">
    <option selected="selected" value=""></option>
    <c:forEach var="taxtype" items="${birtypelist}">
        <option value="${taxType.bfnsCode}">${taxType.bfnsCode}</option>
    </c:forEach>
</select>

这将提供与您目前拥有的程序化方法相当的结果。

于 2013-08-12T03:45:01.710 回答