今天 下午試了一下午 總算在排除一些錯(cuò)誤 之后 總算成功了
這次同樣是 基于之前的那個(gè)留言板項(xiàng)目 只不過 把控制流程的servlet 換成由struts支配的java類
先看結(jié)構(gòu)圖

action 是 struts實(shí)現(xiàn)的java 類 用來控制流程
jdbc 如字面意思 是 jdbc操控類
model.vo是用來記錄信息的類 在這次項(xiàng)目中 lyTable沒有用到
struts.xml 是用來配置struts類的 就像servlet里的web.xml配置servlet類一樣
web用來存放jsp
jdbc 和 model.vo中的類與error.jsp 與之前一樣 便不細(xì)說了
下面 同樣 從進(jìn)入的頁面開始一個(gè)一個(gè)分析
login.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<%--
Struts標(biāo)簽類 要使用標(biāo)簽類的話 必須加著行
--%>
<%@ page contentType="text/html;charset=gb2312" language="java" %>
<html>
<head>
<title>簡易留言板</title>
</head>
<body>
<s:form action="main" method="post" theme="simple">
<%--
這里就和servlet類不同了 這里直接使用了標(biāo)簽類 而而沒有使用 input按鈕
他把table中收集到的信息送到 用 MainAction類實(shí)現(xiàn)的main里面去
--%>
<table>
<caption>用戶登陸</caption>
<tr>
<td>用戶名:<s:textfield name="user.username" size="20"/></td>
</tr>
<tr>
<td>密 碼<s:password name="user.password" size="21"/></td>
</tr>
<tr>
<td>
<s:submit value="登錄"/>
<s:reset value="重置"/>
</td>
</tr>
</table>
</s:form>
如果沒有注冊(cè)單機(jī)<a href="">這里</a>注冊(cè)!
</body>
</html>
/*
MainAction.java
用來控制程序流程 也叫控制器 處理深層業(yè)務(wù)邏輯
*/
package org.easybooks.test.action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.*;
import org.easybooks.test.jdbc.SqlSrvDBConn;
import org.easybooks.test.model.vo.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
public class MainAction extends ActionSupport {
private UserTable user;
public String execute() throws Exception {
String username = user.getUsername();
String password = user.getPassword();
boolean validated = false;
SqlSrvDBConn sqlSrvDBConn = new SqlSrvDBConn();
ActionContext context = ActionContext.getContext();
Map session = context.getSession(); //獲得會(huì)話對(duì)象 用來保存當(dāng)前登錄用戶的信息
UserTable user1 = null;
//先獲得UserTable對(duì)象 如果是第一次訪問該頁 用戶對(duì)象 肯定為空 但是 如果是 第二次甚至
// 第三次 就直接登錄 主頁 而無須 再次驗(yàn)證用戶的信息
// 同 talkboard 原因 只是 實(shí)現(xiàn)方法不同 servlet 和 jsp
// servlet 是 Httpsession session = request.getSession();
user1 = (UserTable) session.get("user"); // servlet 是 getAttribut()
if (user1 == null) {
//查詢 userTable 表中 的記錄
String sql = "select * from usertable";
ResultSet rs = sqlSrvDBConn.executeQuery(sql);
try {
while (rs.next()) {
if (rs.getString("username").trim().compareTo(username) == 0 &&
rs.getString("password").trim().compareTo(password) == 0) {
user1 = new UserTable();// 創(chuàng)建持久化 的 JavaBean對(duì)象
user1.setId(rs.getInt("id"));
user1.setUsername(rs.getString("username"));
user1.setPassword(rs.getString("password"));
session.put("user", user1); // servlet session.setAttribute()
if(session.get("user")==null)System.out.println("The error is null ");
else System.out.println("There is not error");
validated = true;
}
}
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
sqlSrvDBConn.closeStmt();
sqlSrvDBConn.closeConn();
} else {
validated = true;
}
if (validated) {
return "success";
} else {
return "error";
}
}
public UserTable getUser() {
return user;
}
public void setUser(UserTable user){
this.user = user;
}
}
這里比原本的MainServlet類多了 getter()和setter()方法 原因是待會(huì)使用標(biāo)簽類從session調(diào)UserTable類的時(shí)候 默認(rèn)是 使用getter()函數(shù) 調(diào) 如果將getter()函數(shù)去除
剛剛login.jsp中的 textfield 和 password兩個(gè)地方
user.username
user.password
就會(huì)報(bào)紅
<%--
main.jsp
登陸成功后 顯示信息頁面
--%>
<%@ page contentType="text/html;charset=gb2312" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>留言板信息</title>
</head>
<body>
<s:set name="user" value="#session['user']"/>
<s:if test='user==null'>
user is null
</s:if>
<s:else>
user not null
</s:else>
<s:property value="#user.username"/>, 你好!歡迎登錄留言板.
</body>
</html>
呃 其實(shí)這里 就是 我今天大概調(diào)試了 兩個(gè)小時(shí)的地方
一開始 在
<s:set name="user" value="#session['user']"/>
<s:property value="#user.username"/>, 你好!歡迎登錄留言板.
給我報(bào)了 warning 我一想 報(bào)了就報(bào)了 反正只是warning而已 然后就炸了
沒有將session中的屬性調(diào)出來
然后debug根據(jù) 報(bào)的錯(cuò)誤信息
empty tag doesn‘t work in some browers
想了一下 大概是 沒有找到 標(biāo)簽庫 然后 加了
<%@ taglib prefix="s" uri="/struts-tags"%>
依舊 報(bào)warning 試了一下依然錯(cuò)
然后 一步步 debug 既然是 empty 那么 可能 這個(gè)屬性為空 那我再 action放進(jìn)去之后 又測了一遍 成功 證明 不是 action的問題 那么就可能是 struts.xml 和 main.jsp的問題
接著 測試了 大概半個(gè)小時(shí) 查了不少資料 struts.xml也被證明沒錯(cuò)
呃 然后 我細(xì)細(xì)想了一下 原來多加了一個(gè)空格
我原本寫的是
<s :set name="user" value="#session['user']"/>
呃 比較難過 下次注意... ...
展示一下結(jié)構(gòu) 基本上和 原本 留言板的頁面差不多


user not null 是我測試 究竟是 從session調(diào)UserTable有問題 還是從UserTable里調(diào)username有問題