Ссылка на правильную страницу элемента путем выбора списка элементов в цикле for

Это моя страница JSP, которая получает список элементов из базы данных, используя для цикла

<%
    itemManager mgr = new itemManager();
    Item[] items = mgr.getAllItems();
    for(int i = 0; i < items.length; i++){
    %>
    <tr>
    <td> <img border="0" src="<%=items[i].getItemImage() %>" width="100" height="100">
                </td>
                <td>
                <%=items[i].getItemName()%>
                <input type="text" name="itemID" value="<%=items[i].getItemID()%>">
                        <br/>
                <%=items[i].getItemDesc()%>
                <br/>
                Start Bid : <%=items[i].getStartBid()%>
                <br/>
                Buy it now : <%=items[i].getEndBid()%>
                <br/>
                Bidding close on : <%=items[i].getDuration()%>
                <br/>
                <input type="submit" value="View"> 
    <%
    }
    %></table>

Это страница JSP, которая ссылается на элемент, который вы выбрали ранее

<table border="1" align="center">
<%
itemManager mgr = new itemManager();
Item items = mgr.getItem((Integer)session.getAttribute("ITEM_DATA"));
%>
<tr>
                <td> <b> <%=items.getItemName() %></b> </td>
</tr>

</table>

Это сервлет для хранения сеанса с идентификатором выбранного элемента и пересылки на правильную страницу jsp элемента.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession(true);
        int id = Integer.parseInt(request.getParameter("itemID"));
        session.setAttribute("ITEM_DATA",id);
        RequestDispatcher rd = request.getRequestDispatcher("viewItem.jsp");
        rd.forward(request, response);
    }

Однако после того, как я нажал кнопку просмотра. Он продолжает ссылаться на itemID = 1.

URL отображает "/ItemServlet?itemID=1&itemID=2",

На самом деле, если я нажимаю на itemID=2, URL должен отображаться так:

"/ItemServlet?itemID=2"

В результате, как я могу достичь этого? Заранее спасибо!

2 ответа

Решение

Проблема в вашем коде в том, что вы используете один form и динамически создавать поле ввода внутри формы. Таким образом, все поля ввода будут иметь одинаковые имена. Поэтому при отправке формы все значения в поле ввода отправляются в качестве параметров запроса. Я просто сократил часть вашего кода для лучшего понимания. Возьми это как свой код

<form action="item" method="get">
<table>
<%
ItemManager mgr = new ItemManager();
Item[] items = mgr.getAllItems();
for(int i = 0; i < items.length; i++){
%>

<tr>
     <td>
            <%=items[i].getItemName()%>
            <input type="text" name="itemID" value="<%=items[i].getItemId()%>">
            <input type="submit" value="View"> </td></tr>

<%
}
%></table>
</form>  

Когда вы запускаете этот код и если вы проверяете HTML код будет выглядеть

<form action="item" method="get">
<table>
<tr><td>
            aaa
            <input type="text" name="itemID" value="1">
            <input type="submit" value="View"> </td></tr>



<tr>
     <td>
            bbb
            <input type="text" name="itemID" value="2">
            <input type="submit" value="View"> </td></tr>
<tr><td>
            ccc
            <input type="text" name="itemID" value="3">
            <input type="submit" value="View"> </td></tr>    
</table>
</form>

Здесь все поле ввода имеет то же имя, что и "itemID". В качестве решения вы можете создать форму внутри цикла for, чтобы при отправке в качестве запроса отправлялось только одно значение поля ввода.

Создайте form внутри вашего for loop как ниже код.

<table>
<%
ItemManager mgr = new ItemManager();
Item[] items = mgr.getAllItems();
for(int i = 0; i < items.length; i++){
%>
<form action="item" method="get">
<tr>
     <td>
            <%=items[i].getItemName()%>
            <input type="text" name="itemID" value="<%=items[i].getItemId()%>">
            <input type="submit" value="View"> </td></tr>
            </form>
<%
}
%></table>  

Надеюсь, что это поможет вам.

Изменить имя текстового поля динамически.
И используйте getQueryString() в сервлете, чтобы найти имя и значение itemId.
используя EL.
Я надеюсь, что это поможет вам

Другие вопросы по тегам