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

时间:2017-04-08 18:23:04

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

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

  • content
  • 此人的姓名(海报)

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

我不能将String数据类型用于“content”,因为它只能获取高达1500字节的值,而且我的要求不止于此。

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

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

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

这是正确的方法还是有其他方法可以获取超过1500字节的值并通过查询来将其显示回用户?

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>

2 个答案:

答案 0 :(得分:1)

修正了问题。使用App Engine数据存储的Text数据类型,并在JSP中检索时使用getValue()。 现在,我可以从用户那里获取大于1500字节的值,并通过从JSP查询来显示它。

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

  

JSP表达式用于将转换为字符串的脚本语言表达式的值插入返回给客户端的数据流中。当脚本语言是Java编程语言时,表达式将转换为一个语句,该语句将表达式的值转换为String对象并将其插入到隐式out对象中。

JSP Expressions

使用getContent()时,它显示空值。因此,要插入&#34; Content&#34;的值使用getContent().getValue()进入输出流。这返回了&#34;内容&#34;的值。包括那些大小超过1500字节的那些&#34; Text&#34;对象的大小不受限制。

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>

答案 1 :(得分:0)

ORM框架使用零参数构造函数,并且您没有为Entry类提供任何零参数构造函数。问题在于你的Entry(String content)(变量命名在使用工具/框架时非常重要,而content名称也用于List类型)Entry类的构造函数需要更改如下所示:

public Entry() {
}