【问题标题】:JQuery, Struts 1 and ajax call: issue on loading select options according to another select choiceJQuery、Struts 1 和 ajax 调用:根据另一个选择选项加载选择选项时出现问题
【发布时间】:2012-11-01 15:13:03
【问题描述】:

我的 jquery 是:

$('select[name=select1]').change(function () {
            var cod=$(this).val();
            if (cod>0) {
                $.ajax({
                    url:"Load.do",
                    data: "cod="+cod,
                    success: function (response) {
                            $('#info').html(response); }
                    });
            }
        });

在 struts-config.xml 中,我有:

<action path="/Load" scope="request" type="mypackage.Load"></action>

类Load是一个动作:

public class Load extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
{
    // TODO Auto-generated method stub

    Connection con = null;
    Statement stmt = null;
    ResultSet rs = null;

    try {
        // get the connection 
        stmt = (Statement) con.createStatement();

        String cod = request.getParameter("cod");

        String select = new String("Select firstCode, name from mytable where secondCode = '");
        select = select.concat(cod);
        select = select.concat("';");
        rs = stmt.executeQuery(select);
        PrintWriter out = response.getWriter();
        while (rs.next()) {
            out.print("<html:option value='");
            out.print(rs.getString("firstCode"));
            out.print("'>");
            out.print(rs.getString("name"));
            out.println("</html:option>");
            out.flush();
        }

        return null;
    } catch (NamingException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }  catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (rs != null) {
              try { rs.close(); } catch (SQLException e) {}
              rs = null;
        }
        if (stmt != null) {
              try { stmt.close(); } catch (SQLException e) {}
              stmt = null;
        }
        if (con != null) {
              try { con.close(); } catch (SQLException e) {}
              con = null;
        }        
    }

    return null;
}
 }

数据被检索,但它们没有打印在信息 div 中。

在我的 .jsp 页面中,我要填写的选择是:

 <html:select property="prop1">
 <html:option value="0">Choose:</html:option>
 <div id="info"></div> 
 </html:select>

【问题讨论】:

    标签: html jsp jquery struts-1


    【解决方案1】:

    JSP 代码并不真正相关。重要的是生成的 HTML 代码。使用 Firebug 或类似的工具来检查您的页面内容,并查看问题所在。如果 Struts 操作返回适当的 HTML,如下所示:

    <option value="2">some label</option>
    <option value="3">some other label</option>
    

    然后上面的 Javascript 将用上面的 HTML 替换由info 标识的 div 的内容。所以最终的结果是

    <select name="prop1">
        <option value="0">Choose:</option>
        <div id="info">
            <option value="2">some label</option>
            <option value="3">some other label</option>
        </div>
    </select>
    

    以上是无效的 HTML。选项不应位于 div 内,而应位于 select 元素的正下方。

    给选择元素一个 ID,并用你的 AJAX 请求的响应替换选择元素的内容。

    但另一个问题是您的操作不会生成 HTML 代码,而是生成包含 Struts 标记的 JSP 代码。这是没有意义的。 Struts 标签在服务器端由 JSP 解释。但是您将它们直接发送到浏览器。浏览器只理解 HTML。它不知道 Struts 标签。

    您为什么不使用推荐的 MVC 方法?该操作应该生成一个 bean 列表,将其存储在请求中,然后转发到将使用标签生成 HTML 标记的 JSP。

    最后,你应该

    • 使用准备好的语句而不是字符串连接
    • HTML 转义您的字符串。 Struts 标签会为您做到这一点
    • 避免吞咽异常
    • 不要以分号结束 SQL 查询。

    【讨论】:

    • 你能举一个在这种情况下使用 bean 的例子吗?您所说的“避免吞咽异常”是什么意思?谢谢
    • 当出现 SQLException 时,您会捕获它,并假装没有发生任何不好的事情。结果将是对用户的空白响应。您最好让异常传播,这将导致向浏览器发送 HTTP 500 错误响应。像这样,问题的诊断会容易得多。数据库访问代码应该在另一个类中,在诸如List&lt;Option&gt; getOptionsBySecondCode(String secondCode) 之类的方法中。您只需调用此方法,在请求属性中设置列表并转发到 JSP。 JSP 将遍历列表,并生成 HTML 标记
    • 这种情况下ajax调用没有成功回调函数吧?
    • 确实如此。它会收到一个错误,因此可以向用户显示一个有意义的错误页面,而不是将第二个选择框留空。
    • 没有成功回调,选择内容不会重新加载,选项不会显示。只有当我提交表单并且出现验证错误时,它们才会出现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2022-07-18
    • 2014-01-10
    • 2021-03-27
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    相关资源
    最近更新 更多