質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

5662閲覧

JSPのリンクからサーブレットを呼び出す

Tazusa

総合スコア41

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/09/30 15:27

編集2018/10/01 11:51

前提・実現したいこと

JSPのリンクからサーブレットを呼び出したいです。
隠しパラメータを使用してボタンと同じように実装してみた以下のコードでは
buttonIdがnullになっているようで、リンクをクリックすると
500エラーでNullPointerExceptionが出ます。

どうすればサーブレットを正しく呼び出すことができるか教えていただきたいです。
よろしくお願いします。

JSP

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 4<%@ page import="entity.LoginUser" %> 5<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 6<html> 7<head> 8<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 9<title>どこつぶ</title> 10</head> 11<body> 12<h1>どこつぶログイン</h1> 13 14<c:if test="${sessionScope.loginUser == null}"> 15<a href="/top.jsp">トップへ</a> 16</c:if> 17 18<form action="/doko" method="POST"> 19<c:if test="${sessionScope.loginUser != null}"> 20ようこそ<c:out value="${sessionScope.loginUser.userName}"/>さん 21 22<br> 23<%--この部分 --%> 24<input type="hidden" value="" name="buttonId"> 25<a href onclick="javascript:this.form.buttonId.value='UC0004'; this.form.submit();">つぶやきの投稿・閲覧へ</a> 26</c:if> 27</form> 28</body> 29</html>

Servlet

