Struts2学习之旅二(1) 基本的dao,tiles布局的应用,权限控制

1,有了struts2的基础知识之后,先来一个简单的后端dao,做一个CRUD,基本上初级程序员都要写一下这个;

 

搞一个用户管理的dao来练下手,先上实体图,如图1:

根据这个得到实体类:

接下来定义基本的CRUD接口:

使用easy-db实现db的操作;

复制代码
package com.cutter.web.account.dao.achieve;

import java.io.IOException;
import java.io.Reader;
import java.math.BigDecimal;
import java.net.URL;
import java.nio.CharBuffer;
import java.sql.Array;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.Date;
import java.sql.NClob;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.Ref;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.RowId;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.SQLXML;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

import org.apache.log4j.Logger;
import org.pureart.persistement.database.easydb.IUStH;
import org.pureart.persistement.database.easydb.ParamReadStH;
import org.pureart.persistement.database.easydb.ReadStH;
import org.pureart.persistement.database.easydb.DB;

import com.cutter.web.account.dao.entity.User;
import com.cutter.web.account.dao.inter.UserDao;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;

public class UserDaoAchieve extends BaseDaoAchieve<User> implements UserDao {

    private static final Logger log = Logger.getLogger(UserDaoAchieve.class);

    private static final String GETBYID_SQL = " SELECT * FROM dt_user WHERE id=? ;";

    private static final String DELETEBYID_SQL = " DELETE FROM dt_user WHERE id=? ;";

    private static final String LIST_ALL_SQL = " SELECT * FROM test.dt_user  ;";

    private static final String COUNT_ALL_SQL = " SELECT count(*) FROM dt_user  ;";

    private static final String LIST_ALL_BY_PAGE_SQL = " SELECT * FROM dt_user  LIMIT ?,? ;";

    private static final String ADD_USER_SQL = " INSERT INTO dt_user(userName,email,password,createDate,roleId) VALUES(?,?,?,?,?) ;";

    private static final String MODIFY_USER_SQL = " update dt_user set userName=? , email=? , password=? , createDate=? , roleId=? WHERE id=? ;";

    @Override
    public boolean update(final User entity) {
        try {
            if (entity.getId() > 0) {//更新
                return DB.insertUpdate(MODIFY_USER_SQL, new IUStH() {

                    @Override
                    public void handleInsertUpdate(PreparedStatement stmt) throws SQLException {
                        stmt.setString(1, entity.getUserName());
                        stmt.setString(2, entity.getEmail());
                        stmt.setString(3, entity.getPassword());
                        stmt.setDate(4, new Date(System.currentTimeMillis()));
                        stmt.setInt(5, entity.getRoleId());
                        stmt.setInt(6, entity.getId());
                        stmt.executeUpdate();

                    }
                });
            } else {//插入

                return DB.insertUpdate(ADD_USER_SQL, new IUStH() {

                    @Override
                    public void handleInsertUpdate(PreparedStatement stmt) throws SQLException {

                        stmt.setString(1, entity.getUserName());
                        stmt.setString(2, entity.getEmail());
                        stmt.setString(3, entity.getPassword());
                        stmt.setDate(4, new Date(System.currentTimeMillis()));
                        stmt.setInt(5, entity.getRoleId());

                        stmt.executeUpdate();

                    }
                });

            }
        } catch (SQLException e) {
            log.error("更新用户信息异常!");
            e.printStackTrace();
        }

        return false;
    }

