【Java】Sessionを使って入力値を保持したい
Q&A
Closed
はじめに
今月より、Javaを勉強し始め、現在簡単なお問い合わせサイトを作成しています。
「フォームの必須入力チェック(バリデーション)で引っかかったとき」
「遷移後の入力確認画面で”内容を修正する”を押してフォーム入力画面に遷移したとき」
に入力した値を保持できるよう、セッションを用いて実装したいと考えております。
※サーバー側での処理方法を知りたいため、確認画面からフォーム画面への遷移にhistory.back()を使用しておりません。
現在、セッションに格納した値を取り出すための、コードの書き方で試行錯誤しています。
どのようにコードを記述すれば良いかご教授ください。
解決したいこと
セッションで値を保持するための記述の仕方
発生している問題・エラー
現在は、JSPの初期値(value)の出力部で「NullPointerException」が発生しております。
該当するソースコード
Controller
ContactsServlet.java
package servlet;
import java.io.IOException; // 入出力の例外
import java.util.ArrayList; // ListではInstanceを生成ができないためArrayList
import javax.servlet.RequestDispatcher; // クライアントからのリクエストを受信、サーバ上の任意のリソースに送信
import javax.servlet.ServletException; // Servletに問題が発生したときにthrow
import javax.servlet.annotation.WebServlet; // マッピング情報を含むServletの設定情報を宣言
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; // Session
import model.Contact;
/**
* 問い合わせ画面・確認画面の表示を行うコントローラ
*/
@WebServlet("/ContactsServlet")
public class ContactsServlet extends HttpServlet {
/**
* 問い合わせ画面への遷移を行う
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Session
HttpSession session = request.getSession(true);
String contact = (String) session.getAttribute("contact");
session.setAttribute("contact", contact);
// avoid NullPointerException & ClassCastException
ArrayList<String> error = new ArrayList<>();
error.add("");
request.setAttribute("error", error);
// Forward
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/index.jsp");
dispatcher.forward(request, response);
}
/**
* 確認画面への遷移を行う
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Session
HttpSession session = request.getSession();
// Encode
request.setCharacterEncoding("UTF-8");
// Get_RequestParameter
String name = request.getParameter("name"); // 名前
String email = request.getParameter("email"); // メールアドレス
String tel = request.getParameter("tel"); // 電話番号
String sex = request.getParameter("sex"); // 性別
String item = request.getParameter("item"); // 項目
String content = request.getParameter("content"); // 内容
// Instance
Contact contact = new Contact();
// Set_Property
contact.setName(name);
contact.setEmail(email);
contact.setTel(tel);
contact.setSex(sex);
contact.setItem(item);
contact.setContent(content);
// Validation
ArrayList<String> error = new ArrayList<>();
// nullがあった場合、「ぬるぽ」になる可能性があるため「"".equals(変数)」
if("".equals(name)) {
error.add("名前を入力してください。");
}
if("".equals(email)) {
error.add("メールアドレスを入力してください。");
}
if("".equals(tel)) {
error.add("電話番号を入力してください。");
}
if(item == null) { // equals(null) -> NullPointerException
error.add("問い合わせ項目を選択してください。");
}
if("".equals(content)) {
error.add("問い合わせ内容を入力してください。");
}
// Branch
if(error.size() > 0){
// Save_RequestScope/SessionScope
request.setAttribute("error", error);
session.setAttribute("contact", contact); // 入力値保持のため
// Forward -> index
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/index.jsp");
dispatcher.forward(request, response);
}else{
// Save_SessionScope
session.setAttribute("contact", contact);
// Forward -> confirm
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/confirm.jsp");
dispatcher.forward(request, response);
}
}
}
Model
Contact.java
package model;
public class Contact {
protected String name, email, tel, sex, item, content;
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setEmail(String email) {
this.email = email;
}
public String getEmail() {
return this.email;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getTel() {
return this.tel;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getSex() {
return this.sex;
}
public void setItem(String item) {
this.item = item;
}
public String getItem() {
return this.item;
}
public void setContent(String content) {
this.content = content;
}
public String getContent() {
return this.content;
}
}
View
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="model.Contact" %>
<%@ page import ="java.util.ArrayList" %>
<%
// Get_RequestScope
Contact contact = (Contact) session.getAttribute("contact");
ArrayList<String> error = (ArrayList<String>) request.getAttribute("error");
%>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>問い合わせ画面</title>
<link rel="stylesheet" href="css/style.css">
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
<script src="js/index.js"></script>
</head>
<body>
<div>
<h1>株式会社〇〇</h1>
</div>
<div>
<h2>問い合わせ画面</h2>
</div>
<div>
<form action="#" class="contact-form">
<h1 class="contact-title">お問い合わせ 内容入力</h1>
<p>お問い合わせ内容をご入力の上、「確認画面へ」ボタンをクリックしてください。</p>
<!-- error message -->
<% for(int i=0; i<error.size(); i++){ %>
<p class="error"><%= error.get(i) %><br/></p>
<% } %>
<div class="expantion-box">
<button class="expantion" type="submit">問い合わせする</button>
</div>
</form>
<div class="form-contents">
<form action="#" method="post">
<div class="form-item">
<label>お名前</label>
<input type="text" name="name" placeholder="例)山田太郎" value="<% contact.getName(); %>">
</div>
<div class="form-item">
<label>メールアドレス</label>
<input type="text" name="email" placeholder="例)guest@example.com" value="">
</div>
<div class="form-item">
<label>電話番号</label>
<input type="text" name="tel" placeholder="例)0000000000" value="">
</div>
<div class="form-item">
<label>性別</label>
<input type="radio" name="sex" value="男性" checked>男性
<input type="radio" name="sex" value="女性">女性
</div>
<div class="form-item">
<label>問い合わせ項目</label>
<select name="item">
<option disabled selected>お問い合わせ項目を選択してください</option>
<option value="ご質問・お問い合わせ">ご質問・お問い合わせ</option>
<option value="ご意見・ご感想">ご意見・ご感想</option>
</select>
</div>
<div class="form-item">
<label>問い合わせ内容</label>
<textarea name="content" rows="5" placeholder="お問合せ内容を入力" value=""></textarea>
</div>
<button class="confirm" type="submit">確認画面へ</button>
</form>
</div>
</div>
</body>
</html>
confirm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="model.Contact" %>
<%
// Get_RequestScope
Contact contact = (Contact) session.getAttribute("contact");
%>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>確認画面</title>
<link rel="stylesheet" href="css/style.css">
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
</head>
<body>
<div>
<h1>株式会社〇〇</h1>
</div>
<div>
<h2>確認画面</h2>
</div>
<div>
<form action="ContactsServlet" method="get">
<h1 class="contact-title">お問い合わせ 内容確認</h1>
<p>お問い合わせ内容はこちらで宜しいでしょうか?<br>よろしければ「送信する」ボタンを押して下さい。</p>
<div>
<div>
<label>お名前</label>
<p><%= contact.getName() %></p>
</div>
<div>
<label>メールアドレス</label>
<p><%= contact.getEmail() %></p>
</div>
<div>
<label>電話番号</label>
<p><%= contact.getTel() %></p>
</div>
<div>
<label>性別</label>
<p><%= contact.getSex() %></p>
</div>
<div>
<label>お問い合わせ項目</label>
<p><%= contact.getItem() %></p>
</div>
<div class="detail">
<label>お問い合わせ内容</label>
<p class="content-length"><%= contact.getContent() %></p>
</div>
</div>
<input type="submit" value="内容を修正する" >
<button type="submit" name="submit">送信する</button>
</form>
</div>
</body>
</html>
自分で試したこと
下記、サイトを参考にセッションスコープについて調べましたが、
セッションを取得して表示する方法がパッとせず、悩んでおります。
参考
input textの値 保持
jspでセッションスコープの値が取得できません。
JSP セッションスコープ
Java sessionスコープ
0