0

我一直发现很难理解我哪里出错了。我知道我们应该与时俱进,但我不确定如何使用 JSTL 标记库函数替换我可以完成这项工作的 scriptlet。

我有一个名为 Ranges.class 的模型类,它包含一个 rangeName (String) 和一个 startRange (BigDecimal) 以及一个 endRange (BigDecimal) 值。我有一个处理所有数据库查询(crud 类型方法)的 DAO 类。我在 RangesDao.class 中有一个名为 getAllRanges() 的方法,它将从 mysql 数据库中获取所有潜在范围并返回一个列表。这将获取包括 rangeName、startRange 和 endRange 在内的所有 Range 对象。

问: 所以基本上我想做的是从我的 jsp 页面选择文本输入时,我想检查它是否在每个 Range 对象(在 List 中返回)的开始值和结束值之间,并且当我有一个匹配我想用该对象的 rangeName 值更新不同的文本输入。

这就是我到目前为止所拥有的。

范围类

package za.co.zs6erb.model;
import java.math.BigDecimal;

public class Range {

    private int range_id;
    private String rangeName;
    private BigDecimal startRange;
    private BigDecimal endRange;

    //...getters and setters for each of the above variables ...

    @Override
    public String toString() {
        return "Ranges [range_id=" + range_id + ", Range Name=" + rangeName + ", Start Range=" + startRange  
        + ", End Range=" + endRangeBand + "]";
    } 
}

DAO 类:这是 getAllRanges() 方法

public List<Range> getAllRanges() {
    List<Range> rangeList = new ArrayList<Range>();
    try {
        Statement statement = connection.createStatement();
        ResultSet rs = statement.executeQuery("select * from ranges order by range_id");
        while (rs.next()) {
            Range lRange = new Range();
            lRange.setID(rs.getInt("range_id"));
            lRange.setRangeName(rs.getString("rangeName"));
            lRange.setStartRange(rs.getBigDecimal("start_range"));
            lRange.setEndRange(rs.getBigDecimal("end_range"));
            rangeList.add(lRange);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return rangeList;
}

控制器: 这个类有一个 doGet() 和一个 doPost() 方法,我正忙于 doGet()。doPost() 在添加“plannedRoute”对象时使用(只是一个具有需要添加到不同表的其他几个属性的对象。-这里不是问题)从 doGet() 我列出了所有“plannedRoute”每个对象都有一个 Range 关联。添加新路由时,我从 doGet() 方法启动 jsp 页面。下面的部分应该让事情变得更清楚一些。

获取():

private static String LIST_PLANNEDROUTES = "plannedroutes.jsp";
private RangeDao rDao;    

//Constructor
public PlannedRouteController() {
    super();
    rDao = new RangeDao();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String forward = "";
    String action = request.getParameter("action");

    if (action.equalsIgnoreCase("new")) {
        forward = LIST_PLANNEDROUTES;
        request.setAttribute("rd", rDao);
    }
    RequestDispatcher view = request.getRequestDispatcher(forward);
    view.forward(request, response);
}

所以现在我们找到了问题的症结所在…… plannedRoutes.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>MyTest</title>
        <script src="sj/jquery.js"></script>
        <script type="text/javascript">
            //<!--
            $(document).ready(function(){
                $("#range").change(function() {

                alert("A Range was entered");

                <c:forEach var="entry" items="${rd}">
                    alert( "HERE>" + ${entry.rangeName});
                </c:forEach>

                document.getElementById("testName").value =  $("#range").val();
            });                
        });
        //-->
        </script>
    </HEAD>
    <BODY>
        <form method="POST" action='<form method="POST" action='ContactController' name="frmAddContact">' name="frmAddRoute">
            Range: <input type="text" id="range" name="range" />
            Name:  <input type="text" id="testName" name="testName" readonly />
        <!-- a whole bunch of other stuff here -->

        </form>
    </BODY>
</HTML>

问:所以当范围输入文本字段中的值发生变化时(我调用标签中的方法,在那里我想单步执行列表并匹配输入的内容,看看它是否落在任何一个的开始和结束范围之间范围对象。当我找到匹配项时,我希望能够获取该对象的 rangeName 属性并将其添加到 testName 输入文本区域。

我希望这足够清楚。我已经尝试过但没有成功,并且不确定在不使用 scriptlets 的情况下从这里去哪里......任何帮助将不胜感激。

亲切的问候肖恩

4

1 回答 1

3

首先,您将 DAO 对象放入请求中,但在 jsp 中您希望访问 DAO 方法将返回的列表。调用控制器中的方法并将结果列表放入请求中。

request.setAttribute("rd", rDao.getAllRanges());

除非您想将设计更改为使用 ajax,否则其余的都需要是客户端代码。尝试将控制器中的范围列表序列化为 JSON 字符串。然后在您的 jsp 中,您将授予 javascript 访问数据的权限。假设您使用Gson在您的 servlet 中序列化:

request.setAttribute("rd", new Gson().toJson(rDao.getAllRanges(), List.class));

所以当你${rd}在jsp中访问时,会是如下形式的String:

[{"range_id":1,"rangeName":"Range 1", "startRange":10.0, "endRange":19.99},{"range_id":2,"rangeName":"Second Range", "startRange":18.75, "endRange":29.5}]


change在 jsp 中,您将其设置为您的函数 可以访问的 javascript 变量。

$("#range").change(function() {
    var rdArray = ${rd};

    alert("A Range was entered");

    var floatVal = parseFloat($("#range").val());
    var rangeFound = false;
    var rdSize = rdArray.length;
    var index = 0;
    while (index < rdSize && !rangeFound)
    {
        var rangeObject = rdArray[index++];
        if (floatVal >= rangeObject.startRange && floatVal <= rangeObject.endRange)
        {
            rangeFound = true;
            $('#testName').val(rangeObject.rangeName);
        }
    }

});
于 2013-10-03T20:42:18.150 回答