    @Override
    public User get(final int id) {

        final User user = new User();
        try {
            DB.select(GETBYID_SQL, new ParamReadStH() {

                @Override
                public void handleRead(ResultSet rs) throws SQLException {
                    if (rs.next()) {
                        handleResult(rs, user);
                    }

                }

                @Override
                public void setParams(PreparedStatement stmt) throws SQLException {
                    stmt.setInt(1, id);
                }
            });

            return user;
        } catch (SQLException e) {
            log.error("查询用户信息异常!");
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public boolean delete(final int id) {

        try {
            return DB.insertUpdate(DELETEBYID_SQL, new IUStH() {

                @Override
                public void handleInsertUpdate(PreparedStatement stmt) throws SQLException {
                    stmt.setInt(1, id);
                    stmt.executeUpdate();
                }
            });
        } catch (SQLException e) {
            log.error("删除用户异常!");
            e.printStackTrace();
        }

        return false;
    }

    @Override
    public boolean batchDelete(final int[] idArray) {

        try {
            return DB.insertUpdate(DELETEBYID_SQL, new IUStH() {
                @Override
                public void handleInsertUpdate(PreparedStatement stmt) throws SQLException {
                    for (int id : idArray) {
                        stmt.setInt(1, id);
                        stmt.addBatch();
                    }
                    stmt.executeBatch();
                }
            });
        } catch (SQLException e) {
            log.error("批量删除用户信息异常!");
            e.printStackTrace();
        }

        return false;
    }

    @Override
    public ImmutableList<User> listAll() {

        try {
            final List<User> userList = Lists.newLinkedList();
            DB.select(LIST_ALL_SQL, new ReadStH() {

                @Override
                public void handleRead(ResultSet rs) throws SQLException {
                    while (rs.next()) {
                        User user = new User();
                        handleResult(rs, user);
                        userList.add(user);
                    }
                }
            });
            log.info(userList);
            return ImmutableList.copyOf(userList);
        } catch (SQLException e) {
            log.error("查询所有的用户异常!");
            e.printStackTrace();
        }

        return null;
    }

    @Override
    public ImmutableList<User> list(final int pageSize, final int page) {
        try {
            final List<User> userList = Lists.newLinkedList();
            DB.select(LIST_ALL_SQL, new ParamReadStH() {

                @Override
                public void handleRead(ResultSet rs) throws SQLException {
                    while (rs.next()) {
                        User user = new User();
                        handleResult(rs, user);
                        userList.add(user);
                    }
                }

                @Override
                public void setParams(PreparedStatement stmt) throws SQLException {
                    int start = pageSize * (page - 1);
                    int end = start + pageSize;
                    stmt.setInt(1, start);
                    stmt.setInt(2, end);

                }
            });

            return ImmutableList.copyOf(userList);
        } catch (SQLException e) {
            log.error("查询所有的用户异常!");
            e.printStackTrace();
        }

        return null;
    }

    private void handleResult(ResultSet rs, User user) throws SQLException {
        user.setId(rs.getInt("id"));
        user.setUserName(rs.getString("userName"));
        user.setEmail(rs.getString("email"));
        user.setPassword(rs.getString("password"));
        user.setCreateDate(rs.getDate("createDate"));
        user.setRoleId(rs.getInt("roleId"));
    }

    @Override
    public int getCount() {

        final AtomicInteger count = new AtomicInteger(0);
        try {
            DB.select(COUNT_ALL_SQL, new ReadStH() {

                @Override
                public void handleRead(ResultSet rs) throws SQLException {
                    if (rs.next()) {
                        count.lazySet(rs.getInt(1));
                    }

                }
            });
            return count.get();
        } catch (SQLException e) {
            log.error("查询用户的数量异常!");
            e.printStackTrace();
        }

        return 0;
    }

}
复制代码

 

action的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package com.cutter.web.account.action.user;
 
import java.util.Map;
 
import org.apache.log4j.Logger;
import org.apache.struts2.interceptor.RequestAware;
 
import com.cutter.web.account.dao.achieve.UserDaoAchieve;
import com.cutter.web.account.dao.entity.User;
import com.cutter.web.account.dao.inter.UserDao;
import com.opensymphony.xwork2.ActionSupport;
 
public class UserManagerAction extends ActionSupport implements RequestAware {
 
     
 
    private static final Logger log = Logger.getLogger(UserManagerAction.class);
 
    private User user;
 
    private int id;
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    private Map<String, Object> requestMap;
 
    final UserDao userDao = new UserDaoAchieve();
 
    public User getUser() {
        return user;
    }
 
    public void setUser(User user) {
        this.user = user;
    }
 
    public String listUser() throws Exception {
 
        requestMap.put("users", userDao.listAll());
 
        return SUCCESS;
    }
 
    public String addUser() {
 
        log.info("add传递过来的参数:" + user);
        userDao.update(user);
 
        return SUCCESS;
    }
 
    public String editUser() {
        log.info("edit传递过来的参数:" + user);
 
        userDao.update(user);
 
        return SUCCESS;
    }
 
    public String deleteUser() {
 
        log.info("传递过来的id:" + getId());
 
        userDao.delete(getId());
 
        return SUCCESS;
    }
 
    public String listUserByPage() {
 
        final UserDao userDao = new UserDaoAchieve();
 
        requestMap.put("users", userDao.listAll());
 
        return SUCCESS;
    }
 
    @Override
    public void setRequest(java.util.Map<String, Object> request) {
        requestMap = request;
    }
 
    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }
 
    public String editPage() throws Exception {
 
        requestMap.put("user", userDao.get(id));
        return SUCCESS;
    }
}

 

配置文件写法:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <package name="user" extends="struts-default" namespace="/account">
        <action name="login" class="com.cutter.web.account.action.user.LoginOutAction" method="index" >
            <result name="success">/manager/adminLogin.jsp</result>
        </action>
        <action name="loginSubmit" class="com.cutter.web.account.action.user.LoginOutAction" method="login">
            <result name="success">/manager/home.jsp</result>
            <result name="input">/manager/adminLogin.jsp</result>
        </action>
        <action name="addUserPage" class="com.cutter.web.account.action.user.UserManagerAction" method="execute">
            <result name="success">/manager/user/addList.jsp</result>
        </action>
        <action name="editUserPage" class="com.cutter.web.account.action.user.UserManagerAction" method="editPage">
            <result name="success">/manager/user/editList.jsp</result>
        </action>
        <action name="listUser" class="com.cutter.web.account.action.user.UserManagerAction" method="listUser">
            <result name="success"><!--  /manager/userManage/listUser.jsp-->
            /manager/user/userList.jsp
            </result>
        </action>
        <action name="deleteUser" class="com.cutter.web.account.action.user.UserManagerAction" method="deleteUser">
            <result type="redirectAction">listUser
            </result>
        </action>
        <action name="editUser" class="com.cutter.web.account.action.user.UserManagerAction" method="editUser">
            <result type="redirectAction">listUser
            </result>
        </action>
        <action name="addUser" class="com.cutter.web.account.action.user.UserManagerAction" method="addUser">
            <result type="redirectAction">listUser</result>
        </action>
         
