在我的程序中,我通过 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.
何时 getContent()
使用时,它显示空值。因此,要将“Content”的值插入到输出流中,请使用 getContent().getValue()
。这返回了“Content”的值,包括那些大小大于 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>
关于java.lang.String 无法转换为 java.util.List,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43298782/