ошибка с document.getElementById () - PullRequest
       4

ошибка с document.getElementById ()

0 голосов
/ 16 февраля 2012

Я пытаюсь написать jdo-запрос, в котором мне нужно получить набор значений на основе категории, которую пользователь выбирает на jsp ... мой запрос выглядит следующим образом

Query query2 = pm.newQuery("select from " + ProductDB.class.getName()+ "where pCategory = " document.getElementById("cname").text);

Теперьна моей странице JSP у меня есть динамическое раскрывающееся окно, и в теге я дал тег id как «cname».Поэтому, когда я выполняю вышеуказанный запрос, я надеюсь, что он получит категорию, которую выбрал пользователь.

Однако я получаю эту ошибку:

Syntax error on token "document", delete this token

Мой выбортег выглядит следующим образом:

<select name = "cname" id="cname">
.
.
.
</select>

Что мне здесь не хватает?

ОБНОВЛЕНИЕ :

Я помещаю весь свой код для файла jspниже:

<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<%@ page import="java.util.*"%>
<%@ page import="javax.jdo.Query"%>
<%@ page import="javax.jdo.PersistenceManager"%>
<%@ page import="com.google.appengine.api.users.User"%>
<%@ page import="com.google.appengine.api.datastore.Key"%>
<%@ page import="com.google.appengine.api.users.UserService"%>
<%@ page import="com.google.appengine.api.users.UserServiceFactory"%>
<%@ page import="java.net.*"%>
<%@ page import="javax.servlet.http.HttpServletRequest"%>
<%@ page import="com.nerdy.needs.*"%>
<html>
<head>
<title>Product Inventory</title>
<META HTTP-EQUIV="Refresh" CONTENT="450">
<link rel="stylesheet" href="login.css" type="text/css" />
</head>
<h1 align="center">Product Inventory</h1>
<body>
<form>
<table>
    <tr>
        <td>View</td>
        <td><select name="cname" id="cname">
            <option value="all">All</option>
            <%
                PersistenceManager pm = PMF.get().getPersistenceManager();
                Query query = pm.newQuery("select cname from "
                        + CategoryDB.class.getName());
                List<String> categories = new ArrayList<String>();
                categories = (List<String>) query.execute();
                String[] c = categories.toArray(new String[categories.size()]);
                for (int i = 0; i < c.length; i++) {
                    String s = c[i];
            %>
            <option value="<%=s%>"><%=s%></option>
            <%
                }
            %>
        </select></td>
        <td>Products</td>
    </tr>
</table>
</form>
<%
    if (document.getElementById("cname").value == "all") {
        PersistenceManager pm1 = PMF.get().getPersistenceManager();
        Query query1 = pm1.newQuery("select * from "
                + ProductDB.class.getName());
        List<ProductDB> prods1 = (List<ProductDB>) query1.execute();
        if (prods1.isEmpty()) {
%>
<table class="items">
    <tr>
        <th class="main">Image</th>
        <th class="main">Category</th>
        <th class="main">Name</th>
        <th class="main">Price</th>
        <th class="main">Description</th>
    </tr>
    <tr class="lightBlue">
        <td class="actions" colspan=100%>
        <p>No items were found.</p>
        </td>
    </tr>
</table>
<%
    } else {
%>
<table class="topics">
    <tr>
        <th class="main">Image</th>
        <th class="main">Category</th>
        <th class="main">Name</th>
        <th class="main">Price</th>
        <th class="main">Description</th>
    </tr>
    <%
        for (ProductDB p : prods1) {
    %>
    <tr>
        <td>
        <p><b> <img width="100" height="100"
            src="http://localhost:8888/serve?id= <%=p.getProductImage()%>">
        </b></p>
        </td>
        <td>
        <p><b><%=p.getProductCategory()%></b></p>
        </td>
        <td>
        <p><b><%=p.getProductName()%></b></p>
        </td>
        <td>
        <p><b><%=p.getProductPrice()%></b></p>
        </td>
        <td>
        <p><b><%=p.getProductDescription()%></b></p>
        </td>
    </tr>
    <%
        }
    %>
</table>
<%
    pm1.close();
        }
    } else {
        PersistenceManager pm2 = PMF.get().getPersistenceManager();
        Query query2 = pm.newQuery("select * from "
                + ProductDB.class.getName() + "where pCategory = "
                + document.getElementById("cname").value);
        List<ProductDB> prods2 = (List<ProductDB>) query2.execute();
        if (prods2.isEmpty()) {
%>
<table class="items">
    <tr>
        <th class="main">Image</th>
        <th class="main">Category</th>
        <th class="main">Name</th>
        <th class="main">Price</th>
        <th class="main">Description</th>
    </tr>
    <tr class="lightBlue">
        <td class="actions" colspan=100%>
        <p>No items were found.</p>
        </td>
    </tr>
</table>
<%
    } else {
%>
<table class="topics">
    <tr>
        <th class="main">Image</th>
        <th class="main">Category</th>
        <th class="main">Name</th>
        <th class="main">Price</th>
        <th class="main">Description</th>
    </tr>
    <%
        for (ProductDB p : prods2) {
    %>
    <tr>
        <td>
        <p><b> <img width="100" height="100"
            src="http://localhost:8888/serve?id= %=p.getProductImage()%>">
        </b></p>
        </td>
        <td>
        <p><b><%=p.getProductCategory()%></b></p>
        </td>
        <td>
        <p><b><%=p.getProductName()%></b></p>
        </td>
        <td>
        <p><b><%=p.getProductPrice()%></b></p>
        </td>
        <td>
        <p><b><%=p.getProductDescription()%></b></p>
        </td>
    </tr>
    <%
        }
    %>
</table>
<%
    pm2.close();
        }
    }
