srm开发(基于ssh)(4)
1 input处理内容补充
-在struts2里面有错误处理机制,当上传文件超过默认的大小,自动返回结果input
-在struts.xml中配置input的返回结果
<!-- 配置input结果 -->
<result name="input">/jsp/error.jsp</result>
(2)当struts2自动返回input结果,出现错误,在配置input的页面中可以查看错误信息
-在配置的错误页面中,使用struts2标签可以查看错误信息
要求使用struts2标签库,添加如下所示:
<s:actionerror/>

客户拜访管理模块
1 什么是客户拜访
(1)客户:与公司有业务往来的
-比如传智播客的客户 有百度、阿里巴巴、新浪
(2)用户:可以使用系统的人
2 用户和客户关系
(1)用户和客户之间是拜访关系
(2)用户和客户是多对多关系
**一个用户可以拜访多个客户,一个客户可以被多个用户拜访
客户:百度、新浪
用户:小王、小宋
*小王 可以 拜访 百度、可以拜访新浪
*百度可以被小王拜访,可以被小宋拜访
(3)多对多建表
-创建第三张表,使用外键维护关系
3 之前在hibernate阶段学过多对多配置
(1)缺陷:第三张表只有两个字段(两个id值)
4 把多对多拆分成两个一对多实现
(1)用户、客户、拜访
(2)用户和拜访是一对多


