今天 下午试了一下午 总算在排除一些错误 之后 总算成功了
这次同样是 基于之前的那个留言板项目 只不过 把控制流程的servlet 换成由struts支配的java类
先看结构图
结构图
action 是 struts实现的java 类 用来控制流程
jdbc 如字面意思 是 jdbc操控类
model.vo是用来记录信息的类 在这次项目中 lyTable没有用到
struts.xml 是用来配置struts类的 就像servlet里的web.xml配置servlet类一样
web用来存放jsp
jdbc 和 model.vo中的类与error.jsp 与之前一样 便不细说了
下面 同样 从进入的页面开始一个一个分析
login.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<%--
Struts标签类 要使用标签类的话 必须加着行
--%>
<%@ page contentType="text/html;charset=gb2312" language="java" %>
<html>
<head>
<title>简易留言板</title>
</head>
<body>
<s:form action="main" method="post" theme="simple">
<%--
这里就和servlet类不同了 这里直接使用了标签类 而而没有使用 input按钮
他把table中收集到的信息送到 用 MainAction类实现的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>
如果没有注册单机<a href="">这里</a>注册!
</body>
</html>
/*
MainAction.java
用来控制程序流程 也叫控制器 处理深层业务逻辑
*/
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(); //获得会话对象 用来保存当前登录用户的信息
UserTable user1 = null;
//先获得UserTable对象 如果是第一次访问该页 用户对象 肯定为空 但是 如果是 第二次甚至
// 第三次 就直接登录 主页 而无须 再次验证用户的信息
// 同 talkboard 原因 只是 实现方法不同 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();// 创建持久化 的 JavaBean对象
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()方法 原因是待会使用标签类从session调UserTable类的时候 默认是 使用getter()函数 调 如果将getter()函数去除
刚刚login.jsp中的 textfield 和 password两个地方
user.username
user.password
就会报红
<%--
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>
呃 其实这里 就是 我今天大概调试了 两个小时的地方
一开始 在
<s:set name="user" value="#session['user']"/>
<s:property value="#user.username"/>, 你好!欢迎登录留言板.
给我报了 warning 我一想 报了就报了 反正只是warning而已 然后就炸了
没有将session中的属性调出来
然后debug根据 报的错误信息
empty tag doesn‘t work in some browers
想了一下 大概是 没有找到 标签库 然后 加了
<%@ taglib prefix="s" uri="/struts-tags"%>
依旧 报warning 试了一下依然错
然后 一步步 debug 既然是 empty 那么 可能 这个属性为空 那我再 action放进去之后 又测了一遍 成功 证明 不是 action的问题 那么就可能是 struts.xml 和 main.jsp的问题
接着 测试了 大概半个小时 查了不少资料 struts.xml也被证明没错
呃 然后 我细细想了一下 原来多加了一个空格
我原本写的是
<s :set name="user" value="#session['user']"/>
呃 比较难过 下次注意... ...
展示一下结构 基本上和 原本 留言板的页面差不多
image.png image.png
user not null 是我测试 究竟是 从session调UserTable有问题 还是从UserTable里调username有问题
网友评论