%>
</body>
</html>

Я получаю ошибки "документ не может быть решен" в двух местах - одна в операторе if

if(document.getElementById("cname").value=="all")

и другая в операторе запроса

Query query2 = pm.newQuery("select * from " + ProductDB.class.getName()+ "where pCategory = " + document.getElementById("cname").value);

Может кто-нибудь помочь мне разобраться в чем дело?

Ответы [ 3 ]

1 голос
/ 16 февраля 2012

Ваша конкретная проблема заключается в том, что вы смешиваете Java / JSP с JavaScript. Вы, кажется, ожидаете, что они работают синхронно, и вы, вероятно, ожидаете, что переменная объекта document JavaScript также присутствует в коде JSP scriptlet .

Это неправильно. Java / JSP - это генератор HTML-кода. Он запускается в веб-сервере по запросу HTTP, генерирует код HTML / JS и отправляет его обратно веб-браузеру в качестве ответа HTTP. Все, что получает веб-браузер, представляет собой простой код HTML / JS. Щелкните правой кнопкой мыши страницу в веб-браузере и выполните Просмотр источника , чтобы увидеть ее самостоятельно.

Похоже, ваше конкретное функциональное требование заключается в том, что вам нужно получить указанное значение

<select name="cname">

на стороне Java / JSP.

Вам нужно получить его как параметр запроса по HttpServletRequest#getParameter(). Итак, замените

<%
    if (document.getElementById("cname").value == "all") {
        // ...
    }
%>

от

<%
    if ("all".equals(request.getParameter("cname"))) {
        // ...
    }
%>

Тем не менее, написание Java-кода в файлах JSP - это плохая практика . Работайте над этим также. Обратите внимание, что эта проблема не связана с JDO.

0 голосов
/ 16 февраля 2012

Попробуйте следующим образом: -

var i = document.getElementById("cname").selectedIndex;

document.getElementById("cname").options[i].text;

ИЛИ

document.getElementById("cname").value

ОБНОВЛЕНИЕ:

Имена столбцов также отсутствуют.Это должно быть * или specific column names.

Query query2 = pm.newQuery("select * from " + ProductDB.class.getName()+ "where pCategory = " + document.getElementById("cname").value); 

В соответствии с вашим обновлением ошибки

ваш код должен быть следующим: -

if(document.getElementById("cname").value=="all") 
{ 
 <%
 PersistenceManager pm1 = PMF.get().getPersistenceManager(); 
 Query query1 = pm1.newQuery("select * from " + ProductDB.class.getName()); 
 List<ProductDB> prods1 = (List<ProductDB>) query1.execute(); 
%>
}

JSPтеги должны быть объявлены между тегами <% </strong> и %> , а другие html-теги должны быть снаружи.

Согласно вашему коду:

Проблемаdocument.getElementById("cname").value вызывает внутри тегов JSP.Это неправильно.

Здесь вы также можете передать значение cname в виде строки запроса и получить значение через параметр ИЛИ Присвоить значение document.getElementById("cname").value переменной JSP и обработать его.

0 голосов
/ 16 февраля 2012

Вы забыли знак плюс до document.getElementById.

Правильный код будет

Query query2 = pm.newQuery("select from " + ProductDB.class.getName() + "where pCategory = " + document.getElementById("cname").text);

Кроме того, хотя это и исправит синтаксическую ошибку, код все равно не будет работать. Согласно спецификации W3C DOM , элемент <select/> не имеет атрибута text; Вы должны использовать value или selectedIndex вместе с options.

...