    </package>
    
</struts>

 

暂时对struts2的标签不熟悉,这里使用基本的jsp标签来展示数据:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
    String path = request.getContextPath();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户列表</title>
</head>
<body>
 
    <a href="../account/addUserPage.do">增加用户</a>
    <br>
 
    <table width="100%" height="auto" border="2px" bordercolor="green">
        <tr>
            <td>id</td>
            <td>用户名</td>
            <td>密码</td>
            <td>邮箱</td>
            <td>创建日期</td>
            <td>角色</td>
            <td>编辑</td>
        </tr>
        <c:forEach var="user" items="${users}">
            <tr>
                <td>${user.id}</td>
                <td>${user.userName}</td>
                <td>${user.password}</td>
                <td>${user.email}</td>
                <td>${user.createDate}</td>
                <td>${user.roleId}</td>
                <td>
                <a href="../account/editUserPage.do?id=${user.id}">编辑</a>
                <a href="../account/deleteUser.do?id=${user.id}">删除</a>
                </td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

  

简单的实现了CRUD,效果如图:

 

2,tiles简单布局

打算先弄一个简单的后台模版出来,头尾和右侧导航是可以复用的,总体设计图如下:

 

后续接着写,先这样。

 

 

 

 

 

 

posted @   李福春  阅读(404)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示