ページ 11

【JSP/Servlet】リクエストスコープのエラー

Posted: 2015年5月05日(火) 17:00
by Nect
こんにちは。Nectと申します。

添付したソースコードで発生しているNullPointerExceptionを解消しようとしています。
スタックトレースにat jp.request.servlet.FowardServlet.doPost(FowardServlet.java:52)があります。そのスタックトレースを元に、
FowardServlet#53行目にブレークポイントを設置しました。そして、request、response、beans、disが生成されていることを
確認しました。FowardServlet#52行目に渡せるrequest、responseがあるためNullPointerExceptionが発生している根本的な原因を
特定できませんでした。at org.apache.jsp.WebContent.WEB_002dINF.jsp.After_jsp._jspService(After_jsp.java:75)発生個所も
確認しましたが、原因を特定できませんでした。そのため、NullPointerExceptionを解消できていません。

NullPointerExceptionを解消する方法を教えてください。宜しくお願い致します。

エラー内容は以下の通りです。
重大: サーブレット jsp のServlet.service()が例外を投げました
java.lang.NullPointerException
at org.apache.jsp.WebContent.WEB_002dINF.jsp.After_jsp._jspService(After_jsp.java:75)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
at jp.request.servlet.FowardServlet.doPost(FowardServlet.java:52)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:643)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)

5 05, 2015 3:45:27 午後 org.apache.catalina.core.StandardWrapperValve invoke
重大: サーブレット Foward2 のServlet.service()が例外を投げました
java.lang.NullPointerException
at org.apache.jsp.WebContent.WEB_002dINF.jsp.After_jsp._jspService(After_jsp.java:75)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
at jp.request.servlet.FowardServlet.doPost(FowardServlet.java:52)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:643)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)


【Before.jsp】

コード:

 
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>MVCモデル</title>
</head>
<body>

<h1>MVCモデル</h1>

<!-- 送信先の指定 -->
<form action="/tomcat_test/foward2" method="post">
データ1:<input type="text" name="data1"><br>
データ2:<input type="text" name="data2"><br>
<input type="submit" value="送信">
</form>
</body>
</html>
 

【FowardServlet.java】

コード:

 
package jp.request.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model.Beans;

public class FowardServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;

  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{

	  String URL="/WebContent/WEB-INF/jsp/Before.jsp";

	  RequestDispatcher dis =
			  request.getRequestDispatcher(URL);

	  dis.forward(request, response);
  }

  public void doPost(HttpServletRequest request, HttpServletResponse response)
		    throws IOException, ServletException{

	  String URL2="/WebContent/WEB-INF/jsp/After.jsp";

	  String data1 = request.getParameter("data1");
	  String data2 = request.getParameter("data2");

	  //通常のjavaファイルなのでインスタンスを生成
	  //プロパティの更新
	  Beans beans = new Beans();
	  beans.setData1(Double.parseDouble(data1));
	  beans.setData2(Double.parseDouble(data2));

	  //リクエストスコープに格納
	  request.setAttribute("Beans",beans);

	  RequestDispatcher dis =
			  request.getRequestDispatcher(URL2);

	  //指定したパスにリクエスト、レスポンス情報を引き継いでもらう
	  dis.forward(request, response);

  }
}

【Beans.java】

コード:

 package model;

import java.io.Serializable;

public class Beans implements Serializable{

	private double data1,data2;

	public double getData1() {
		return data1;
	}

	public void setData1(double data1) {
		this.data1 = data1;
	}

	public double getData2() {
		return data2;
	}

	public void setData2(double data2) {
		this.data2 = data2;
	}

}
 

【After.java】
[codejsp]
<%@page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@page import ="model.Beans" %>

<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
</head>
<body>
<p>
<!-- 以下のメソッドでエラーが発生している可能性あり -->
データ1<%=beans.getData1()%><br>
</p>
</body>
</html>
[/code]



【web.xml】

コード:

 
<?xml version="1.0" encoding="ISO-8859-1"?>
 <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
 version="2.4">

 <servlet>
 <servlet-name>Foward2</servlet-name>
 <servlet-class>jp.request.servlet.FowardServlet</servlet-class>
 </servlet>
 <servlet-mapping>
 <servlet-name>Foward2</servlet-name>
 <url-pattern>/foward2</url-pattern>
 </servlet-mapping>

 </web-app>

Re: 【JSP/Servlet】リクエストスコープのエラー

Posted: 2015年5月05日(火) 17:06
by Nect
すみません。誤字がありました。
訂正箇所は以下の通りです。

×After.java ○After.jsp

Re: 【JSP/Servlet】リクエストスコープのエラー

Posted: 2015年5月05日(火) 17:39
by hide
jspはhtmlに魔法をかけているわけではなくて
内部でjspのファイルをサーブレットにして動かしてくれているだけなので、基本はservletとかわりません。

コード:

<body>
<p>
データ1<%=beans.getData1()%><br>
</p>
</body>

コード:

out.println("<body>");
out.println("<p>");
out.println("データ1" + beans.getData1() + "<br>");
out.println("</p>");
out.println("</body>");
手打ちなので実際と違うと思いますがこんなイメージです。
apache-tomcatの下のworkあたりからディレクトリを降りていけば変換されたファイルが見つかるはずです。

本題ですが、jspもサーブレットと変わらないので、必要な物は自分で宣言して取得する必要があるはずです(暗黙のものを除く)。
requestのアトリビュートに入れたbeansを受け取る処理が入ってないように見えますね。

Re: 【JSP/Servlet】リクエストスコープのエラー

Posted: 2015年5月05日(火) 18:06
by Nect
申し訳ございません。投稿内容を推敲した際に、getAttributeの行が欠落してしまいました。

以下が動作させているAfter.jspです。

【After.jsp】

コード:

 <%@page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@page import ="model.Beans" %>

<%
Beans beans = (Beans) request.getAttribute("beans");
%>

<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
</head>
<body>
<p>
<!-- 以下のメソッドでエラーが発生している可能性あり -->
データ1<%=beans.getData1()%><br>
</p>
</body>
</html>
 

Re: 【JSP/Servlet】リクエストスコープのエラー

Posted: 2015年5月05日(火) 19:33
by みけCAT
JSPは全く知らないですが、FowardServlet.javaでは"Beans"を用いてsetAttributeしているのに、After.jspでは"beans"を用いてgetAttributeしているので、
この名前を一致させないとまずいのではないでしょうか?
オフトピック
HTML5では必須のtitle要素が抜けているようです。(Validator.nuで確認)

Re: 【JSP/Servlet】リクエストスコープのエラー

Posted: 2015年5月06日(水) 19:37
by Nect
みけCATさん

プログラムを動作させることができました。
アドバイスを頂き、ありがとうございました。