学jsp都时候知道tomcat有一个seesion的经典例子,猜数字。
tomcat 中有源码,JavaBean源码NumberGuessBean.java代码如下:
package num;
import java.io.Serializable;
import java.util.Random;
public class NumberGuessBean implements Serializable {
private static final long serialVersionUID = 1L;
private int answer;
private String hint;
private int numGuesses;
private boolean success;
private Random random = new Random();
public NumberGuessBean() {
reset();
}
public int getAnswer() {
return answer;
}
public void setAnswer(int answer) {
this.answer = answer;
}
public String getHint() {
return "" + hint;
}
public void setHint(String hint) {
this.hint = hint;
}
public void setNumGuesses(int numGuesses) {
this.numGuesses = numGuesses;
}
public int getNumGuesses() {
return numGuesses;
}
public boolean getSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public void setGuess(String guess) {
numGuesses++;
int g;
try {
g = Integer.parseInt(guess);
} catch (NumberFormatException e) {
g = -1;
}
if (g == answer) {
success = true;
} else if (g == -1) {
hint = "a number next time";
} else if (g < answer) {
hint = "higher";
} else if (g > answer) {
hint = "lower";
}
}
public void reset() {
answer = Math.abs(random.nextInt() % 100) + 1;
success = false;
numGuesses = 0;
}
}
JSP源码numguess.jsp代码如下:
<%@ page import = "num.NumberGuessBean" %>
<jsp:useBean id="numguess" class="num.NumberGuessBean" scope="session"/>
<jsp:setProperty name="numguess" property="*"/>
<html>
<head><title>Number Guess</title></head>
<body bgcolor="white">
<font size=4>
<% if (numguess.getSuccess()) { %>
Congratulations! You got it.
And after just <%= numguess.getNumGuesses() %> tries.<p>
<% numguess.reset(); %>
Care to <a href="numguess.jsp">try again</a>?
<% } else if (numguess.getNumGuesses() == 0) { %>
Welcome to the Number Guess game.<p>
I'm thinking of a number between 1 and 100.<p>
<form method=get>
What's your guess? <input type=text name=guess>
<input type=submit value="Submit">
</form>
<% } else { %>
Good guess, but nope. Try <b><%= numguess.getHint() %></b>.
You have made <%= numguess.getNumGuesses() %> guesses.<p>
I'm thinking of a number between 1 and 100.<p>
<form method=get>
What's your guess? <input type=text name=guess>
<input type=submit value="Submit">
</form>
<% } %>
</font>
</body>
</html>
仿照tomcat 我写了一个node.jsp版本,也用到了node.js module的写法。
仿照bean的NumberGuess.js 代码如下
var NumberGuess = exports.NumberGuess = function(guessObj){
if(! guessObj){
this.answer=0;
this.hint='';
this.numGuesses=0;
this.success=false;
this.reset();
}else{
this.answer=guessObj.answer;
this.hint=guessObj.hint;
this.numGuesses=guessObj.numGuesses;
this.success=guessObj.success;
}
}
NumberGuess.prototype.setGuess=function(guess) {
this.numGuesses++;
var g;
if(! isNaN(guess)){
g=guess;
} else {
g=-1;
}
if (g == this.answer) {
this.success = true;
} else if (g == -1) {
this.hint = 'a number next time';
} else if (g < this.answer) {
this.hint = 'higher';
} else if (g > this.answer) {
this.hint = 'lower';
}
};
NumberGuess.prototype.reset=function() {
this.answer = Math.floor(Math.random() * 100) + 1;
this.success = false;
this.numGuesses = 0;
};
仿照jsp的guess.js代码如下:
var connect = require('connect');
var NumberGuess = require('./NumberGuess.js').NumberGuess;
var server = connect.createServer();
server.use(connect.cookieParser());
server.use(connect.session({ secret: 'keyboard cat'}));
server.use(connect.query());
server.use(function(req, res){
var sess = req.session;
if (! sess.guessObj) {
sess.guessObj = new NumberGuess();
} else {
//self.sessions[sid] = JSON.stringify(sess);
//sess = self.sessions[sid]; sess = JSON.parse(sess)
//只序列化数据,反序列化js无类型信息,不能和java一样
sess.guessObj = new NumberGuess(sess.guessObj);
}
var guess = req.query.guess;
if(guess){
sess.guessObj.setGuess(guess);
}
var result = '<html>'
+'<head><title>Number Guess</title></head>'
+'<body bgcolor="white">'
+'<font size=4>';
if (sess.guessObj.success) {
result += 'Congratulations! You got it.'
+ 'And after just '+sess.guessObj.numGuesses +' tries.<p>'
+' Care to <a href=".">try again</a>?';
sess.guessObj.reset();
} else if (sess.guessObj.numGuesses == 0) {
result += 'Welcome to the Number Guess game.<p>'
+'I\'m thinking of a number between 1 and 100.<p>'
+ '<form method="get">'
+'What\'s your guess? <input type="text" name="guess">'
+'<input type="submit" value="Submit">'
+'</form>';
} else {
result += 'Good guess, but nope. Try <b>'+sess.guessObj.hint+'</b>.'
+'You have made '+sess.guessObj.numGuesses+' guesses.<p>'
+'I\'m thinking of a number between 1 and 100.<p>'
+'<form method="get">'
+'What\'s your guess? <input type=text name=guess>'
+'<input type="submit" value="Submit">'
+'</form>';
}
result += '</font></body></html>';
res.setHeader('Content-Type', 'text/html');
res.write(result);
res.end();
});
server.listen(8080);
console.log('127.0.0.1:8080')
在命令行中输入node guess.js
在浏览器地址栏中输入 http://localhost:8080/,效果如下:
试试自己的运气吧,我的运气不好就不试了,这个大家应该都玩过,我就不继续截图了。
这个有点硬套,主要是试试connect对session的支持。
//self.sessions[sid] = JSON.stringify(sess);
//sess = self.sessions[sid]; sess = JSON.parse(sess)
//只序列化数据,反序列化js无类型信息,不能和java一样
这段注释注意一下,这个知识点我搞了半天,我没想到。