在我的節目,我是從用戶通過形式在JSP文件中取兩個值:java.lang.String中不能被強制轉換爲java.util.List的
- 內容的
- 名人(海報)
表單的action屬性調用Servlet。 Servlet在Entry類和PersistenceManagerFactory的幫助下使用JDO將對象保存在數據存儲中,並將其重定向回JSP。 JSP然後查詢並打印該內容以及該人的姓名。
我不能使用字符串數據類型作爲「內容」,因爲它只能取值高達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");
}
}
Entry類:
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>
請張貼完整的堆棧跟蹤。如果我要做一個瘋狂的猜測,Persistence框架將調用公共Entry(String content)構造函數,並從數據庫中檢索List值並將其錯誤地排除。不知道爲什麼你甚至有這個構造函數。同樣,堆棧跟蹤應該有所幫助。 –
我已經刪除了'Entry(String content){}'構造函數。無論如何,我已經解決了這個問題。使用「Text」數據類型的App Engine數據存儲,並在JSP中打印時,使用'<%= e.getContent()。getValue()%>'而不是'<%= e.getContent()>'。這將打印由用戶輸入的整個大型內容的值。 –
@PrakharSaxena建議您發佈您的解決方案作爲答案,以更好地幫助那些也可能遇到同樣問題的社區成員。 – Jordan