1@WebServlet("/doko") 2public class Controller extends HttpServlet { 3 private static final long serialVersionUID = 1L; 4 5 protected void doGet(HttpServletRequest request, HttpServletResponse response) 6 throws ServletException, IOException { 7 doPost(request, response); 8 } 9 10 /** 11 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 12 */ 13 protected void doPost(HttpServletRequest request, HttpServletResponse response) 14 throws ServletException, IOException { 15 16 //受け取った値の文字コード設定 17 request.setCharacterEncoding("UTF-8"); 18 19 String page = null; 20 21 String buttonId = request.getParameter("buttonId"); 22 23 //ボタンIDで遷移先の振り分け 24 switch (buttonId) { 25 26 case "UC0001": 27 LoginAction loginAction = new LoginAction(); 28 page = loginAction.execute(request); 29 break; 30 31 case "UC0002": 32 TweetAction tweetAction = new TweetAction(); 33 page = tweetAction.execute(request); 34 break; 35 36 case "UC0003": 37 LogoutAction logoutAction = new LogoutAction(); 38 page = logoutAction.execute(request); 39 break; 40 41 case "UC0004": 42 GoMainAction goMainAction = new GoMainAction(); 43 page = goMainAction.execute(request); 44 break; 45 46 } 47 48 //フォワード 49 RequestDispatcher dispacher = request.getRequestDispatcher(page); 50 dispacher.forward(request, response); 51 52 } 53 54}

Action

1public class GoMainAction { 2 3 public String execute(HttpServletRequest req) { 4 5 //遷移先 6 String page = "/WEB-INF/jsp/main.jsp"; 7 8 //セッション取得 9 HttpSession session = req.getSession(false); 10 11 //ログインチェック。セッションなければnullなのでエラー返す 12 if(session==null){ 13 page = "/dokotsubu/top.jsp"; 14 } 15 16 //セッションから過去のツイートを取り出し 17 ArrayList<String> tweetList = (ArrayList<String>)session.getAttribute("tweet"); 18 19 //過去のツイートある場合 20 session.setAttribute("tweetList", tweetList); 21 22 return page; 23} 24} 25

エラー

HTTPステータス 500 - type 例外レポート メッセージ 説明 The server encountered an internal error that prevented it from fulfilling this request. 例外 java.lang.NullPointerException controller.Controller.doPost(Controller.java:43) controller.Controller.doGet(Controller.java:26) javax.servlet.http.HttpServlet.service(HttpServlet.java:622) javax.servlet.http.HttpServlet.service(HttpServlet.java:729) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

43行目はswitchのbuttonIdです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dice142

2018/09/30 16:18

JSPにアクセスした時に500エラーが出るのでしょうか?それともServletに遷移した時でしょうか?後者ならServletのファイルも提示してください
m.ts10806

2018/09/30 21:17

buttonIdのvalueに直接同じUC0004を入れてaタグではなくbuttonのtype=submitに変えてボタン押下しても同じ結果であれば、サーブレット側に何かしら問題があるのではと思いますのでサーブレットのコードも提示してください。nullになると確認できているということはサーブレットは正しく呼び出せているんですよね?
退会済みユーザー

退会済みユーザー

2018/09/30 23:45

mts10806 aタグのthisはなんの味?
Tazusa

2018/10/01 11:41

情報が足りずすみません。リンクをクリックすると500エラーになるので、Servletに遷移したときのエラーになるかと思います。
dice142

2018/10/01 11:47

エラー文はなるべくそのまま載せた方が回答のヒントになります。
Tazusa

2018/10/01 11:48

submitに変えて、ということは<input type="submit" value="UC0004" name="buttonId">でしょうか。これを行うと「HTTPステータス 404 - /doko」が出るため、やはりサーブレットの問題のようでした。
Tazusa

2018/10/01 11:52

アドバイスありがとうございます。エラー文を追加させていただきました。
m.ts10806

2018/10/01 12:09

asahina1979さん あそこでthisって書くことがないですしね・・・。
m.ts10806

2018/10/01 12:12

Tazusaさん いえ。inputタグのvalueではそこがボタン名になるので良くないです。buttonタグにしてください。それに404が出ているということはformのactionに指定されているURLが間違っているということになります。
guest

回答2

0

サーブレット側の実装には特に問題はないんで、JSP(form側)にいくつか不備があるようです。

html

1<form name="form" method="POST" action="/doko"> 2 <input type="text" name="buttonId"> 3 <a href="#" onclick="javascript:void(0); document.form.buttonId.value='UC0004'; document.form.submit();">リンク</a> 4</form>

aタグ(anchor)のイベントを中断するために、先頭に javascript:void(0); を宣言した後、formの子要素を指定してあげてください。
ただ、onclick属性内で3つも処理もあるので、別途Script定義したところに書くと、おそらく汎用的に他のリンクでも利用できそうですね。

また、回答にも記載しましたが、formにもname属性をつけておくと、指定しやすいでしょう。

投稿2018/10/01 16:13

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tazusa

2018/10/01 18:26

ご回答ありがとうございます。(すみません、解決してないのに誤って解決済みにしてしまいました) 調べるとリンクの無効化ではhrefで#かvoid(0)を使用するということはわかったのですが、両方使うというパターンは初めて見ました。 それはinput type="text"としていることと関係があるのでしょうか?
A-pZ

2018/10/02 01:29

textかhiddenの違いはありません。(確認用にhiddenにはしませんでした)
Tazusa

2018/10/02 12:27 編集

ありがとうございます。無事に遷移することができました。今回全くわかっていなかったJavascriptの勉強も並行していきたいと思います。
guest

0

ベストアンサー

aタグからthis.formでformにアクセスできません。

一番目のformなら

this.form

document.forms[0]

追記

リンクの無効化がわかってないようなのでその方向も

<a href="#" onclick="document.forms[0].buttonId.value='UC0004'; document.forms[0].submit(); return false;">

のように最後に return false; を設定すればいいと思いますが。
まだ Javascript エラーが発生してそうですね。

これでもダメなら開発ツール(F12)でJSエラーを確認してください。

投稿2018/09/30 23:57

編集2018/10/01 13:59
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tazusa

2018/10/01 11:49

回答ありがとうございます。 <a href onclick="javascript:document.forms[0].buttonId.value='UC0004'; document.forms[0].submit();">つぶやきの投稿・閲覧へ</a> でやってみましたが、やはりServletのbuttonIdでnullが出ているようです。
退会済みユーザー

退会済みユーザー

2018/10/01 12:03

そりゃAタグのリンクを無効化してないから当然といえば当然(submit されてない)
Tazusa

2018/10/01 12:36

リンクが優先されるためにonclickが作動しないということでしょうか。 リンク無効化を調べて以下のように書いてみましたが、HTTPステータス 404 - /dokoとのことでした。 もう少し情報をいただけませんでしょうか。 <a href="javascript:void(0)" onclick="document.forms[0].buttonId.value='UC0004'; document.forms[0].submit();">
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問