実現したいこと
初心者なのですが、GAEをつかって、Javaの基本的なCRUDをつくろうと
下記のサイトを参考に実装しました。
が、NOT Foundが出てしまい、JSPが表示されません。
コンソールにはとくにエラーメッセージも出ていないので原因がわからず。。
どなたか教えていただけますでしょうか。
https://www.ipl.co.jp/item/gaej03.html
【1/18日追記】
PersistenceManagerでエラーになっているようで、こちらにどう対応すればよいのか、
調べてもよくわからず。教えていただけたら幸いです。
※エラー内容は後述
ソースコード
src\main\webapp\WEB-INF\index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page import="com.google.appengine.api.users.User" %> <%@ page import="com.google.appengine.api.users.UserService" %> <%@ page import="com.google.appengine.api.users.UserServiceFactory" %> <%@ page import="javax.jdo.PersistenceManager" %> <%@ page import="java.util.List" %> <%@ page import="com.google.appengine.*" %> <%@ page import="com.google.appengine.dao.*" %> <%@ page import="com.google.appengine.data.*" %> <%@ page import="com.google.appengine.util.*" %> <!DOCTYPE> <html> <head> <title>簡易ブログ</title> </head> <body style="background: #DDDDFF;"> <form action="/sv" method="post"> <input type="hidden" name="action" value="insert" /> <textarea name="text" style="width: 300px; height: 150px;"></textarea> <br> <input type="submit" value="投稿" /> </form> <% PersistenceManager pm = PMF.get().getPersistenceManager(); try{ //全件取得 String query = "select from " + Article.class.getName(); Object execute = pm.newQuery(query).execute(); List<Article> obj = (List<Article>) execute; for (Article g : obj) { %> <div class="post" style="width: 300px; border: solid 1px #FFFFFF;"> <div class="post-header"> <div align="right"><a href="/sv?action=delete&id=<%=g.getKeyStr()%> ">del</a> <a href="/edit.jsp?id=<%=g.getKeyStr()%>">edit</a></div> <div style="margin: 10px;"><!-- text --> <pre><%=g.getText()%></pre> </div><!-- text --> </div><!-- post-header --> <div class="comments" style="border: dotted 3px #FFFFFF; font-size: 80%;"> <p>コメント</p> <ul> <% for (Comment comment : g.getComments()) { %> <li><%=comment.getText()%> <a href="/sv?action=deletecomment&id=<%=comment.getKeyStr()%> ">x</a> </li> <% } %> </ul> <div align="center"><!-- コメントフォーム --> <form action="/sv" method="post"> <input type="hidden" name="action" value="addcomment" /> <input type="hidden" name="id" value="<%=g.getKeyStr()%>" /> <input type="text" name="text" /> <input type="submit" value="コメント追加" /> </form> </div><!-- コメントフォーム --> </div><!-- comments --> </div><!-- post --> <% } pm.close(); }catch(Exception e){ e.printStackTrace(); } %> </body> </html>
実現したいこと
JSPを参照する
【1/18追記】「」
src\main\webapp\index.jsp
JSP
1<%@ page contentType="text/html;charset=UTF-8" language="java" %> 2<%@ page import="com.google.appengine.api.users.User" %> 3<%@ page import="com.google.appengine.api.users.UserService" %> 4<%@ page import="com.google.appengine.api.users.UserServiceFactory" %> 5<%@ page import="javax.jdo.PersistenceManager" %> 6<%@ page import="java.util.List" %> 7 8<%@ page import="com.google.appengine.*" %> 9<%@ page import="com.google.appengine.dao.*" %> 10<%@ page import="com.google.appengine.data.*" %> 11<%@ page import="com.google.appengine.util.*" %> 12 13 14 15<!DOCTYPE> 16<html> 17<head> 18<title>簡易ブログ</title> 19</head> 20<body style="background: #DDDDFF;"> 21<form action="/sv" method="post"> 22 <input type="hidden" name="action" value="insert" /> 23 <textarea name="text" style="width: 300px; height: 150px;"></textarea> 24 <br> 25 <input type="submit" value="投稿" /> 26</form> 27 28<% 29PersistenceManager pm = PMF.get().getPersistenceManager(); 30try{ 31 //全件取得 32 String query = "select from " + Article.class.getName(); 33 Object execute = pm.newQuery(query).execute(); 34 List<Article> obj = (List<Article>) execute; 35 36for (Article g : obj) { 37%> 38 39 40<div class="post" style="width: 300px; border: solid 1px #FFFFFF;"> 41<div class="post-header"> 42 <div align="right"><a href="/sv?action=delete&id=<%=g.getKeyStr()%> ">del</a> 43 <a href="/edit.jsp?id=<%=g.getKeyStr()%>">edit</a></div> 44 <div style="margin: 10px;"><!-- text --> 45 <pre><%=g.getText()%></pre> 46 </div><!-- text --> 47</div><!-- post-header --> 48 49<div class="comments" style="border: dotted 3px #FFFFFF; font-size: 80%;"> 50<p>コメント</p> 51<ul> 52 <% for (Comment comment : g.getComments()) { %> 53 <li><%=comment.getText()%> 54 <a href="/sv?action=deletecomment&id=<%=comment.getKeyStr()%> ">x</a> 55 </li> 56 <% } %> 57</ul> 58<div align="center"><!-- コメントフォーム --> 59<form action="/sv" method="post"> 60 <input type="hidden" name="action" value="addcomment" /> 61 <input type="hidden" name="id" value="<%=g.getKeyStr()%>" /> 62 <input type="text" name="text" /> 63 <input type="submit" value="コメント追加" /> 64</form> 65</div><!-- コメントフォーム --> 66</div><!-- comments --> 67</div><!-- post --> 68 69 70 71 72<% 73} 74 pm.close(); 75}catch(Exception e){ 76 e.printStackTrace(); 77} 78%> 79 </body> 80</html> 81
src\main\webapp\WEB-INF\web.xml
XML
1<?xml version="1.0" encoding="utf-8"?> 2<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 5 version="3.1"> 6 <servlet> 7 <servlet-name>BigTable</servlet-name> 8 <servlet-class>com.google.appengine.BigTableServlet</servlet-class> 9 </servlet> 10 <servlet-mapping> 11 <servlet-name>BigTable</servlet-name> 12 <url-pattern>/sv</url-pattern> 13 </servlet-mapping> 14 <welcome-file-list> 15 <welcome-file>index.jsp</welcome-file> 16 </welcome-file-list> 17</web-app> 18
1/18追記 JSPファイルをWebapp直下に置いたところ、JSPは参照できるようになりました
- 新たに出ているエラー
HTTP ERROR 500 Problem accessing /. Reason: Server Error Caused by: org.apache.jasper.JasperException: An exception occurred processing JSP page [/index.jsp] at line [29] 26: </form> 27: 28: <% 29: PersistenceManager pm = PMF.get().getPersistenceManager(); 30: try{ 31: //???????? 32: String query = "select from " + Article.class.getName(); Stacktrace: at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:584) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:466) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386) .....
コンソールに表示されているエラー
原因: javax.servlet.ServletException: java.lang.ExceptionInInitializerError ... 原因: javax.jdo.JDOFatalUserException: A property named javax.jdo.PersistenceManagerFactoryClass must be specified, or a jar file with a META-INF/services/javax.jdo.PersistenceManagerFactory entry must be in the classpath, or a property named javax.jdo.option.PersistenceUnitName must be specified.
ファイル構成
│ .classpath │ .project │ pom.xml │ ├─.settings │ .jsdtscope │ com.google.cloud.tools.eclipse.appengine.deploy.prefs │ org.eclipse.core.resources.prefs │ org.eclipse.jdt.core.prefs │ org.eclipse.m2e.core.prefs │ org.eclipse.wst.common.component │ org.eclipse.wst.common.project.facet.core.xml │ org.eclipse.wst.jsdt.ui.superType.container │ org.eclipse.wst.jsdt.ui.superType.name │ org.eclipse.wst.validation.prefs │ ├─src │ │ .project │ │ │ └─main │ ├─java │ │ └─com │ │ └─google │ │ └─appengine │ │ │ BigTableServlet.java │ │ │ │ │ ├─dao │ │ │ ArticleDao.java │ │ │ CommentDao.java │ │ │ │ │ ├─data │ │ │ Article.java │ │ │ Comment.java │ │ │ │ │ └─util │ │ PMF.java │ │ │ └─webapp │ │ favicon.ico │ │ index.jsp │ │ │ ├─META-INF │ │ MANIFEST.MF │ │ │ └─WEB-INF │ │ .project │ │ appengine-web.xml │ │ edit.jsp │ │ index.html │ │ logging.properties │ │ web.xml │ │ │ └─lib └─target ├─appengine-maven-plugin-0.1.0-SNAPSHOT │ └─WEB-INF │ └─classes │ └─com │ └─google │ └─appengine │ │ BigTableServlet.class │ │ │ ├─dao │ │ ArticleDao.class │ │ CommentDao.class │ │ │ ├─data │ │ Article.class │ │ Comment.class │ │ │ └─util │ PMF.class │ ├─m2e-wtp │ └─web-resources │ └─META-INF │ │ MANIFEST.MF │ │ │ └─maven │ └─com.google.appengine │ └─appengine-maven-plugin │ pom.properties │ pom.xml │ └─test-classes └─com └─google └─appengine MockHttpServletResponse.class
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/18 01:47
2019/01/18 07:39
2019/01/22 04:30
2019/01/23 16:57