0

我正在尝试编写一个 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);

谁能帮我找出问题所在?

4

3 回答 3

1

您的具体问题是您将 Java/JSP 与 JavaScript 混合在一起。您似乎希望它们同步运行,并且您似乎希望 JavaScript 的documentobject 变量也出现在 JSP scriptlet代码中。

这是错误的。Java/JSP 是一个 HTML 代码生成器。它根据 HTTP 请求在网络服务器中运行并生成 HTML/JS 代码并将其作为 HTTP 响应发送回网络浏览器。网络浏览器检索的所有内容都是纯 HTML/JS 代码。右键单击 webbrowser 中的页面并执行查看源代码以自己查看。

您的具体功能要求似乎是您需要获取提交的值

<select name="cname">

在 Java/JSP 方面。

您需要将其作为请求参数获取HttpServletRequest#getParameter()。所以,更换

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

经过

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

也就是说,在 JSP 文件中编写 Java 代码是一种不好的做法。也为此努力。请注意,此问题与JDO无关。

于 2012-02-16T14:36:39.660 回答
0

您忘记了 . 之前的加号document.getElementById

正确的代码是

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

此外,虽然这将修复语法错误,但代码仍然无法正常工作。根据W3C DOM 规范<select/>元素没有text属性;您应该使用value, 或selectedIndexoptions代替。

于 2012-02-16T05:14:43.343 回答
0

试试这种方式: -

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 标记应在标记<%%>之间声明,其他 html 标记应在外部。

根据您的代码:

问题是document.getElementById("cname").value在 JSP 标记内调用。那是错的。

在这里,您可以将cname值作为查询字符串传递并通过参数获取值或将document.getElementById("cname").value值分配给 JSP 变量并对其进行处理。

于 2012-02-16T05:17:40.223 回答