回答編集履歴

5

コード修正

2024/11/15 16:21

投稿

jimbe
jimbe

スコア13170

test CHANGED
@@ -80,7 +80,7 @@
80
80
  }
81
81
  }
82
82
  ```
83
- abc.Counter.java
83
+ abc/Counter.java
84
84
  ```java
85
85
  package abc;
86
86
 

4

コード追加

2024/11/15 16:19

投稿

jimbe
jimbe

スコア13170

test CHANGED
@@ -24,3 +24,123 @@
24
24
  getCount → incrementCount
25
25
  ResultCount → getCount
26
26
  が適切ではないでしょうか。
27
+
28
+ ---
29
+ いつものことですがテキトウにやってみました。
30
+
31
+ doGet でまずセッションからカウンタを取り出しています。カウンタがまだ無いなら作ってセッションに入れます。
32
+ 後は乱数に応じてカウンタを増やしたりフォワード先を決めたりセッションを破棄したり…。
33
+ フォワード先で参照できるようにリクエストにカウンタを入れてフォワード、で完。
34
+ next.jsp/end.jsp の useBean ではカウンタの生成は必要無いので class 属性で無く type 属性を使っています(余り意味は無い)。
35
+ (RandomNum は Random のラッパーでしか無いので直で Random を使っています。)
36
+
37
+ abc/Servlet.java
38
+ ```java
39
+ package abc;
40
+
41
+ import java.io.IOException;
42
+ import java.util.Random;
43
+
44
+ import javax.servlet.ServletException;
45
+ import javax.servlet.annotation.WebServlet;
46
+ import javax.servlet.http.*;
47
+
48
+ @WebServlet("/Servlet")
49
+ public class Servlet extends HttpServlet {
50
+ private static final String COUNTER = "counter";
51
+
52
+ private Random random = new Random();
53
+
54
+ @Override
55
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
56
+ HttpSession session = request.getSession(true);
57
+
58
+ Counter counter = (Counter)session.getAttribute(COUNTER);
59
+ if(counter == null) {
60
+ counter = new Counter();
61
+ session.setAttribute(COUNTER, counter);
62
+ }
63
+
64
+ String next;
65
+ if(random.nextInt(10) < 7) {
66
+ counter.increment();
67
+ next = "next.jsp";
68
+ } else {
69
+ session.invalidate();
70
+ next = "end.jsp";
71
+ }
72
+
73
+ request.setAttribute(COUNTER, counter);
74
+ request.getRequestDispatcher(next).forward(request, response);
75
+ }
76
+
77
+ @Override
78
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
79
+ doGet(request, response);
80
+ }
81
+ }
82
+ ```
83
+ abc.Counter.java
84
+ ```java
85
+ package abc;
86
+
87
+ public class Counter {
88
+ private int value = 0;
89
+ void increment() { value ++; }
90
+ public int getValue() { return value; }
91
+ }
92
+ ```
93
+ index.jsp
94
+ ```html
95
+ <%@ page language="java" contentType="text/html; charset=UTF-8"
96
+ pageEncoding="UTF-8"%>
97
+ <!DOCTYPE html>
98
+ <html>
99
+ <head>
100
+ <meta charset="UTF-8">
101
+ <title>Insert title here</title>
102
+ </head>
103
+ <body>
104
+ <form action="Servlet" method="get">
105
+ <input type="submit" value="開始!">
106
+ </form>
107
+ </body>
108
+ </html>
109
+ ```
110
+ next.jsp
111
+ ```html
112
+ <%@ page language="java" contentType="text/html; charset=UTF-8"
113
+ pageEncoding="UTF-8"%>
114
+ <jsp:useBean scope="request" id="counter" type="abc.Counter"/>
115
+ <!DOCTYPE html>
116
+ <html>
117
+ <head>
118
+ <meta charset="UTF-8">
119
+ <title>Insert title here</title>
120
+ </head>
121
+ <body>
122
+ <jsp:getProperty name="counter" property="value" />回目!
123
+ 続くよ!!
124
+ <form action="Servlet" method="post">
125
+ <input type="submit" value="もう一発?">
126
+ </form>
127
+ </body>
128
+ </html>
129
+ ```
130
+ end.jsp
131
+ ```html
132
+ <%@ page language="java" contentType="text/html; charset=UTF-8"
133
+ pageEncoding="UTF-8"%>
134
+ <jsp:useBean scope="request" id="counter" type="abc.Counter"/>
135
+ <!DOCTYPE html>
136
+ <html>
137
+ <head>
138
+ <meta charset="UTF-8">
139
+ <title>Insert title here</title>
140
+ </head>
141
+ <body>
142
+ 終わり!
143
+ <jsp:getProperty name="counter" property="value" />回成功した
144
+ </body>
145
+ </html>
146
+ ```

3

Random については間違っていたので削除

2024/11/15 16:00

投稿

jimbe
jimbe

スコア13170

test CHANGED
@@ -5,7 +5,9 @@
5
5
  セッションを利用してみよう
6
6
  https://kanda-it-school-kensyu.com/java-jsp-servlet-contents/jjs_ch12/jjs_1202/
7
7
 
8
- random の方は、内部で使っている Random クラスは疑似乱数で、適切なシードで初期化しないと毎回同じ値が出るかもしれません。(確認していません。)
8
+ ~~random の方は、内部で使っている Random クラスは疑似乱数で、適切なシードで初期化しないと毎回同じ値が出るかもしれません。(確認していません。)~~
9
+ 間違ってました。デフォルトコンストラクタで Random インスタンスを生成するのが一番らしぃです。
10
+ http://javasampleokiba.blog.fc2.com/blog-entry-44.html
9
11
 
10
12
  蛇足ながら…
11
13
  CountBean の

2

リンク追加

2024/11/15 10:06

投稿

jimbe
jimbe

スコア13170

test CHANGED
@@ -1,6 +1,9 @@
1
1
  doGet を実行する度に、 count も result も、ついでに random も作り直しているように見えますけども。
2
2
  CountBean の初期値は 0 ですから、いくらやっても 2 以上にはならないのではないでしょうか。
3
3
  セッションに該当オブジェクトがあったらそれを取り出して使うようにする必要があるでしょう。
4
+
5
+ セッションを利用してみよう
6
+ https://kanda-it-school-kensyu.com/java-jsp-servlet-contents/jjs_ch12/jjs_1202/
4
7
 
5
8
  random の方は、内部で使っている Random クラスは疑似乱数で、適切なシードで初期化しないと毎回同じ値が出るかもしれません。(確認していません。)
6
9
 

1

追加

2024/11/15 03:22

投稿

jimbe
jimbe

スコア13170

test CHANGED
@@ -1,4 +1,21 @@
1
1
  doGet を実行する度に、 count も result も、ついでに random も作り直しているように見えますけども。
2
2
  CountBean の初期値は 0 ですから、いくらやっても 2 以上にはならないのではないでしょうか。
3
+ セッションに該当オブジェクトがあったらそれを取り出して使うようにする必要があるでしょう。
3
4
 
4
5
  random の方は、内部で使っている Random クラスは疑似乱数で、適切なシードで初期化しないと毎回同じ値が出るかもしれません。(確認していません。)
6
+
7
+ 蛇足ながら…
8
+ CountBean の
9
+ ```java
10
+ public int getCount() {
11
+ count++;
12
+ return count;
13
+ }
14
+ public int ResultCount() {
15
+ return count;
16
+ }
17
+ ```
18
+ の各々のメソッド名は、
19
+ getCount → incrementCount
20
+ ResultCount → getCount
21
+ が適切ではないでしょうか。