配置和客户的关系
public class Visit {
private Integer vid;
private String vaddress;//拜访地址
private String vcontent;//拜访内容
第二步 实体类之间互相表示
(1)用户和拜访一对多
-在用户实体类表示所有拜访记录,使用set集合
//表示所属用户
private User user; public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
第三步 配置映射关系
(1)一个实体类对应映射文件,创建三个映射文件
<class name="cn.itcast.entity.Visit" table="t_visit">
<id name="vid" column="vid">
<generator class="native">
</generator>
</id>
<property name="vaddress" column="vaddress"></property>
<property name="vcontent" column="vcontent"></property>
</class>
(2)用户和拜访一对多
-在用户映射文件中表示所有拜访记录,使用set标签
(3)客户和拜访一对多
-客户映射文件表示所有拜访
<!-- 表示所有拜访记录 -->
<set name="setCustVisit">
<key column="cvid"></key>
<one-to-many class="cn.itcast.entity.Visit"/>
</set>
-在拜访映射文件中表示所属客户
<!-- 拜访记录所属客户 -->
<many-to-one name="customer" class="cn.itcast.entity.Customer" column="cvid"></many-to-one>
第四步 把映射文件引入到核心配置文件中
数据库的建表语句如下所示:
CREATE TABLE `t_visit` (
`vid` int(11) NOT NULL AUTO_INCREMENT,
`vaddress` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`vcontent` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`uvid` int(11) DEFAULT NULL,
`cvid` int(11) DEFAULT NULL,
PRIMARY KEY (`vid`),
KEY `FKneag8njjijyk0mt952k3leyiu` (`uvid`),
KEY `FKfq1vs5t876wufr6l5tctnopps` (`cvid`),
CONSTRAINT `FKfq1vs5t876wufr6l5tctnopps` FOREIGN KEY (`cvid`) REFERENCES `t_customer` (`cid`),
CONSTRAINT `FKneag8njjijyk0mt952k3leyiu` FOREIGN KEY (`uvid`) REFERENCES `t_customer` (`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
新增客户拜访
1 点击超链接,到新增用户拜访页面中,
(1)有两个下拉框,选择用户,选择客户
在写完之后一定不要忘记写注解。
客户拜访列表
1 查询拜访列表所有记录(类似于联系人列表)

(1)不显示id值,显示id对应名称
2 核心代码
<c:forEach items="${list }" var="visit">
<TR
style="FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none">
<TD>${visit.user.username }</TD>
<TD>${visit.customer.custName }</TD>
<TD>${visit.vaddress}</TD>
<TD>${visit.vcontent }</TD>
</TR>
</c:forEach>
3 有 no session问题

抽取BaseDao
Code Review
系统的概念实现了,但是可能会比较乱,难于维护。
有他人审查代码,并提出解决方案。
1 代码review
2 抽取basedao代码重构方式
(1)在dao层,做操作最基本crud操作
(2)做crud操作时,调用hibernate模板的方法都一样
(3)不同的是参数不同
比如操作客户,传递客户对象,比如操作联系人,传递联系人对象
(4)抽取basedao,减少dao层大量重复的代码。
3 使用反射+泛型实现抽取
(1)反射得到类的class文件内容
-得到类Class方式
-Class.forName()
-类名.class
-对象.getClass()
this.getClass()
得到当前运行的类信息
-getClass()是Object的方法
(2)泛型术语
List<User>
-<>:读成typeof
-List<User>:整体部分读成 参数化类型
-<User>:<>中的User:读成 实际类型参数
具体实现
1 创建basedao接口,使用泛型方式
在接口里面定义操作的方法crud方法
public interface BaseDao<T> {
//添加
void add(T t);
//修改
void update(T t);
//删除
void delete(T t);
//根据id查询
T findOne(int id);
//查询所有
List<T> findAll();
}
2 创建BaseDao接口实现类
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
//添加
public void add(T t) {
this.getHibernateTemplate().save(t);
}
//修改
public void update(T t) {
this.getHibernateTemplate().update(t);
}
//删除
public void delete(T t) {
this.getHibernateTemplate().delete(t);
}
//根据id查询
public T findOne(int id) {
//不能写T.class
//this.getHibernateTemplate().get(T.class, id);
return null;
}
@Override
public List<T> findAll() {
//this.getHibernateTemplate().find("from"+T);
return null;
}
}
3 在真正功能的接口,继承basedao接口
public interface CustomerDao extends BaseDao<Customer>{
(1)把实现crud操作的方法去掉
/*public void add(Customer customer);
public List<Customer> findAll();
public Customer findOne(int cid);
public void delete(Customer c);
public void update(Customer customer);*/
4 让真正功能的实现类继承BaseDao实现类
(1)在真正的实现类,不需要继承hibernateDaoSupport
public class CustomerDaoImpl extends BaseDaoImpl<Customer> implements CustomerDao {
5 上面操作实现基本概念,有两个查询没有实现
(1)根据id查询,返回对象
(2)查询所有
6 当customerdaoImpl实现类创建对象,父类的构造执行
public class CustomerDaoImpl extends BaseDaoImpl<Customer>
(1)在BaseDaoImpl的构造方法中得到传递对象的class
(2)得到BaseDaoImpl泛型里面Customer的class
7 具体实现
代码实现
private Class pClass;
//构造方法
public BaseDaoImpl(){
//第一步 得到当前运行的Class
Class clazz = this.getClass();
System.out.println("****************************"+clazz);
//第二步 得到运行类的 父类的参数化类型BaseDaoImpl<Customer>
//Type getGenericInterfaces()
Type type = clazz.getGenericSuperclass();
//使用Type子接口ParameterizedType
ParameterizedType ptype = (ParameterizedType)type;
//得到的ptype是BaseDaoImpl<Customer>这个整体部分
System.out.println("*****************************"+ptype);
//第三步 得到实际类型参数<Customer>里面的Customer
//Type[] getActualTypeArguments()
//为什么返回的是数据,可能是map
Type[] types = ptype.getActualTypeArguments();
//Type接口实现类Class
Class tclass = (Class)types[0];
System.out.println("########################"+tclass);
this.pClass = tclass;
}
//根据id查询
@SuppressWarnings("all")
public T findOne(int id) {
//不能写T.class
//this.getHibernateTemplate().get(T.class, id);
return (T) this.getHibernateTemplate().get(pClass, id);
}
@SuppressWarnings("all")
public List<T> findAll() {
//this.getHibernateTemplate().find("from"+T);
//使用Class里面getSimpleName()得到类名称
return (List<T>) this.getHibernateTemplate().find("from "+pClass.getSimpleName());
//这里要加空格
}
//添加
public void add(T t) {
this.getHibernateTemplate().save(t);
}
//修改
public void update(T t) {
this.getHibernateTemplate().update(t);
}
//删除
public void delete(T t) {
this.getHibernateTemplate().delete(t);
}
多条件组合查询
第一种 写底层hibernate代码实现
第二种 使用hibernate模板里面find方法实现
-写hql语句实现
//多条件组合查询
public List<Customer> findMoreCondition(Customer customer) {
//使用Hibernate模板里面的find方法实现
//拼接hql语句
String hql = "from Customer where 1 = 1";
//创建list集合,如果值不为空,把值设置到list里面
List<Object> p = new ArrayList<Object>();
//判断条件值是否为空,如果不为空拼接hql语句
if(customer.getCustName()!=null && !"".equals(customer.getCustName())){
//拼接hql
//记住写hql语句时要加空格,不然是错的
hql += " and custName=?";
//把值设置到List里面
p.add(customer.getCustName());
} if(customer.getCustLevel()!=null && !"".contentEquals(customer.getCustLevel())){
hql += " and custLevel=?";
p.add(customer.getCustLevel());
} if(customer.getCustSource()!=null && !"".contentEquals(customer.getCustSource())){
hql += " and custSource=?";
p.add(customer.getCustSource());
} return (List<Customer>) this.getHibernateTemplate().find(hql, p.toArray());
}
第三种 使用离线对象和Hibernate模板里面方法
srm开发(基于ssh)(4)的更多相关文章
- 基于ssh框架的在线考试系统开发的质量属性
我做的系统是基于ssh框架的在线考试系统.在线考试系统有以下几点特性:(1)系统响应时间需要非常快,可以迅速的出题,答题.(2)系统的负载量也需要非常大,可以支持多人在线考试(3)还有系统的安全性也需 ...
- 实现基于SSH的门票管理系统开发的质量属性
我要做的是一个基于SSH的门票售卖系统,在系统中常见的质量属性有:可用性.可修改性.性能.安全性.易用性. 可用性方面: 可用性是指系统正常运行时间的比例,是通过两次故障之间的时间长度或在系统崩溃情况 ...
- 基于SSH框架的在线考勤系统开发的质量属性
我要开发的是一个基于SSH框架的在线考勤系统. 质量属性是指影响质量的相关因素,下面我将分别从6个系统质量属性(可用性,易用性,可修改性,性能,安全性,可测试性)来分析我的系统,以及如何实现这些质量属 ...
- 基于SSH框架开发的《高校大学生选课系统》的质量属性的实现
基于SSH框架开发的<高校大学生选课系统>的质量属性的实现 对于可用性采取的是错误预防战术,即阻止错误演变为故障:在本系统主要体现在以下两个方面:(1)对于学生登录模块,由于初次登陆,学生 ...
- 基于SSH框架的网上书店系统开发的质量属性
基于SSH框架的网上书店系统开发的质量属性 对于我的基于SSH框架的网上书店系统的开发要实现的质量属性有可用性.可修改性.性能.安全性.易用性和可测试性. 1.对于可用性方面的战术: 可用性(Avai ...
- 基于SSH框架的学生公寓管理系统的质量属性
系统名称:学生公寓管理系统 首先介绍一下学生公寓管理系统,在学生公寓管理方面,针对学生有关住宿信息问题进行管理,学生公寓管理系统主要包含了1)学生信息记录:包括学号.姓名.性别.院系.班级:2)住宿信 ...
- 基于ssh反向代理实现的远程协助
本文描述了怎么通过ssh反向代理实现远程协助,并提供了相关代码. 可满足web开启远程协助功能后,维护人员能够通过ssh和http登录客户机器(包括在nat环境下) web开启该功能后,ssh才能登录 ...
- 【Ansible】 基于SSH的远程管理工具
[Ansible] 参考文档:[http://www.ansible.com.cn/docs/intro.html] 和ansible类似的工具还有saltstack,puppet,sshpass等, ...
- 基于SSH的高校网上选课系统的质量属性的实现
我对于基于SSH的高校网上选课系统的质量属性的实现是从可用性.性能.安全性.可维护性.易用性五个方面进行的实现. 可用性方面: 实现方式:(1)当系统试图超出限制范围来进行课程查询或选课时必须进行错误 ...
- 基于SSH的网上图书商城-JavaWeb项目-有源码
开发工具:Myeclipse/Eclipse + MySQL + Tomcat 项目简介: 技术:Java:JSP:JDBC,struts2,spring,hibernate数据库: mysqlweb ...
随机推荐
- 基于minikube的kubernetes集群部署及Vitess最佳实践
简介 minikube是一个可以很容易在本地运行Kubernetes集群的工具, minikube在电脑上的虚拟机内运行单节点Kubernetes集群,可以很方便的供Kubernetes日常开发使用: ...
- Word Formation
构词 Word Formation 1.派生Derivation 2.合成Compounding 3.截短Clipping 4.混合Blending 1派生Derivation 1).前缀 除少数英语 ...
- Eclipse打包java工程
Eclipse打包java工程步骤如下: 1.选择预打包的工程->Export. 2.选择java->JAR file. 3.导出JAR文件设置. 这里有几个选项: Export gene ...
- 【转】Mysql的配置文件详解
[client]port = 3306socket = /tmp/mysql.sock [mysqld]port = 3306socket = /tmp/mysql.sock basedir = /u ...
- ArcGIS runtime for wpf 部署
简介 ArcGIS runtime for wpf 是一个轻量级的产品,部署方便,甚至可以做到直接部署在U盘中,做到即插即用. 部署一般需要遵循如下几个步骤: 1. 设定部署许可 虽然ArcGIS r ...
- 用python合并N个不同字符集编码的sql文件的实践
背景:我有一项工作任务是将svn某文件夹日常更新的sql文件(归类到日期命名的文件夹中)拿到数据库中运行. 一開始,我是先把sql文件update下来,用notepad++打开,拷贝每个文本的sql语 ...
- Kattis - honey【DP】
Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...
- JSP SERVLET 基础知识
jsp(java server page)和servlet是JAVA EE规范的两个基本成员,是JAVA WEB开发的重点也是基础知识.JSP本质上也需要编译成SERVLET运行. JSP比较简单,可 ...
- 使用Vue.js初次真正项目开发-2018/07/14
一.组件化 使用Vue.js进行开发,按照MVVM模式,围绕数据为核心,进行开发. 开发过程根据业务和功能组件化,组件化一方面让我们开发思路更加清晰,另一方面对于数据的处理和控制变得更加简单,毕竟一个 ...
- ASP.NET MVC Select无限级分类选择下拉框
1:读取父级下的所有子类别 *ViewBag.ParentItemList:不能与ParentId相同 private void ParentDropDownList() { List<SAS. ...