簡體   English   中英

存取Java <List> 來自jsp / jstl MVC應用程序

[英]Access java <List> from from jsp / jstl MVC app

我一直很難理解我要去哪里。 我知道我們應該與時俱進,但是我不確定如何用JSTL taglibrary函數替換可以完成工作的scriptlet。

我有一個名為Ranges.class的Model類,其中包含rangeName(字符串)和startRange(BigDecimal)和endRange(BigDecimal)值。 我有一個DAO類,處理所有的數據庫查詢(crud類型的方法)。 我在RangesDao.class中有一個名為getAllRanges()的方法,該方法將從mysql數據庫中獲取所有可能的范圍並返回一個List。 這將獲取包括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()。 在添加“ plannedRoute”對象(只是一個具有其他幾個屬性的對象需要添加到另一個表中時,才使用doPost()。-這里不是問題)從doGet()中,我列出了所有“ plannedRoute”全部具有一個關聯的對象。 添加新路由時,我從doGet()方法啟動一個jsp頁面。 以下部分應該使事情更清楚一些。

doGet():

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輸入文本區域。

我希望這足夠清楚。 我已經嘗試了失敗,並且不確定在不使用scriptlet的情況下該從哪里去...任何幫助將不勝感激。

親切的問候肖恩

首先,將DAO對象放入請求中,但是在jsp中,您想訪問DAO方法將返回的列表。 在您的控制器中調用方法,然后將結果列表放入請求中。

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

其余的全部都是客戶端代碼,除非您想更改設計以使用ajax。 嘗試將控制器中的范圍列表序列化為JSON字符串。 然后在您的jsp中,您將為javascript提供訪問數據的權限。 假設您使用Gson在servlet中進行序列化:

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

因此,當您在jsp中訪問${rd}時,它將是以下形式的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}]


在jsp中,將其設置為可以由您的change函數訪問的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);
        }
    }

});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM