java.lang.String 无法转换为 java.util.List

标签 java jsp google-app-engine servlets google-cloud-datastore

在我的程序中,我通过 JSP 文件中的表单从用户处获取两个值:

  • 内容
  • 人名(海报)

表单的action属性调用Servlet。 Servlet 在 Entry 类和 PersistenceManagerFactory 的帮助下使用 JDO 将对象保留在数据存储中,并将其重定向回 JSP。然后,JSP 查询并打印内容以及人员姓名。

我不能使用 String 数据类型作为“内容”,因为它只能接受最多 1500 字节的值,而我的要求不止于此。

我尝试使用“文本”数据类型,但它在查询时显示空值,因为它没有索引。

在这里,我试图获取列表中的值,但它显示错误:

java.lang.String cannot be cast to java.util.List

这是正确的方法还是有任何其他方法可以获取大于 1500 字节的值并通过从 JSP 查询将其显示回用户?

Servlet 文件:

package com.pack;

import java.io.IOException;

import java.util.ArrayList;
import java.util.List;

import javax.jdo.PersistenceManager;
import javax.servlet.ServletException;
import javax.servlet.http.*;



public class LoginServlet extends HttpServlet {

/**
 * 
 */
private static final long serialVersionUID = 1L;

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

    List<String> content = new ArrayList<String>();
    content.add(request.getParameter("content"));
    String poster = request.getParameter("poster");


    Entry entry = new Entry(content, poster);

    PersistenceManager pm = PMF.get().getPersistenceManager();
    pm.makePersistent(entry);
    pm.close();
    response.sendRedirect("login.jsp");

}
} 

入门级:

package com.pack;

import java.util.List;


import javax.jdo.annotations.*;
import com.google.appengine.api.datastore.Key;


@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Entry {

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;

@Persistent
private String poster;

@Persistent
private List<String> content;

public Entry() {

}

public Key getKey() {
    return key;
}

public Entry(List<String> content, String poster) {

    this.content = content;
    this.poster = poster;

}

public List<String> getContent() {

    return content;
}

public String getPoster() {
    return poster;
}

}

JSP 文件:

<%@ page import="java.util.List"%>
<%@ page import="java.util.ArrayList"%>
<%@ page import="javax.jdo.PersistenceManager"%>
<%@ page import="javax.jdo.Query"%>
<%@ page import="java.util.ArrayList"%>
<%@ page import="com.pack.*"%>
<%@ page import="com.google.appengine.api.datastore.Text" %>

<html>
<head>
<style>
.entryList {
 margin-left: 1100px;
 margin-top: -325px;
 overflow-y: scroll;
 height: 630px;

 }



 </style>
 </head>
 <h1>Welcome</h1>



 <div class="entry">

 <form action="/LoginServlet" method="post">

    Comments:<br> <br>
    <textarea rows="4" cols="50" name="content">

  </textarea>
    <br> <br> Your name:<br> <br> <input name="poster"
        type="text" value=""><br> <br> <input type="submit"
        value="Post"> <br> <br>

   </form>

   </div>
   <div class="entryList">


   <h2>Updates</h2>





   <%
    List<Entry> entries = new ArrayList<Entry>();



    PersistenceManager pm = PMF.get().getPersistenceManager();
    Query query = pm.newQuery("SELECT FROM " + Entry.class.getName());
    entries = (List<Entry>) query.execute();
    %>

    <%
    if (entries.isEmpty()) {
    %>

    No entries

    <%
    } else {
    %>

    <%
    for (Entry e : entries) {
    %>


    <%=e.getContent()%>
    <br> posted by
    <%=e.getPoster()%>
    <br> <br>
    <%
    }
    }
    %>

    </div>
    </html>

最佳答案

解决了问题。使用 App Engine 数据存储区的文本数据类型,并在 JSP 中检索时使用 getValue() 。 现在,我可以从用户处获取大于 1500 字节的值,并通过 JSP 查询将其显示回来。

