美文网首页
一次成功的Struts2尝试

一次成功的Struts2尝试

作者: 12Dong | 来源:发表于2018-02-01 20:16 被阅读0次

    今天 下午试了一下午 总算在排除一些错误 之后 总算成功了
    这次同样是 基于之前的那个留言板项目 只不过 把控制流程的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>密&nbsp;&nbsp;码<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有问题

    相关文章

      网友评论

          本文标题:一次成功的Struts2尝试

          本文链接:https://www.haomeiwen.com/subject/xfrjzxtx.html