一、搭建ssh环境

先准备好

SSH实现 crm系统_hibernate

新建项目-》导入jar(lib中)-》复制粘贴配置文件(hmb.xml除外)-》适当修改eg:数据库名称 然后建立数据库-》复制粘贴UI界面-》启动服务器-》访问测试

create database crmsx;

SSH实现 crm系统_java_02

建立数据库表,然后根据表写javabean:

CREATE TABLE `sys_user` (
`user_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`user_code` varchar(32) NOT NULL COMMENT '用户账号',
`user_name` varchar(64) NOT NULL COMMENT '用户名称',
`user_password` varchar(32) NOT NULL COMMENT '用户密码',
`user_state` char(1) NOT NULL COMMENT '1:正常,0:暂停',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

写javabean(还是先建立包吧,省得弄混了)

SSH实现 crm系统_hibernate_03

立刻编写类的配置文件 现在可以复制hbm.xml来修改了

User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 约束 使有提示 -->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.ahpu.domain.User" table="sys_user">
<!-- java主键属性与表的主键列名对应 native表示主键自动递增
重要总结: 主键为short,int,long用 native
主键char,varchar类型 即随机字符串用:uuid
-->
<id name="user_id" column="user_id">
<generator class="native"/>
</id>

<!-- 其他非主键属性对应的配置 name为类属性名 column为表列名-->
<property name="user_code" column="user_code"/>
<property name="user_name" column="user_name"/>
<property name="user_password" column="user_password"/>
<property name="user_state" column="user_state"/>

</class>
</hibernate-mapping>

立刻加载到appxml的sessionFactory中:

SSH实现 crm系统_java_04

编写UserAction继承ActionSupport 实现ModelDriven<User> 写好模型驱动   ★千万记得model自己new★

return user尽然还忘记写了,后面测试输出user时才发现,可见实时测试多么重要

SSH实现 crm系统_java_05

立刻到appxml里配置action(多例) -》struts.xml里配置

applicationContext.xml:

SSH实现 crm系统_xml_06

struts.xml:

SSH实现 crm系统_hibernate_07

启动tomcat测试运行一下  :​​http://localhost:8080/crm/user_regist.action​

SSH实现 crm系统_hibernate_08

正常,接着往下

写service   serviceImpl一写好,就立刻把事务注解加上(最简单的添加事务的方法)

SSH实现 crm系统_xml_09

action注入service准备

SSH实现 crm系统_xml_10

配置service,并注入到action

SSH实现 crm系统_hibernate_11

重启服务器,测试运行:​​http://localhost:8080/crm/user_regist.action​

SSH实现 crm系统_xml_12

正常,接着往下

写dao

注意实现类继承HibernateDaoSupport

SSH实现 crm系统_hibernate_13

service注入dao准备工作

SSH实现 crm系统_java_14

appxml里配置dao(注入sessionFactory 自动有hibernateTemplate了) 并将dao注入到servies

SSH实现 crm系统_hibernate_15

重启服务器,测试运行:​​http://localhost:8080/crm/user_regist.action​

SSH实现 crm系统_java_16

(注意add是个测试方法,最好一定写着,多余就多余  但很好 调用正常心里才有底  有事还可以改下名字变成其他方法)

正常,接着往下

修改前端:regist.jsp

SSH实现 crm系统_hibernate_17

删掉onsubmit,改action

SSH实现 crm系统_xml_18

SSH实现 crm系统_hibernate_19

action加一行,重启:

SSH实现 crm系统_hibernate_20

测试:

SSH实现 crm系统_xml_21

SSH实现 crm系统_java_22

有问题:原来getModel的return user忘记写了;

改完重启:

SSH实现 crm系统_java_23

成功获取数据,接着往下:

SSH实现 crm系统_xml_24

登录名文本框失去焦点要验证是否为空

登录名文本框不为空要发送ajax验证是否重复

SSH实现 crm系统_xml_25

UserAction里写checkCode方法,返回一个值测试下:(一旦写java代码就把tomcat关掉) (ctrl+T显示接口所有的实现类)

UserAction.java
    //System.out.println(user.getUser_code());
    User u= service.checkCode(user.getUser_code());
UserService.java
    public User checkCode(String user_code);
UserServiceImpl.java
    public User checkCode(String user_code) {
        return dao.checkCode(user_code);
    }
UserDao.java
    public User checkCode(String user_code);
UserDaoImpl.java
    public User checkCode(String user_code) {
        //虽然条件查询 但是简单条件HQL比较方便    find/save/update都是HQL查询 写HQL语句即可
        List<User> list = (List<User>) this.getHibernateTemplate().find("from User where user_code=?", user_code);
        if(list!=null&&list.size()>0){
            return list.get(0);
        }
        return null;
    }

UserAction.java
    public String checkCode(){
        //由于ajax传的json格式为{"user_code":code} 相当于name="user_code" value=code 其他值为空 
        //于是直接就封装到user.user_code里了
        //System.out.println(user.getUser_code());
        User u= service.checkCode(user.getUser_code());

        //返回ajax比较麻烦 response写  写之前一定设置编码★
        HttpServletResponse response = ServletActionContext.getResponse();
        response.setContentType("text/html;charset=UTF-8");
        try {
            PrintWriter writer = response.getWriter();
            if(u!=null){
                //查到了用户 说明 user_code(此ajax登录名)已经存在
                writer.print("no");
            }else{
                writer.print("yes");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return NONE;//返回ajax可不是转发  一转发页面可就刷新了 
    }

SSH实现 crm系统_java_26

启动服务器测试一下:

SSH实现 crm系统_hibernate_27

SSH实现 crm系统_java_28

成功,接着往下:

文本框的信息不合法时要阻止表单提交

给form加个οnsubmit="return checkForm()"事件

然后写个checkForm方法,提交前执行checkForm方法,只有checkForm返回true才能提交表单

SSH实现 crm系统_xml_29

具体逻辑如下:

SSH实现 crm系统_hibernate_30

刷新测试:

SSH实现 crm系统_hibernate_31

正常,接着完成登录密码与用户姓名框的合法性检查(没有ajax了)

SSH实现 crm系统_java_32

测试正常接着:

写action的regist方法,保存用户到数据库

除了web层方法名都改为save吧:

UserAction.java
    public String regist(){
        service.save(user);
        return NONE;
    }
UserService.java  
    public void save(User user);//可以改下regist方法名
UserServiceImpl.java //类上面一定加事务 否则只读缓存,提交不了!
    public void save(User user) {
        //密码加密
        String pwd = user.getUser_password();
        user.setUser_password(MD5Utils.md5(pwd));
        //状态默认为1
        user.setUser_state("1");
        //调用dao保存新用户
        dao.save(user);
    }
UserDao.java
    public void save(User user);//可以改下regist方法名
UserDaoImpl.java
    public void save(User user) {
        this.getHibernateTemplate().save(user);//和基本session.save()一样简单  spring封装了一下而已
    }

service一定要加事务,否则只读缓存,提交成功不了!昨天的问题似乎就在这

接着action:

SSH实现 crm系统_hibernate_33

struts.xml配置跳转

跳转到login.jsp太普遍,于是配置一个全局的(action外 package内配)

SSH实现 crm系统_hibernate_34

login.jsp加一行:

SSH实现 crm系统_xml_35

测试:

SSH实现 crm系统_java_36

SSH实现 crm系统_hibernate_37

测试发现刷新会重复提交,导致数据库用户登录名相同,为hza    则每次注册前检查一下,最安全方便

SSH实现 crm系统_hibernate_38

成功,接着往下:

实现登录:

修改前端:login.jsp

SSH实现 crm系统_hibernate_39

SSH实现 crm系统_java_40

UserAction.java
public String login(){
        User exitUser=service.login(user);
        if(exitUser!=null){
            //登录成功  记得放入session
            ServletActionContext.getRequest().getSession().setAttribute("exitUser", exitUser);
            return "loginOK";
        }else{
            //查不到 登录失败
            ValueStack vs = ActionContext.getContext().getValueStack();
            vs.set("msg", "用户名或密码错误!");
            return LOGIN;            
        }
    }
UserServiceImpl.java
    public User login(User user) {
        String pwd = user.getUser_password();
        user.setUser_password(MD5Utils.md5(pwd));
        //查询
        return dao.login(user);
    }
UserDaoImpl.java
    public User login(User user) {
        //QBC查询                                            //User写成Use了 还不报错....唉!
        DetachedCriteria criteria = DetachedCriteria.forClass(User.class);//没有直接的session了 只好离线条件查询对象  
        criteria.add(Restrictions.eq("user_code", user.getUser_code()));
        criteria.add(Restrictions.eq("user_password", user.getUser_password()));
        criteria.add(Restrictions.eq("user_state", "1"));//必须是活的用户
        //开始查询
        List<User> list = (List<User>) this.getHibernateTemplate().findByCriteria(criteria);
        if(list!=null&&list.size()>0){
            return list.get(0);
        }
        return null;
    }

struts.xml

SSH实现 crm系统_xml_41

 

后面的都差不多了。。。

top.jsp

SSH实现 crm系统_java_42

 

安全退出:  top.jsp

SSH实现 crm系统_java_43

UserAction

SSH实现 crm系统_hibernate_44

都很简单了