黑马程序员技术交流社区
标题:
【广州校区】+【原创】strust2文件上传
[打印本页]
作者:
Mylo
时间:
2020-5-21 15:19
标题:
【广州校区】+【原创】strust2文件上传
新增客户
==数据字典==
用小海豚执行base_dict.sql
得到一张新的表---==数据字典表==
作用:用于枚举项目中有限个数的字典项
在customer表中,像信息来源,用户等级,用户类型等,以前都是普通的文本输入框.但是我们可以设置成可以从有限的字段中选择出来的
数据字典表可以把项目中的所有枚举统一在一张表中
创建BaseDict对象
数据字典表不需要维护关系,所以可以不创建集合存储多的一方的集合
"BaseDict.class"
public class BaseDict {
private String dict_id;
private String dict_type_code;
private String dict_type_name;
private String dict_item_name;
private String dict_item_code;
private String dict_memo;
private Integer dict_sort;
private Character dict_enable
"set and get method"
}
主键生成策略用手动输入assigned和uuid都可以
不需要在引入映射文件,spring已经自动引入了包
<?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 package="cn.itcast.domain" >
<class name="BaseDict" table="base_dict" >
<id name="dict_id" >
<generator class="assigned"></generator>
</id>
<property name="dict_type_code" ></property>
<property name="dict_type_name" ></property>
<property name="dict_item_name" ></property>
<property name="dict_item_code" ></property>
<property name="dict_memo" ></property>
<property name="dict_sort" ></property>
<property name="dict_enable" ></property>
</class>
</hibernate-mapping>
在customer.class中添加字典表对象(3个对象)
<!-- 多对一 -->
<many-to-one name="cust_source" column="cust_source" class="BaseDict" ></many-to-one>
<many-to-one name="cust_industry" column="cust_industry" class="BaseDict" ></many-to-one>
<many-to-one name="cust_level" column="cust_level" class="BaseDict" ></many-to-one>
ajax加载数据字典下拉选
Action中返回JSON到浏览器:
ServletActionContext.getResponse().getWriter().write();
return null;//告诉struts2不进行结果处理
@Override
public String execute() throws Exception {
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(BaseDict.class);
detachedCriteria.add(Restrictions.eq("dict_type_code", dict_type_code));
List<BaseDict> list = baseDictService.getListByDictTypeCode(detachedCriteria);
Gson gson = new Gson();
String json = gson.toJson(list);
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/json;charset=utf-8");
response.getWriter().write(json);
return null;
}"service直接调用BaseDaoImpl的方法"
@Override
public List<BaseDict> getListByDictTypeCode(DetachedCriteria detachedCriteria) {
List<BaseDict> list = baseDictDao.getList(detachedCriteria);
return list;
}
ajax加载数据字典下拉选前台js部分
js最好写一行测一行
使用jQuery就是打开文档复制粘贴的过程
//使用ajax加载数据字典,生成select
//参数1: 数据字典类型 (dict_type_code)
//参数2: 将下啦选放入的标签id
//参数3: 生成下拉选时,select标签的name属性值
//参数4: 需要回显时,选中哪个option
function loadSelect(typecode,positionId,selectname,selectedId){
//1 创建select对象,将name属性指定
var $select = $("<select name="+selectname+" ></select>");
//2 添加提示选项
$select.append($("<option value='' >---请选择---</option>"));
//3 使用jquery 的ajax 方法,访问后台Action
$.post("${pageContext.request.contextPath}/BaseDictAction", { dict_type_code:typecode},
function(data){
//遍历
//4 返回json数组对象,对其遍历
$.each( data, function(i, json){
// 每次遍历创建一个option对象
var $option = $("<option value='"+json['dict_id']+"' >"+json["dict_item_name"]+"</option>");
if(json['dict_id'] == selectedId){
//判断是否需要回显 ,如果需要使其被选中
$option.attr("selected","selected");
}
//并添加到select对象
$select.append($option);
});
},"json");
//5 将组装好的select对象放入页面指定位置
$("#"+positionId).append($select);
}
保存客户后台逻辑
对象驱动保存属性
public String add() throws Exception {
//1 调用Service,保存Customer对象
cs.save(customer);
//2 重定向到客户列表Action
return "toList";
}
在service中调用dao分别取出3个数据字典对象设置到customer里,然后再保存customer
我们从action传给service的customer中,3个数字字典对象都有id,是游离状态的
@Override
public void save(Customer customer) {
"1 维护Customer与数据字典对象的关系,由于struts2参数封装,会将参数封装到数据字典的id属性."
"那么我们无需手动维护关系"
"2 调用Dao保存客户"
cd.saveOrUpdate(customer);
}
扩展-struts2文件上传
之前用的是FileUpLoad来进行文件上传
文件上传有4个要求
input type=file
有name属性
post提交
表单类型是: enctype为多段式提交(multipart/form-data)
后台代码
"上传的文件会自动封装到File对象"
"在后台提供一个与前台input type=file组件 name相同的属性"
private File photo;
"在提交键名后加上固定后缀FileName,文件名称会自动封装到属性中"
private String photoFileName;
"在提交键名后加上固定后缀ContentType,文件MIME类型会自动封装到属性中 "
private String photoContentType;
public String add() throws Exception {
if(photo!=null){
System.out.println("文件名称:"+photoFileName);
System.out.println("文件类型:"+photoContentType);
//将上传文件保存到指定位置
photo.renameTo(new File("E:/upload/haha.jpg"));
}
//---------------------------------------------------------------------
//1 调用Service,保存Customer对象
cs.save(customer);
//2 重定向到客户列表Action
return "toList";
}
"set和get方法"
扩展-struts2文件上传原理
struts2有一个fileupload拦截器
拦截器会判断是否是多段式上传,如果不是多段式就放行
如果是多段式就获取信息放入集合中
然后拼接字符串,最后放入actionContext中
然后在params拦截器赋值
客户修改
在列表页面对用户进行修改
根据id获得customer对象,然后回写到页面
用add.jsp同时用于添加和修改操作
public String toEdit() throws Exception {
//1调用Service根据id获得客户对象
Customer c = cs.getById(customer.getCust_id());
//2 将客户对象放置到request域,并转发到编辑页面
ActionContext.getContext().put("customer", c);
return "edit";
}<s:property value="#customer==null?'添加':'修改'" />客户
BaseDao中hibernate的saveOrUpDate方法,在页面中加一个隐藏域来存放id
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2