SSH入门项目-3-第一个小功能

创建一个用户表

1,建表

drop table if exists USER_P;

/*==============================================================*/
/* Table: USER_P                                                */
/*==============================================================*/
create table USER_P
(
   USER_ID              VARCHAR(40) not null,
   DEPT_ID              VARCHAR(40),
   USER_NAME            VARCHAR(50) comment '不能重复,可为中文',
   PASSWORD             VARCHAR(64) comment 'shiro MD5密码32位',
   STATE                INT comment '1启用0停用',
   CREATE_BY            VARCHAR(40) comment '登录人编号',
   CREATE_DEPT          VARCHAR(40) comment '登录人所属部门编号',
   CREATE_TIME          TIMESTAMP,
   UPDATE_BY            VARCHAR(40),
   UPDATE_TIME          TIMESTAMP,
   primary key (USER_ID)
);

alter table USER_P add constraint FK_Reference_24 foreign key (DEPT_ID)
      references DEPT_P (DEPT_ID) on delete restrict on update restrict;

很多设计原理我就不听了,由于我没听,所以也不写了。

2,日常改错

如果你的数据库是MySQL5.7,可能会报和我一样的错误,那就是UPDATE_DATE这个字段的问题,解决办法找到mysql的启动文件
这里写图片描述
然后改成下面的内容

sql_mode=
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

我这的环境是windows的,关于Linux的,如果最后我搭到虚拟机上的话可能再说。

框架运作流程

在这我就不一个一个找了,我学习的这个视频提供了这个资料,是由老师课上画的图,比我想的好多了。

1,index.jsp页面加载的过程

这里写图片描述

2,index.jsp加载过程之二

这里写图片描述

做个部门管理小功能

1,编写Web工程下的action

package com.liuyang19900520.liussh.action.sysadmin;

import com.liuyang19900520.liussh.action.BaseAction;
import com.liuyang19900520.liussh.domain.Dept;
import com.liuyang19900520.liussh.utils.Page;
import com.opensymphony.xwork2.ModelDriven;

/**
 * 部门管理Action
 * 
 * @author liuya
 *
 */
public class DeptAction extends BaseAction implements ModelDriven<Dept> {

    private Dept model = new Dept();

    @Override
    public Dept getModel() {
        return model;
    }

    // 分页组件
    private Page page = new Page();

    public Page getPage() {
        return page;
    }

    public void setPage(Page page) {
        this.page = page;
    }

    // 注入DeptService

}

到注入Service的时候,我们转过去做Service

2,Service的工程

2.1,Service中创建接口
package com.liuyang19900520.liussh.service;

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

import com.liuyang19900520.liussh.domain.Dept;
import com.liuyang19900520.liussh.utils.Page;

public interface DeptService {
    //查询所有,带条件查询
        public  List<Dept> find(String hql, Class<Dept> entityClass, Object[] params);
        //获取一条记录
        public  Dept get(Class<Dept> entityClass, Serializable id);
        //分页查询,将数据封装到一个page分页工具类对象
        public  Page<Dept> findPage(String hql, Page<Dept> page, Class<Dept> entityClass, Object[] params);

        //新增和修改保存
        public  void saveOrUpdate(Dept entity);
        //批量新增和修改保存
        public  void saveOrUpdateAll(Collection<Dept> entitys);

        //单条删除,按id
        public  void deleteById(Class<Dept> entityClass, Serializable id);
        //批量删除
        public  void delete(Class<Dept> entityClass, Serializable[] ids);

}
2.2,Service中实现类

在这个阶段,由于我们只在dao层做了一个baseDao,也就是说我们只要把这个baseDao注入进来即可,增加set方法。

package com.liuyang19900520.liussh.service.impl;

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

import com.liuyang19900520.liussh.dao.BaseDao;
import com.liuyang19900520.liussh.domain.Dept;
import com.liuyang19900520.liussh.service.DeptService;
import com.liuyang19900520.liussh.utils.Page;

public class DeptServiceImpl implements DeptService {

    private BaseDao baseDao;

    public void setBaseDao(BaseDao baseDao) {
        this.baseDao = baseDao;
    }

    @Override
    public List<Dept> find(String hql, Class<Dept> entityClass, Object[] params) {
        return baseDao.find(hql, entityClass, params);
    }

    @Override
    public Dept get(Class<Dept> entityClass, Serializable id) {
        return baseDao.get(entityClass, id);
    }

    @Override
    public Page<Dept> findPage(String hql, Page<Dept> page, Class<Dept> entityClass, Object[] params) {
        return baseDao.findPage(hql, page, entityClass, params);
    }

    @Override
    public void saveOrUpdate(Dept entity) {
        baseDao.saveOrUpdate(entity);

    }

    @Override
    public void saveOrUpdateAll(Collection<Dept> entitys) {
        baseDao.saveOrUpdateAll(entitys);
    }

    @Override
    public void deleteById(Class<Dept> entityClass, Serializable id) {
        baseDao.deleteById(entityClass, id);
    }

