0

にキャストすることはできません、私は、JSPファイル内にフォームを介してユーザからの2つの値を取っています:java.lang.Stringでは私のプログラムではjava.util.Listに

  • コンテンツの
  • 名前を人(ポスター)

フォームのアクション属性はサーブレットを呼び出します。 EntryクラスとPersistenceManagerFactoryの助けを借りたサーブレットは、JDOを使用してデータストア内のオブジェクトを永続化し、JSPにリダイレクトします。 JSPは、その人物の名前とともにコンテンツを照会して印刷します。

"content"にはStringデータ型を使用できません。これは、1500バイトまでの値を取ることができ、私の要件はそれ以上です。

"Text"データ型を使用しようとしましたが、索引付けされていないため問合せにNULL値が示されました。ここで

、私は、リスト内の値を取得しようとしていますが、それはエラーを示しています

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

は、これは正しい方法ですか私は値が大きいほど、より1500バイトを取ることが可能な他の方法がありますJSPからクエリを実行してユーザに表示しますか?

サーブレットファイル:

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

完全なスタックトレースを投稿してください。野生の推測をしなければならない場合、Persistenceフレームワークは、データベースから取得されたList値を持つパブリックEntry(Stringコンテンツ)コンストラクタを呼び出してエラーを出しています。あなたがなぜこのコンストラクタを持っているのか分かりません。繰り返しますが、スタックトレースが役立ちます。 –

+0

'Entry(String content){}'コンストラクタを削除しました。とにかく、私は問題を解決しました。 App Engineのデータストアの "Text"データ型を使用し、JSPで印刷するときに、 '<%= e.getContent()>の代わりに' <%= e.getContent()。getValue()%> 'を使用しました。これは、ユーザーが入力した大きなコンテンツ全体の値を表示します。 –

+0

@PrakharSaxenaこの同じ問題が発生している可能性のあるコミュニティメンバーに役立つソリューションとして、ソリューションを投稿することをお勧めします。 – Jordan

答えて

1

:問題は、以下のように変更する必要がEntryクラスのごEntry(String content)(あなたはツール/フレームワークを使用してcontent名前が同様Listタイプに使用されているときに、変数の命名が重要である)コンストラクタであります問題を修正しました。 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

同一のコードです。

サーブレットファイル:

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クラスの引数コンストラクタ

public Entry() { 
} 
+0

私のコンストラクタを 'public entry(String content){ }'から ' 'に変更しました' public Entry(){} 'それはまだ同じエラーを表示します:' java.lang.Stringはjava.util.List'にキャストできません –

関連する問題