问题出在 JSP 的表达式标记 ( <%= %> ) 上。

A JSP expression is used to insert the value of a scripting language expression, converted into a string, into the data stream returned to the client. When the scripting language is the Java programming language, an expression is transformed into a statement that converts the value of the expression into a String object and inserts it into the implicit out object.

JSP Expressions

何时 getContent()使用时,它显示空值。因此,要将“Content”的值插入到输出流中,请使用 getContent().getValue() 。这返回了“Content”的值,包括那些大小大于 1500 字节的值,因为“Text”对象的大小不受限制。

Text

下面是相同的代码。

Servlet 文件:

package com.pack;
import java.io.IOException;
import javax.jdo.PersistenceManager;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import com.google.appengine.api.datastore.Text;

public class LoginServlet extends HttpServlet {

/**
 * 
 */
private static final long serialVersionUID = 1L;

public void doPost(HttpServletRequest request, HttpServletResponse response) 
throws IOException, ServletException {

    Text content = new Text(request.getParameter("content"));

    String poster = request.getParameter("poster");


    Entry entry = new Entry(content, poster);

    PersistenceManager pm = PMF.get().getPersistenceManager();
    pm.makePersistent(entry);
    pm.close();
    response.sendRedirect("login.jsp");

}
}

入门级:

package com.pack;
import javax.jdo.annotations.*;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.Text;

@PersistenceCapable(identityType = IdentityType.APPLICATION)
 public class Entry {

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;

@Persistent
private String poster;

@Persistent
private Text content;

public Entry() {

}

public Key getKey() {
    return key;
}

public Entry(Text content, String poster) {

    this.content = content;
    this.poster = poster;

}

public Text getContent() {

    return content;
}

public String getPoster() {
    return poster;
}

}

JSP 文件:

<%@ page import="java.util.List"%>
<%@ page import="java.util.ArrayList"%>
<%@ page import="javax.jdo.PersistenceManager"%>
<%@ page import="javax.jdo.Query"%>
<%@ page import="com.pack.*"%>




<html>
<head>
<style>
#entryList {
margin-left: 1100px;
margin-top: -325px;
overflow-y: scroll;
height: 630px;
}

</style>
</head>
<body>




<div id="entry" class="entry">
    <h1>Welcome</h1>

    <form action="/LoginServlet" method="post">

        Comments:<br> <br>
        <textarea rows="4" cols="50" name="content">

       </textarea>
        <br> <br> Your name:<br> <br> <input
            name="poster" type="text" value=""><br> <br> <input
            type="submit" value="Post"> <br> <br>

    </form>

</div>
<div id="entryList">


    <h2>Updates</h2>

    <%
        PersistenceManager pm = PMF.get().getPersistenceManager();
        Query q1 = pm.newQuery("SELECT FROM " + Entry.class.getName());
        q1.setOrdering("l desc");

        entries = (List<Entry>) q1.execute();
    %>

    <%
        if (entries.isEmpty()) {
    %>

    No entries

    <%
        } else {
    %>

    <%
            for (Entry e : entries) {

    %>

    <%=e.getContent().getValue()%>

    <br> posted by

    <%=e.getPoster()%>

    <br>
    <br> <br>


    <%

                }
            }

    %>

</div>

</body>
</html>

关于java.lang.String 无法转换为 java.util.List,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43298782/

相关文章:

php - 在哪里可以找到 google_sql sql 数据库的用户名和密码?

google-app-engine - BigQuery 界面 - 缺少数据集

python 列表似乎随 self.request.get_all(

JavaFX 新的自定义弹出窗口

java - 如何使用JMock来验证两个方法调用之间是否经过了一定的时间?

jsp - 无法在 paypal 中配置 PDT 或 IPN

java - 使用java spring boot有什么问题

java - 从 WAR 文件获取文件

java - 驱动程序管理器无法解析为类型

java - 你能在JSP(Firefox和IE)中获取Windows(AD)用户ID吗?