    @Override
    public void delete(Class<Dept> entityClass, Serializable[] ids) {
        baseDao.delete(entityClass, ids);
    }

}
2.3配置service的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans    
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    
    http://www.springframework.org/schema/aop    
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd    
    http://www.springframework.org/schema/tx    
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd    
    http://www.springframework.org/schema/context    
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <bean id="deptService" class="com.liuyang19900520.liussh.service.impl.DeptServiceImpl">
        <property name="baseDao" ref="baseDao"></property>
    </bean>

</beans>

3,继续返回Web工程下进行action的编写。

3.1,注入service。
// 注入DeptService
    private DeptService deptService;
    public void setDeptService(DeptService deptService) {
        this.deptService = deptService;
    }
3.2,配置分页组件
/**
     * 配置分页组件
     * @return 分页地址
     * @throws Exception
     */
    public String list() throws Exception {
        //page对象不用接。因为page传递的是类对象数组,属于永用数据类型。
        deptService.findPage("form Dept", page, Dept.class, null);
        //纸质分页的url地址
        page.setUrl("deptAction_list");

        return "list";
    }

再写3.3之前真的要吐槽一下csdn,特别打击人的积极性。因为保存的草稿总是保存不上,导致这块写了好几次。

3.3,配置Spring的application-action
<bean id="deptAction" class="com.liuyang19900520.liussh.action.sysadmin.DeptAction"
        scope="prototype">
        <property name="deptService" ref="deptService"></property>
    </bean>
3.4,配置Sturts2的配置文件,做到配置文件分离

这里写图片描述

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <constant name="struts.ui.theme" value="simple" />
    <constant name="struts.devMode" value="true" />
    <constant name="struts.i18n.encoding" value="UTF-8" />

    <!-- struts2 包名是唯一的 -->
    <package name="sysadmin" namespace="/sysadmin" extends="struts-default">
        <action name="deptAction_*" class="deptAction" method="{1}">
            <!-- 转发是服务器行为, 重定向是客户端行为 ,转发服务器地址也不显示出来任何的不同,客户不知道服务器行为-->
            <result name="list">/WEB-INF/pages/sysadmin/user/jUserList.jsp
            </result>
        </action>
    </package>
</struts>
3.5,扩展一下baseAction,将page对象压入栈顶。

在DeptAction中就添加这么一句,baseAction中的内容可以参见GitHub

//将page对象亚茹栈顶
        super.push(page);

4,写jsp文件

5,造数据

--DROP TABLE dept_p;

CREATE TABLE dept_p (
  DEPT_ID varchar2(40) PRIMARY KEY NOT NULL,
  DEPT_NAME varchar2(40) default NULL,
  PARENT_ID varchar2(40) default NULL,
  STATE number(11) default NULL
);

comment on column dept_p.STATE is '1代表启用,0代表停用,默认为1';

insert into dept_p
  (DEPT_ID, DEPT_NAME, PARENT_ID, STATE)
values
  ('100', '杰信商贸集团', NULL, 1);
insert into dept_p
  (DEPT_ID, DEPT_NAME, PARENT_ID, STATE)
values
  ('3d00290a-1af0-4c28-853e-29fbf96a2722', '市场部', '100', 1);
insert into dept_p
  (DEPT_ID, DEPT_NAME, PARENT_ID, STATE)
values
  ('4028827c4fb6202a014fb6209c730000', '杰信总裁办', NULL, 1);
insert into dept_p
  (DEPT_ID, DEPT_NAME, PARENT_ID, STATE)
values
  ('4028827c4fb633bd014fb64467470000', '杰信', NULL, NULL);
insert into dept_p
  (DEPT_ID, DEPT_NAME, PARENT_ID, STATE)
values
  ('4028827c4fb645b0014fb64668550000',
   '船运部cgx',
   '4028827c4fb6202a014fb6209c730000',
   1);
insert into dept_p
  (DEPT_ID, DEPT_NAME, PARENT_ID, STATE)
values
  ('73f3fa2f-66a2-4d16-8306-78d89003031b', '网络部', '100', 1);
insert into dept_p
  (DEPT_ID, DEPT_NAME, PARENT_ID, STATE)
values
  ('97f88a8c-90fc-4d52-aed7-2046f62fb498', '总经办', '100', 1);
insert into dept_p
  (DEPT_ID, DEPT_NAME, PARENT_ID, STATE)
values
  ('aeb1c7d3-9a54-4f73-b0ec-0325b83aef45', '船运部', '100', 1);

运行与日常改错

1,Hibernate创建问题

这里写图片描述
这个错看了好就,发现是卡在创建hql语句语句上了。

Query query = this.getSession().createQuery(hql);

经过了很久,原来action中的“from”写成了“form”。尴尬。

2,jsp找不到属性问题

这里写图片描述
这个问题就简单多了,应该是action定位错了,果然之前定位到userlist中。

最后,勉强是看到内容了。小功能代表基本的内容调通了。
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值