创建一个用户表
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中。
最后,勉强是看到内容了。小功能代表基本的内容调通了。