Help us understand the problem. What is going on with this article?

サーバーサイドJavaでMVCフレームワークの理解をする 3/4 Controller

More than 3 years have passed since last update.

キャプチャ.PNG

↑今回のフレームワークのイメージ図

はじめに

今回が山場です。あまり頭に入ってこないとは思いますが最初はそんなもんです。がんばりましょう。

やること

掲題のフレームワークを使って、Webサイトを作ってみましょう
全4回の内訳
1. View jspでフロントのページを作る
2. Model JavaBeansでモデルを作る
3. Controller VとMを繋ぐServletを作る
4. ModelでDB2にアクセスするメソッドを作る

前提

  • Eclipse導入済み
  • DB2インストール済み(4回目に必要)

手順

jspの修正

Top.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%><!-- 文字コード指定 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Top</title>
<h1>top</h1>
</head>
<body>

<form action="/MVC/Controller" method="post">   <!-- postで↓の情報を送信することの宣言 【追加】actionの値をControllerに -->
    <input type="text" name="keyword">   <!--検索キーワード入力欄-->
    <input type="hidden" name="beanid" value="practice.Product"><!--【追加】使用するBeanを宣言しておく-->
    <input type="hidden" name="pageto" value="Result.jsp"><!--【追加】遷移先の指定-->
    <input type="submit" value="Search"> <!-- キーワード送信ボタン -->
</form>

</body>
</html>

Modelの作成(一部再掲)

Product.java
package practice;


public class Product extends SuperBean{
        //メンバ変数はprivateにしておきましょう
    private int price;
    private int weight;
    private String name;
    private String material1;
    private String category;

    public void runBean(){//【変更】setAllからメソッド名を変更しました。
        String keyword = (String) super.request.getParameter("keyword");//【変更】受け取った値を出力して確認
        System.out.println("検索キーワードは"+keyword+"でした。今度コレを使ってDB検索しますよ");

        //今回はDB接続をしないので、直接値をbeanの各属性にsetします。
        this.price=1404;
        this.weight=300;
        this.name="「私の消滅」中村 文則";
        this.material1="paper";
        this.category="book";

    }


    public int getPrice() {
        return price;
    }
    public int getWeight() {
        return weight;
    }
    public String getName() {
        return name;
    }
    public String getMaterial1() {
        return material1;
    }
    public String getCategory() {
        return category;
    }
}

SuperBeanの作成

Beanの共通処理を親クラスにまとめるために作成

SuperBean.java
package practice;

import javax.servlet.http.HttpServletRequest;

public abstract class SuperBean {
    protected HttpServletRequest request;//requestを保持します
    void setJspInfo(HttpServletRequest request){
        this.request = request;
    }
    protected void runBean(){//beanを実行

    }

}

Controllerの作成

Controllerは以後、機能(jsp,beans)を追加する場合でも編集が不要な設計になっています。今は書くのが大変だと思いますが、機能を追加する場合に便利になります。
サーブレットは、practiceパッケージを右クリック→新規→サーブレットから作成してください

Controller.java
package practice;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
 * Servlet implementation class Controller
 */
@WebServlet("/Controller")
public class Controller extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * Default constructor.
     */
    public Controller() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doPost(request,response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub



        //セッション(jsp側にインスタンスを返すときの入れ物)を生成。
        HttpSession session= request.getSession();

            //変数としてBean名を受け取り、そのBeanをインスタンス化してあげます。これにより、getterなどのメソッドが使えるようになります。ここではProductクラスがインスタンス化されています。
            //文字コード指定
            request.setCharacterEncoding("UTF-8");
            String beanid = (String)request.getParameter("beanid");
            String pageto = (String)request.getParameter("pageto");
            try {
                SuperBean bean = (SuperBean) Class.forName(beanid).newInstance();


            //jspから受け取った情報をBeanに渡す
            bean.setJspInfo(request);

            //beanを実行する
            bean.runBean();

            //sessionにbeanを格納
            session.setAttribute("bean", bean);

            //遷移
            RequestDispatcher rd =request.getRequestDispatcher(pageto);
            rd.forward(request, response);
            } catch (InstantiationException e) {
                // TODO 自動生成された catch ブロック
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO 自動生成された catch ブロック
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                // TODO 自動生成された catch ブロック
                e.printStackTrace();
            }



    }

}


結果出力ページの作成

Result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="practice.Product"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%request.setCharacterEncoding("UTF-8"); %>
<%Product bean = (Product)session.getAttribute("bean"); %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>

</head>
<body>
商品名:<%=bean.getName() %><br>
価格:\&nbsp;<%=bean.getPrice() %><br>
重量:<%=bean.getWeight() %><br>
商品カテゴリ:<%=bean.getCategory() %><br>
</body>
</html>

これでDB接続を除いたMVCが完了です。
今までに比べて今回の内容はすごく難しかったですよね。お疲れ様でした。
エラーにぶち当たりまくると思うので、質問お待ちしています。

kyogom
ガジェット系に飛びつく系男子。 なにかと自動化したがる。
https://kyogom.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした