纳税服务系统一【用户模块之简单增删改查】

318 阅读7分钟

tags: 纳税服务系统项目


前言

为了更好地掌握SSH的用法,使用一个纳税服务系统来练手.....搭建SSH框架环境在上一篇已经详细地说明了。blog.csdn.net/hon_3y/arti…

用户模块需求

拥有增删改查和导入导出到EXCEL的功能

这里写图片描述

添加用户:有了这个界面,我们就知道实体表的属性有什么了。

a


添加配置文件

每个模块都应该有自己的配置文件,这样的话就方便我们管理模块之间的功能,不用把所有的配置都写在总文件中。

因此,我们在user模块创建了一个user包,下面又创建了config包来管理配置文件

这里写图片描述

JavaBean与映射文件

JavaBean

根据上面需求要添加用户的属性,直接写就行了。


public class User implements Serializable {

    private String id;
    private String dept;
    private String account;
    private String name;
    private String password;

    private String headImg;
    private boolean gender;
    private String state;
    private String mobile;
    private String email;
    private Date birthday;
    private String memo;

    public static String USER_STATE_VALID = "1";//有效,
    public static String USER_STATE_INVALID = "0";//无效

    public User() {
    }

    public User(String id, String dept, String account, String name, String password, String headImg, boolean gender, String state, String mobile, String email, Date birthday, String memo) {
        this.id = id;
        this.dept = dept;
        this.account = account;
        this.name = name;
        this.password = password;
        this.headImg = headImg;
        this.gender = gender;
        this.state = state;
        this.mobile = mobile;
        this.email = email;
        this.birthday = birthday;
        this.memo = memo;
    }

	//各种setter和getter
}

User.hbm.xml

映射文件也非常简单,因为没有关联关系字段,直接写属性就行了。


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="zhongfucheng.user.entity.User" table="user">
		<id name="id" type="java.lang.String">
			<column name="id" length="32" />
			<generator class="uuid.hex" />
		</id>
		<property name="name" type="java.lang.String">
			<column name="name" length="20" not-null="true" />
		</property>
		<property name="dept" type="java.lang.String">
			<column name="dept" length="20" not-null="true" />
		</property>		
		<property name="account" type="java.lang.String">
			<column name="account" length="50" not-null="true" />
		</property>
		<property name="password" type="java.lang.String">
			<column name="password" length="50" not-null="true" />
		</property>
		<property name="headImg" type="java.lang.String">
			<column name="headImg" length="100" />
		</property>
		<property name="gender" type="java.lang.Boolean">
			<column name="gender" />
		</property>
		<property name="email" type="java.lang.String">
			<column name="email" length="50" />
		</property>
		<property name="mobile" type="java.lang.String">
			<column name="mobile" length="20" />
		</property>
		<property name="birthday" type="java.util.Date">
			<column name="birthday" length="10" />
		</property>
		<property name="state" type="java.lang.String">
			<column name="state" length="1" />
		</property>
		<property name="memo" type="java.lang.String">
			<column name="memo" length="200" />
		</property>
	</class>

</hibernate-mapping>
	

写完映射文件,记得要在Spring的总配置文件中读取映射文件...值得注意的是,用户模块专门用一个user包来管理下面的代码,这样好管理!

这里写图片描述


编写Dao

UserDao接口


/**
 * UserDao接口,继承着UserDao
 * */
public interface UserDao extends BaseDao<User> {

}

UserDaoImpl实现类

把UserDaoImple对象添加到IOC容器中管理

注意:因为我们在BaseDao中使用的是HibernateDaoSupport这个API,因此我们在UserDao中是需要在XML配置,注入SessionFactory的。

在总配置文件中是有专门注入SessionFactory的bean配置的


    <!-- 所有业务dao的parent -->
    <bean id="baseDao" abstract="true">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>


/**
 * 继承着BaseDaoImpl实现类,就有了CRUD的方法
 * 又实现了UserDao接口,那么UserDao接口就可以对User模块有相对应的补充
 *
 * */

public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao {



}

    <bean id="userDaoImpl" class="zhongfucheng.user.dao.impl.UserDaoImpl" parent="baseDao"></bean>
    <context:component-scan base-package="zhongfucheng.user"/>

  • 把user模块的spring配置文件添加到总配置文件中

    <!--这是user模块的配置文件-->
    <import resource="classpath:zhongfucheng/user/config/user-bean.xml"/>

编写Service

Service接口

/**
     * Created by ozc on 2017/5/23.
     */
    public interface UserService {
    
        //新增
        public void save(User user);
        //更新
        public void update(User user);
        //根据id删除O
        public void delete(Serializable id);
        //根据id查找
        public User findObjectById(Serializable id);
        //查找列表
        public List<User> findObjects();
    
    }


UserServiceImpl


package zhongfucheng.user.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import zhongfucheng.user.dao.UserDao;
import zhongfucheng.user.entity.User;
import zhongfucheng.user.service.UserService;

import java.io.Serializable;
import java.util.List;

/**
 * Created by ozc on 2017/5/23.
 */

@Service
public class UserServiceImpl implements UserService {


    @Qualifier("userDaoImpl")
    @Autowired
    private UserDao userDaoImpl;


    @Override
    public void save(User user) {
        userDaoImpl.save(user);
    }

    @Override
    public void update(User user) {
        userDaoImpl.update(user);
    }

    @Override
    public void delete(Serializable id) {

        userDaoImpl.delete(id);
    }

    @Override
    public User findObjectById(Serializable id) {
        return userDaoImpl.findObjectById(id);
    }

    @Override
    public List<User> findObjects() {
        return userDaoImpl.findObjects();
   
    }
}

UserAction

UserAction应该根据增删改查应该有这么几个方法:


/**
 * 1.提供新增页面
 * 2.确定新增用户方法
 * 3.提供修改页面
 * 4.确定修改用户方法
 * 5.删除用户
 * 6.批量删除用户
 * 7.提供列表展示页面
 *
 * */
package zhongfucheng.user.action;

import com.opensymphony.xwork2.ActionSupport;

/**
 * Created by ozc on 2017/5/23.
 */

/**
 * 1.提供新增页面
 * 2.确定新增用户方法
 * 3.提供修改页面
 * 4.确定修改用户方法
 * 5.删除用户
 * 6.批量删除用户
 * 7.提供列表展示页面
 *
 *
 * */
public class UserAction extends ActionSupport {

    public String listUI() {

        return null;
    }

    public String addUI() {

        return null;
    }
    public String editUI() {

        return null;
    }
    public String edit() {

        return null;
    }
    public String delete() {

        return null;
    }
    public String add() {

        return null;
    }

    public String deleteSelect() {
        
        return null;
    }

}

在Struts配置文件中配置



<?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-action" extends="struts-default" namespace="/user">
        <action name="user_*" class="zhongfucheng.user.action.UserAction" method="{1}">

        </action>

    </package>

</struts>
  • 添加user模块的Struts配置文件到总配置文件中

    <!--User模块-->
    <include file="zhongfucheng/user/config/user-struts.xml"/>


完成美工设计页面显示

对美工给的页面进行调整

导入到项目中:

这里写图片描述

我们发现在JSP页面中,以下的代码是经常会出现的,因此我们把它封装一下:

这里写图片描述

创建一个公共文件,封装经常用到的jsp页面:

这里写图片描述

要使用的地方,直接导入就行了:


<head>
    <%@include file="/common/header.jsp"%>
    <title>用户管理</title>
    
</head>

接下来只要对各个功能进行填充逻辑代码,就可以了。

添加用户UI


    public String addUI() {
        return "addUI";
    }

效果如图所示:我们的头像和角色先不做,把其他的先做了再看看。

这里写图片描述

确定添加用户

写上我们请求的路径:

