2017-04-08 42 views
0

在我的節目,我是從用戶通過形式在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> 
+0

請張貼完整的堆棧跟蹤。如果我要做一個瘋狂的猜測,Persistence框架將調用公共Entry(String content)構造函數,並從數據庫中檢索List值並將其錯誤地排除。不知道爲什麼你甚至有這個構造函數。同樣,堆棧跟蹤應該有所幫助。 –

+0

我已經刪除了'Entry(String content){}'構造函數。無論如何,我已經解決了這個問題。使用「Text」數據類型的App Engine數據存儲,並在JSP中打印時,使用'<%= e.getContent()。getValue()%>'而不是'<%= e.getContent()>'。這將打印由用戶輸入的整個大型內容的值。 –

+0

@PrakharSaxena建議您發佈您的解決方案作爲答案,以更好地幫助那些也可能遇到同樣問題的社區成員。 – Jordan

回答

1

修復了這個問題。使用App Engine數據存儲的Text數據類型,並在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()。這返回「內容」的值,包括那些大小超過1500字節的值,因爲「文本」對象的大小是無限的。

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> 
0

ORM框架使用中無參數的構造函數和你沒有提供任何零參數構造函數爲您的Entry類。問題是你Entry(String content)Entry類的構造函數需要改變(當你使用工具/框架,並正在被用於List類型以及content名變量命名是很重要的),如下所示:

public Entry() { 
} 
+0

我將構造函數從'public Entry(String content){ }'更改爲 'public Entry(){}'它仍然顯示相同的錯誤:'java.lang.String不能轉換爲java.util.List' –

相關問題