这里写图片描述

    /*************注入Service************************/
    @Qualifier("userServiceImpl")
    @Autowired
    private UserService userServiceImpl;


    /************数据自动封装,给出setter和getter*************************/
    private User user;
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    /************得到Service返回的数据*************************/
    private List<User> userList;

    public String add() {
    userServiceImpl.save(user);

    //跳转到列表显示页面
    return "list";
    }

  • 配置跳转到列表显示页面的result【Action重定向的方式,防止刷新再次请求】


            <!--返回列表展示页面,重定向到列表展示-->
            <result name="list" type="redirectAction">
                <param name="actionName">user_listUI</param>
            </result>
  • 效果:下面的列表展示还没有做呢,但是添加用户的效果已经做出来了。

这里写图片描述


列表展示

    /************得到Service返回的数据*************************/
    //这里一定要给setter和getter方法,这样JSP才能够得到属性。不然就得不到了!!!我在这里弄了很久!!!!
    private List<User> userList;
    public List<User> getUserList() {
        return userList;
    }
    public void setUserList(List<User> userList) {
        this.userList = userList;
    }

    public String listUI() {
        userList = userServiceImpl.findObjects();

        return "listUI";

    }

JSP通过iterator得到数据,直接写就行了。因为Action中该属性有getter方法


        <s:iterator value="userList">
        <tr bgcolor="f8f8f8">
            <td align="center"><input type="checkbox" name="selectedRow" value="<s:property value="id"/> "/></td>
            <td align="center"><s:property value="name"/></td>
            <td align="center"><s:property value="account"/></td>
            <td align="center"><s:property value="dept"/></td>
            <td align="center"><s:property value="gender?'男':'女'"/></td>
            <td align="center"><s:property value="email"/></td>
            <td align="center">
                <a href="javascript:doEdit(<s:property value="id"/>)">编辑</a>
                <a href="javascript:doDelete(<s:property value="id"/>)">删除</a>
            </td>
        </tr>
        </s:iterator>

这里写图片描述


修改功能

这里写图片描述



    public String editUI() {

        //外边已经传了id过来了,我们要找到id对应的User
        if (user.getId() != null && user != null) {

            //直接获取出来,后面JSP会根据User有getter就能读取对应的信息!
            user = userServiceImpl.findObjectById(this.user.getId());
    }
        return "editUI";
    }

  • JSP修改用户的界面是不用显示id的,但是我们在修改用户的时候,是根据id来修改的。因此我们加入一个隐藏域

   <s:hidden name="user.id"/>

  • 指定处理的路径:

action="${basePath}user/user_edit.action"
  • 修改的方法:
    public String edit() {
        //Struts2会自动把JSP带过来的数据封装到User对象上
        if (user.getId() != null && user != null) {

            userServiceImpl.update(user);
        }
		
		//跳转回列表展示
        return "list";
    }


  • 效果:

这里写图片描述


删除功能

delete方法就非常简单了:


        function doDelete(id) {
            document.forms[0].action = "${basePath}user/user_delete.action?user.id="+id;
            document.forms[0].submit();
        }

    public String delete() {

        if (user.getId() != null && user != null) {
            userServiceImpl.delete(user.getId());
        }

        return "list";
    }

这里写图片描述


批量删除

这里写图片描述

响应点击事件:

        function doDeleteAll() {
            document.forms[0].action = "${basePath}user/user_deleteSelect.action";
            document.forms[0].submit();

        }

  • Action使用一个String[]接收复选框来过来的数据

    private String[] selectedRow;
    public String[] getSelectedRow() {
        return selectedRow;
    }
    public void setSelectedRow(String[] selectedRow) {
        this.selectedRow = selectedRow;
    }

    public String deleteSelect() {
        for (String s : selectedRow) {
            userServiceImpl.delete(s);
        }
        return "list";
    }
  • 效果:

这里写图片描述


总结

这一篇几乎都是我们经常用的知识点,只是CRUD而已了。

  • 如果在JSP某些代码有很多地方都能使用的话,那么我们可以把它抽取出来。

如果您觉得这篇文章帮助到了您,可以给作者一点鼓励