0
点赞
收藏
分享

微信扫一扫

SSH实战 第二天 代码

_阿瑶 2022-09-19 阅读 192

目录

​​阿里fastJson的使用方式​​

​​Person.java​​

​​Role.java​​

​​Demo1.java​​

​​总结fastjson工具类​​

​​FastJsonUtil.java​​

​​今日特色功能:文件上传单独列出来​​

​​add.jsp1​​

​​CustomerAction.java1​​

​​struts.xml1(上传文件大小和类型的配置)​​

​​也列个删除文件吧​​

​​list.jsp2​​

​​CustomerAction.java2​​

​​今日所有功能:​​

​​条件查询客户(adjx展示条件的下拉选),分页显示(回显示防止条件消失),添加用户(重点文件上传),删除用户(同时删除用户文件)​​

​​DAO​​

​​CustomerDaoImpl.java​​

​​DictDaoImpl.java​​

​​Domain​​

​​Customer.java​​

​​Customer.hbm.xml​​

​​Dict.java​​

​​Dict.hbm.xml​​

​​Service​​

​​CustomerServiceImpl.java​​

​​DictServiceImpl.java​​

​​Utils​​

​​MD5Utils.java​​

​​UploadUtils.java​​

​​Action​​

​​CustomerAction.java​​

​​DictAction.java​​

​​核心XML​​

​​applicationContext.xml​​

​​struts.xml​​

​​JSP​​

​​list.jsp​​

​​add.jsp​​

阿里fastJson的使用方式

先导入仅一个jar包fastjson-1.2.8.jar,然后就可以使用了

测试使用:两个循环引用的对象为了说明api的问题并如何解决的

Person.java

package com.itheima.test;

public class Person {
private String name;
private Role role;//person里引用角色

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
}

Role.java

package com.itheima.test;

import com.alibaba.fastjson.annotation.JSONField;

public class Role {
private String rname;

@JSONField(serialize=false)
private Person person;//角色里又引用了person

public String getRname() {
return rname;
}
public void setRname(String rname) {
this.rname = rname;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}

}

Demo1.java

package com.itheima.test;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.itheima.domain.Customer;

/**
* 演示json简单使用
* @author 寒面银枪
* 2019年7月4日-下午6:34:46
*/
public class Demo1 {

/**
* 单个对象转json
*/
@Test
public void run1() {
Customer c=new Customer();
c.setCust_id(20L);
c.setCust_name("云天河");
c.setCust_phone("110120");

//转换成json字符串
String jsonString = JSON.toJSONString(c);//简直太方便了
System.out.println(jsonString);
}

/**
* list集合转json
*/
@Test
public void run2() {
List<Customer> list=new ArrayList<Customer>();

Customer c1=new Customer();
c1.setCust_id(20L);
c1.setCust_name("云天河");
c1.setCust_phone("110120");
list.add(c1);

Customer c2=new Customer();
c2.setCust_id(40L);
c2.setCust_name("云天青");
c2.setCust_phone("119114");
list.add(c2);

//转换成json字符串
String jsonString = JSON.toJSONString(list);//简直太方便了
System.out.println(jsonString);
}


/**
* 问题:默认情况下:fastjson 禁止循环引用(list转json后有两个json一模一样,会以引用方式打印,浏览器无法解释...)
* 输入:[{"cust_id":20,"cust_name":"云天河","cust_phone":"110120"},{"$ref":"$[0]"}]
* 不重复打印 直接引用当前对象的第0个了
*/
@Test
public void run3() {
List<Customer> list=new ArrayList<Customer>();

Customer c1=new Customer();
c1.setCust_id(20L);
c1.setCust_name("云天河");
c1.setCust_phone("110120");
list.add(c1);

list.add(c1);

//转换成json字符串
String jsonString = JSON.toJSONString(list);//简直太方便了
System.out.println(jsonString);
}

/**
* {"$ref":"$[0]"}字符串浏览器是无法解析的 解决办法如下:用另一个重载再传入一个参数禁止循环引用即可
*/
@Test
public void run3_1() {
List<Customer> list=new ArrayList<Customer>();

Customer c1=new Customer();
c1.setCust_id(20L);
c1.setCust_name("云天河");
c1.setCust_phone("110120");
list.add(c1);

list.add(c1);

//禁止循环引用
String jsonString = JSON.toJSONString(list,SerializerFeature.DisableCircularReferenceDetect);

System.out.println(jsonString);
}

/**
* 然而禁止循环引用后又引发了一个死循环的问题
*/
@Test
public void run4() {
Person p=new Person();
p.setName("悟空");
Role r=new Role();
r.setRname("猴子");
r.setPerson(p);
p.setRole(r);

//禁止循环引用方式下转json
//String jsonString = JSON.toJSONString(p,SerializerFeature.DisableCircularReferenceDetect);//StackOverflowError

//默认转json
String jsonString = JSON.toJSONString(p);//不报错 但是以引用方式打印
//比较好的解决方案 总是禁止循环引用 然后在引起死循环的javaBean属性上加注解 针对单个属性不转json

System.out.println(jsonString);
}
}

总结fastjson工具类

FastJsonUtil.java

package com.itheima.utils;

import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;

public class FastJsonUtil {

/**
* 将对象转成json串
* @param object
* @return
*/
public static String toJSONString(Object object){
//DisableCircularReferenceDetect来禁止循环引用检测
return JSON.toJSONString(object,SerializerFeature.DisableCircularReferenceDetect);
}

/**
* 向浏览器写回json
*/
public static void write_json(HttpServletResponse response,String jsonString)
{
response.setContentType("application/json;utf-8");
response.setCharacterEncoding("UTF-8");
try {
response.getWriter().print(jsonString);
} catch (IOException e) {
e.printStackTrace();
}
}


/**
* ajax提交后回调的json字符串
* @return
*/
public static String ajaxResult(boolean success,String message)
{
Map map=new HashMap();
map.put("success", success);//是否成功
map.put("message", message);//文本消息
String json= JSON.toJSONString(map);
return json;
}


/**
* JSON串自动加前缀
* @param json 原json字符串
* @param prefix 前缀
* @return 加前缀后的字符串
*/

public static String JsonFormatterAddPrefix(String json,String prefix,Map<String,Object> newmap)
{
if(newmap == null){
newmap = new HashMap();
}
Map<String,Object> map = (Map) JSON.parse(json);

for(String key:map.keySet())
{
Object object=map.get(key);
if(isEntity(object)){
String jsonString = JSON.toJSONString(object);
JsonFormatterAddPrefix(jsonString,prefix+key+".",newmap);

}else{
newmap.put(prefix+key, object);
}

}
return JSON.toJSONString(newmap);
}
/**
* 判断某对象是不是实体
* @param object
* @return
*/
private static boolean isEntity(Object object)
{
if(object instanceof String )
{
return false;
}
if(object instanceof Integer )
{
return false;
}
if(object instanceof Long )
{
return false;
}
if(object instanceof java.math.BigDecimal )
{
return false;
}
if(object instanceof Date )
{
return false;
}
if(object instanceof java.util.Collection )
{
return false;
}
return true;

}
}

今日特色功能:文件上传单独列出来

add.jsp1

<form id=form1 name=form1 action="" method=post enctype="multipart/form-data">
<td>上传资质 :</td>
<td>
<input type="file" name="upload"/>
</td>
</form>

CustomerAction.java1

/**
* 保存客户的方法
* @return
* @throws IOException
*/
public String save() throws IOException {
//处理文件上传
if(uploadFileName!=null) {
//说明用户选择了要上传的文件
/*System.out.println("文件名:"+uploadFileName);
System.out.println("文件类型:"+uploadContentType);*/

//把名称处理下 获得唯一名称 传入filename为了获取后缀名
String uuidname=UploadUtils.getUUIDName(uploadFileName);

//把文件上传到"E:\\Tomcat\\apache-tomcat-8.5.4\\webapps\\upload"
String path="E:\\Tomcat\\apache-tomcat-8.5.4\\webapps\\upload\\";
//简单方式 新建一个文件 然后将封装的File upload文件copy到此新文件内
File file=new File(path+uuidname);//上面加了"//" 此处拼接时就不用加了
FileUtils.copyFile(upload, file);//导Apache.commons.io包

//上传文件路径记录在数据库
customer.setFilepath(path+uuidname);
}

customerService.save(customer);
return "save";
}

struts.xml1(上传文件大小和类型的配置)

<?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">

<!-- 配置Action -->
<struts>
<!-- 设置常量 -->
<!-- 设置上传文件总大小的上限 默认值是2M struts.multipart.maxSize=2097152 (单个文件大小也可以设置)-->
<constant name="struts.multipart.maxSize" value="209715200"/> <!-- 加两个0 变200M -->

<!-- 先配置包结构 -->
<package name="crm" namespace="/" extends="struts-default">

<!-- Action由spring来管理,那么此处的class属性只写spring中的id值即可 -->
<action name="customer_*" class="customerAction" method="{1}">
<!-- type默认请求转发 -->
<result name="page">/jsp/customer/list.jsp</result>
<result name="initAddUI">/jsp/customer/add.jsp</result>
<!-- 客户保存(添加)成功 需要转到客户列表查看 也即要转到另一个action 注意转到的action没有/ ".action"也可以省略也可以写-->
<result name="save" type="redirectAction">customer_findByPage</result>
<!-- 文件上传错误 文件过大 -->
<result name="input">/jsp/error.jsp</result>
<result name="delete" type="redirectAction">customer_findByPage.action</result>

<!-- 引入默认拦截器栈 修改上传文件类型 -->
<interceptor-ref name="defaultStack">
<!-- 设置fileUpload拦截器的allowedExtensions属性 能决定上传文件的类型-->
<param name="fileUpload.allowedExtensions">.jpg,.txt</param>
<!-- 设置单个上传文件的大小 也是200M-->
<param name="fileUpload.maximumSize">209715200</param>
</interceptor-ref>

</action>


</package>

</struts>

 

也列个删除文件吧

list.jsp2

<a href="${pageContext.request.contextPath }/customer_delete.action?cust_id=${customer.cust_id}" onclick="return window.confirm('确定删除吗?')">删除</a>
<!--自动弹窗提示,不用写js事件了-->

CustomerAction.java2

/**
* 删除客户
*/
public String delete() {
//删除客户
//先获取客户上传文件的路径 将客户上传的文件全删了
customer=customerService.findById(customer.getCust_id());
//获取上传文件的路径
String filepath=customer.getFilepath();
//删除客户
customerService.delete(customer);
//再删除文件 很简单
File file=new File(filepath);//先获取文件
if(file.exists()) {
file.delete();
}
return "delete";
}

 

 

 

今日所有功能:

条件查询客户(adjx展示条件的下拉选),分页显示(回显示防止条件消失),添加用户(重点文件上传),删除用户(同时删除用户文件)

DAO

CustomerDaoImpl.java

package com.itheima.dao;

import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import com.itheima.domain.Customer;
import com.itheima.domain.PageBean;

/**
* 客户的持久层
* @author 寒面银枪
* 2019年7月2日-下午8:22:52
*/
public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao {

/**
* 保存客户
*/
public void save(Customer customer) {
getHibernateTemplate().save(customer);
}

/**
* 分页查询
*/
@Override
public PageBean<Customer> findByPage(Integer pageCode, Integer pageSize, DetachedCriteria criteria) {
PageBean<Customer> page=new PageBean<Customer>();
page.setPageCode(pageCode);
page.setPageSize(pageSize);

//先查询总记录数 select count(*)
criteria.setProjection(Projections.rowCount()); //QBC 条件查询 不过此处是离线条件罢了
List<Number> list=(List<Number>) this.getHibernateTemplate().findByCriteria(criteria);
if(list!=null&&list.size()>0) {
int totalCount=list.get(0).intValue();
page.setTotalCount(totalCount);
}

//强调 先把条件清空 再接着查 一清空select count(*) 就变成select *了
criteria.setProjection(null);
//分页查询数据 limit 竟然就直接有个按参数封装好的api(Hibernate框架提供的API,Spring包装下而已)
List<Customer> beanList = (List<Customer>) this.getHibernateTemplate().findByCriteria(criteria, (pageCode-1)*pageSize, pageSize);
page.setBeanList(beanList);

return page;
}

/**
* 通过主键查询客户
*/
@Override
public Customer findById(Long cust_id) {
return this.getHibernateTemplate().get(Customer.class, cust_id);
}

/**
*
*/
@Override
public void delete(Customer customer) {
this.getHibernateTemplate().delete(customer);//删除也是传个对象 所以Hibernate普遍先查再删
}

}

DictDaoImpl.java

package com.itheima.dao;

import java.util.List;

import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import com.itheima.domain.Dict;

public class DictDaoImpl extends HibernateDaoSupport implements DictDao {

/**
* 根据类别代码 查询字典对应项值 eg:006查询所有的客户级别可取的值
*/
@Override
public List<Dict> findByCode(String dict_type_code) {
return (List<Dict>) this.getHibernateTemplate().find("from Dict where dict_type_code = ?", dict_type_code);
}

}

Domain

Customer.java

package com.itheima.domain;

public class Customer {

private Long cust_id;//客户名称
private String cust_name;//客户姓名
private Long cust_user_id;//负责人id
private Long cust_create_id;//创建人id 这两个暂时不管

/*private String cust_source;//客户来源
private String cust_industry;//客户所属行业(eg:客户来自于百度 那么行业可以是互联网)
private String cust_level;//客户级别*/

private String cust_linkman;//联系人
private String cust_phone;//固定电话
private String cust_mobile;//移动电话

//一对多 多方写对象 那么上面普通字段的写法就要注释掉了
//一:客户来源 多:客户
private Dict source;
//一:客户行业 多:客户
private Dict industry;
//一:客户级别 多:客户
private Dict level;

// 上传文件保存的路径
private String filepath;



public Long getCust_id() {
return cust_id;
}
public void setCust_id(Long cust_id) {
this.cust_id = cust_id;
}
public String getCust_name() {
return cust_name;
}
public void setCust_name(String cust_name) {
this.cust_name = cust_name;
}
public Long getCust_user_id() {
return cust_user_id;
}
public void setCust_user_id(Long cust_user_id) {
this.cust_user_id = cust_user_id;
}
public Long getCust_create_id() {
return cust_create_id;
}
public void setCust_create_id(Long cust_create_id) {
this.cust_create_id = cust_create_id;
}
public String getCust_linkman() {
return cust_linkman;
}
public void setCust_linkman(String cust_linkman) {
this.cust_linkman = cust_linkman;
}
public String getCust_phone() {
return cust_phone;
}
public void setCust_phone(String cust_phone) {
this.cust_phone = cust_phone;
}
public String getCust_mobile() {
return cust_mobile;
}
public void setCust_mobile(String cust_mobile) {
this.cust_mobile = cust_mobile;
}
public Dict getSource() {
return source;
}
public void setSource(Dict source) {
this.source = source;
}
public Dict getIndustry() {
return industry;
}
public void setIndustry(Dict industry) {
this.industry = industry;
}
public Dict getLevel() {
return level;
}
public void setLevel(Dict level) {
this.level = level;
}
public String getFilepath() {
return filepath;
}
public void setFilepath(String filepath) {
this.filepath = filepath;
}
@Override
public String toString() {
return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + ", cust_user_id=" + cust_user_id
+ ", cust_create_id=" + cust_create_id + ", cust_linkman=" + cust_linkman + ", cust_phone=" + cust_phone
+ ", cust_mobile=" + cust_mobile + ", source=" + source + ", industry=" + industry + ", level=" + level
+ "]";
}
}

Customer.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="com.itheima.domain.Customer" table="cst_customer">
<id name="cust_id" column="cust_id">
<generator class="native"/>
</id>

<property name="cust_name" column="cust_name"/>
<property name="cust_user_id" column="cust_user_id"/>
<property name="cust_create_id" column="cust_create_id"/>

<!-- <property name="cust_source" column="cust_source"/>
<property name="cust_industry" column="cust_industry"/>
<property name="cust_level" column="cust_level"/> -->

<property name="cust_linkman" column="cust_linkman"/>
<property name="cust_phone" column="cust_phone"/>
<property name="cust_mobile" column="cust_mobile"/>

<!-- 上传文件保存的路径 -->
<property name="filepath" column="filepath"/> <!-- 不配置长度就是默认长度 -->

<!-- 一对多 配置多方
本类的全限定名已经知道了 这里配的应该就是另一方javaBean的全路径了
name:当前(多方)javaBean属性 class:关联的另一方(一方)类的全路径 column:表中外键字段名称
-->
<many-to-one name="source" class="com.itheima.domain.Dict" column="cust_source"/>
<many-to-one name="industry" class="com.itheima.domain.Dict" column="cust_industry"/>
<many-to-one name="level" class="com.itheima.domain.Dict" column="cust_level"/>

</class>

</hibernate-mapping>

Dict.java

package com.itheima.domain;
/**
* 数据字典表
* @author 寒面银枪
* 2019年7月4日-下午1:52:54
*/
public class Dict {
/**
* `dict_id` varchar(32) NOT NULL COMMENT '数据字典id(主键)',
`dict_type_code` varchar(10) NOT NULL COMMENT '数据字典类别代码',
`dict_type_name` varchar(64) NOT NULL COMMENT '数据字典类别名称',
`dict_item_name` varchar(64) NOT NULL COMMENT '数据字典项目名称',
`dict_item_code` varchar(10) DEFAULT NULL COMMENT '数据字典项目(可为空)',
`dict_sort` int(10) DEFAULT NULL COMMENT '排序字段',
`dict_enable` char(1) NOT NULL COMMENT '1:使用 0:停用',
`dict_memo` varchar(64) DEFAULT NULL COMMENT '备注',
*/

private String dict_id;//主键

private String dict_type_code;//数据字典类别代码 eg:01 06
private String dict_type_name;//数据字典类别名称 eg:01客户行业 06客户级别
private String dict_item_name;//数据字典项目名称 eg:01:教务培训|房地产 06:普通客户|VIP客户
private String dict_item_code;//数据字典项目(可为空)

private Integer dict_sort;//排序字段
private String dict_enable;//1:使用 0:停用
private String dict_memo;//备注


//并没有要查字典的需求 也即没有要查譬如某个级别的客户有多少个这种需求 那么就不必在一方这里写set集合了 正好外键一方维护也就够了


public String getDict_id() {
return dict_id;
}
public void setDict_id(String dict_id) {
this.dict_id = dict_id;
}
public String getDict_type_code() {
return dict_type_code;
}
public void setDict_type_code(String dict_type_code) {
this.dict_type_code = dict_type_code;
}
public String getDict_type_name() {
return dict_type_name;
}
public void setDict_type_name(String dict_type_name) {
this.dict_type_name = dict_type_name;
}
public String getDict_item_name() {
return dict_item_name;
}
public void setDict_item_name(String dict_item_name) {
this.dict_item_name = dict_item_name;
}
public String getDict_item_code() {
return dict_item_code;
}
public void setDict_item_code(String dict_item_code) {
this.dict_item_code = dict_item_code;
}
public Integer getDict_sort() {
return dict_sort;
}
public void setDict_sort(Integer dict_sort) {
this.dict_sort = dict_sort;
}
public String getDict_enable() {
return dict_enable;
}
public void setDict_enable(String dict_enable) {
this.dict_enable = dict_enable;
}
public String getDict_memo() {
return dict_memo;
}
public void setDict_memo(String dict_memo) {
this.dict_memo = dict_memo;
}
}

Dict.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="com.itheima.domain.Dict" table="base_dict">
<id name="dict_id" column="dict_id">
<!-- 主键字符串类型 换成字符串生成策略 -->
<generator class="uuid"/>
</id>

<property name="dict_type_code" column="dict_type_code"/>
<property name="dict_type_name" column="dict_type_name"/>
<property name="dict_item_name" column="dict_item_name"/>
<property name="dict_item_code" column="dict_item_code"/>

<property name="dict_sort" column="dict_sort"/>
<property name="dict_enable" column="dict_enable"/>
<property name="dict_memo" column="dict_memo"/>
<!-- 写完后立刻配置spring核心配置文件里 -->
</class>

</hibernate-mapping>

Service

CustomerServiceImpl.java

package com.itheima.service;

import org.hibernate.criterion.DetachedCriteria;
import org.springframework.transaction.annotation.Transactional;

import com.itheima.dao.CustomerDao;
import com.itheima.domain.Customer;
import com.itheima.domain.PageBean;

/**
* 客户的业务层
* @author 寒面银枪
* 2019年7月2日-下午7:06:18
*/
@Transactional //下面的方法就都有了事务
public class CustomerServiceImpl implements CustomerService {

private CustomerDao customerDao;
public void setCustomerDao(CustomerDao customerDao) {
this.customerDao = customerDao;
}

/**
* 保存客户
*/
public void save(Customer customer) {
customerDao.save(customer);
}

/**
* 分页查询
*/
@Override
public PageBean<Customer> findByPage(Integer pageCode, Integer pageSize, DetachedCriteria criteria) {
return customerDao.findByPage(pageCode,pageSize,criteria);
}

/**
* 通过主键查询客户
*/
@Override
public Customer findById(Long cust_id) {
return customerDao.findById(cust_id);
}

/**
* 删除客户
*/
@Override
public void delete(Customer customer) {
customerDao.delete(customer);
}

}

DictServiceImpl.java

package com.itheima.service;

import java.util.List;

import org.springframework.transaction.annotation.Transactional;

import com.itheima.dao.DictDao;
import com.itheima.domain.Dict;

/**
* 字典业务层
* @author 寒面银枪
* 2019年7月4日-下午9:16:13
*/
@Transactional
public class DictServiceImpl implements DictService {

private DictDao dictDao;
public void setDictDao(DictDao dictDao) {
this.dictDao = dictDao;
}

/**
* 根据类别代码 查询字典对应项值 eg:006查询所有的客户级别可取的值
*/
@Override
public List<Dict> findByCode(String dict_type_code) {
return dictDao.findByCode(dict_type_code);
}


}

Utils

MD5Utils.java

package com.itheima.utils;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Utils {
/**
* 使用md5的算法进行加密
*/
public static String md5(String plainText) {
byte[] secretBytes = null;
try {
secretBytes = MessageDigest.getInstance("md5").digest(
plainText.getBytes());
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("没有md5这个算法!");
}
String md5code = new BigInteger(1, secretBytes).toString(16);// 16进制数字
// 如果生成数字未满32位,需要前面补0
for (int i = 0; i < 32 - md5code.length(); i++) {
md5code = "0" + md5code;
}
return md5code;
}

public static void main(String[] args) {
System.out.println(md5("123"));
}

}

UploadUtils.java

package com.itheima.utils;

import java.util.UUID;

public class UploadUtils {

public static String getUUIDName(String filename) {
//截取后缀名
String lastName=filename.substring(filename.lastIndexOf("."));
String firstName=UUID.randomUUID().toString().replace("-", "");
return firstName+lastName;

}

public static void main(String[] args) {
System.out.println(getUUIDName("girl.jpg"));
}

}

Action

CustomerAction.java

package com.itheima.web.action;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;

import com.itheima.domain.Customer;
import com.itheima.domain.Dict;
import com.itheima.domain.PageBean;
import com.itheima.service.CustomerService;
import com.itheima.utils.UploadUtils;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.util.ValueStack;

/**
* 客户的控制层(web层)
* @author 寒面银枪
* 2019年7月4日-下午2:45:06
*/
public class CustomerAction extends ActionSupport implements ModelDriven<Customer>{

private static final long serialVersionUID = 1L;

/**
* 以后除非接收的单个参数使用属性驱动 否则都使用模型驱动封装数据 实现ModelDriven接口
* 多简单:实现接口 写一个javaBean属性 接口必须实现的方法内返回对象 即可
*/
private Customer customer=new Customer();//必须手动实例化
//类的属性是由get和set方法决定的 与字段无关 所以Action类有一个属性model
public Customer getModel() {
return customer;
}

//注入service 提供service成员属性
private CustomerService customerService;
public void setCustomerService(CustomerService customerService) {
this.customerService = customerService;
}//一旦Action给spring管理 Struts的自动注入就失效了 必须手动注入 既然Action在spring的xml中了 那么多配置一个属性就是了


/**
* 保存客户的方法
* @return
*/
public String add() {
System.out.println("web层保存客户...");
customerService.save(customer);
return NONE;
}

//属性驱动的方式封装当前页 默认值是1
private Integer pageCode=1;
public void setPageCode(Integer pageCode) {
if(pageCode==null) pageCode=1;
this.pageCode = pageCode;
}

//每页显示的数据的条数 (如果可以让用户选择,那么就不能写死了)
private Integer pageSize=2;//默认2条
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}


/**
* 分页查询
*/
public String findByPage() {
//调用service web层可以提前拼条件了
DetachedCriteria criteria=DetachedCriteria.forClass(Customer.class);//注意不是写PageBean.class 查询谁写谁
//条件查询 多加几行拼条件的代码就行了
//拼接客户名称
String cust_name = customer.getCust_name();
if(cust_name!=null&&!cust_name.trim().isEmpty()) {
criteria.add(Restrictions.like("cust_name", "%"+cust_name+"%"));
}
//拼接客户级别
Dict level = customer.getLevel();
if(level!=null&&!level.getDict_id().trim().isEmpty()) {
criteria.add(Restrictions.eq("level.dict_id",level.getDict_id()));//后台也可以直接写level.dict_id 框架就是好啊
}
//拼接客户来源
Dict source = customer.getSource();
if(source!=null&&!source.getDict_id().trim().isEmpty()) {
criteria.add(Restrictions.eq("source.dict_id",source.getDict_id()));
}

//查询 默认不封装条件 就是查询所有
PageBean<Customer> page = customerService.findByPage(pageCode,pageSize,criteria);
//压栈
//先获取值栈
ValueStack vs = ActionContext.getContext().getValueStack();
//栈顶是map<"page",page>
vs.set("page", page);
/**
* 若是对象用push方法,因为在栈顶,对象名都可以省略不写最简单
* 若是集合用set方法 ,最为方便 list[0].username jstl:foreach表达式一循环 u.username更简单了
*/
return "page";
}

/**
* 初始化到添加的页面
* @return
*/
public String initAddUI() {


return "initAddUI";
}


/**
* 文件的上传,需要在Action类中提供成员属性,属性的命名是有规则的!!
* private File upload; //类型File固定的 属性名必须和前端的name属性值一模一样 此属性表示要上传的文件
* private String uploadFileName; //前一半"upload"是前端的name值 后一半的"FileName"固定 表示上传文件的名称,且不会出现中文乱码
* private String uploadContentType;//前一半"upload"是前端的name值 后一半"ContentType"固定 表示上传文件的MIME类型
* 最后提供set方法 拦截器就会自动帮你注入值了 多好
*/
private File upload;//要上传的文件 关键是这个麻烦的玩意儿 帮你封装好了 太强了
private String uploadFileName;//要上传的文件名
private String uploadContentType;//要上传的文件类型
public void setUpload(File upload) {
this.upload = upload;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
/**
* 保存客户的方法
* @return
* @throws IOException
*/
public String save() throws IOException {
//处理文件上传
if(uploadFileName!=null) {
//说明用户选择了要上传的文件
/*System.out.println("文件名:"+uploadFileName);
System.out.println("文件类型:"+uploadContentType);*/

//把名称处理下 获得唯一名称 传入filename为了获取后缀名
String uuidname=UploadUtils.getUUIDName(uploadFileName);

//把文件上传到"E:\\Tomcat\\apache-tomcat-8.5.4\\webapps\\upload"
String path="E:\\Tomcat\\apache-tomcat-8.5.4\\webapps\\upload\\";
//简单方式 新建一个文件 然后将封装的File upload文件copy到此新文件内
File file=new File(path+uuidname);//上面加了"//" 此处拼接时就不用加了
FileUtils.copyFile(upload, file);

//上传文件路径记录在数据库
customer.setFilepath(path+uuidname);
}

customerService.save(customer);
return "save";
}

/**
* 删除客户
*/
public String delete() {
//删除客户
//先获取客户上传文件的路径 将客户上传的文件全删了
customer=customerService.findById(customer.getCust_id());
//获取上传文件的路径
String filepath=customer.getFilepath();
//删除客户
customerService.delete(customer);
//再删除文件 很简单
File file=new File(filepath);//先获取文件
if(file.exists()) {
file.delete();
}
return "delete";
}

}

DictAction.java

package com.itheima.web.action;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.itheima.domain.Dict;
import com.itheima.service.DictService;
import com.itheima.utils.FastJsonUtil;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

/**
* 字典控制器0
* @author 寒面银枪
* 2019年7月4日-下午7:12:59
*/
public class DictAction extends ActionSupport implements ModelDriven<Dict>{

private Dict dict=new Dict();
public Dict getModel() {
return dict;
}

private DictService dictService;
public void setDictService(DictService dictService) {
this.dictService = dictService;
}


/**
* 通过字段的type_code值查询客户级别或者客户来源
*/
public String findByCode() {
//调用业务层去查
List<Dict> list = (List<Dict>)dictService.findByCode(dict.getDict_type_code());

//使用fastJson把list转成json字符串
String jsonString = FastJsonUtil.toJSONString(list);

//把json字符串写浏览器
HttpServletResponse response = ServletActionContext.getResponse();
FastJsonUtil.write_json(response, jsonString);
return NONE;
}

}

核心XML

applicationContext.xml

<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">

<!-- 整合Hibernate方式2:将hibernate.cfg.xml的配置完全转移到这里来 -->
<!-- 先配置c3p0连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql:///crm_28"/>
<property name="user" value="root"/>
<property name="password" value="1111"/>
</bean>

<!-- 编写一个名称固定的bean(spring提供的) 帮我们加载hibernate.cfg.xml的配置文件
这一个类一加载完,配置文件就加载完了 sessionFactory也创建好了
sessionFactory是重量级的,不能轻易销毁和创建,正好springIOC默认就是单例的
-->
<!-- 使用LocalSessionFactoryBean加载配置 可以将一些hibernate.cfg.xml的配置移到此处的属性里 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 先加载连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 加载方言 加载可选项 -->
<property name="hibernateProperties"><!-- 里面配属性文件 写法有点不一样 -->
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop> <!-- 没有表时帮忙生成表 -->
</props>
</property>
<!-- 最后引入映射的配置文件 -->
<property name="mappingResources">
<list>
<value>com/itheima/domain/User.hbm.xml</value>
<value>com/itheima/domain/Customer.hbm.xml</value> <!-- 写好了javaBean别忘记引入 让表自动生成 比较容易发现有没有少配置-->
<value>com/itheima/domain/Dict.hbm.xml</value>
</list>
</property>


</bean>

<!-- 事务模块 -->
<!-- 先配置平台事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<!--昨天传入连接池 今天就传入sessionFactory session能管理事务 -->
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 开启事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

<!-- 配置客户模块 -->
<bean id="customerAction" class="com.itheima.web.action.CustomerAction" scope="prototype">
<property name="customerService" ref="customerService"/>
</bean>
<bean id="customerService" class="com.itheima.service.CustomerServiceImpl">
<property name="customerDao" ref="customerDao"/>
</bean>
<bean id="customerDao" class="com.itheima.dao.CustomerDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>


<!-- 配置用户模块 注意Action必须多例-->
<bean id="userAction" class="com.itheima.web.action.UserAction" scope="prototype">
<property name="userService" ref="userService"/><!-- 手动注入service 其实就是注入一个属性 -->
</bean>
<bean id="userService" class="com.itheima.service.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="com.itheima.dao.UserDaoImpl"><!-- 立刻意识到service里要注入dao -->
<property name="sessionFactory" ref="sessionFactory"/>
</bean>

<!-- 配置字典类-->
<!-- 配置Action千万注意是多例的 又忘记了,唉! -->
<bean id="dictAction" class="com.itheima.web.action.DictAction" scope="prototype">
<property name="dictService" ref="dictService"/>
</bean>
<bean id="dictService" class="com.itheima.service.DictServiceImpl">
<property name="dictDao" ref="dictDao"/>
</bean>
<bean id="dictDao" class="com.itheima.dao.DictDaoImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>

<!-- <bean id="" class="org.apache.struts2.interceptor.FileUploadInterceptor"></bean> -->

</beans>

struts.xml

<?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">

<!-- 配置Action -->
<struts>
<!-- 设置常量 -->
<!-- 设置上传文件总大小的上限 默认值是2M struts.multipart.maxSize=2097152 (单个文件大小也可以设置)-->
<constant name="struts.multipart.maxSize" value="209715200"/> <!-- 加两个0 变200M -->

<!-- 先配置包结构 -->
<package name="crm" namespace="/" extends="struts-default">
<!-- 配置全局结果页面 -->
<global-results>
<result name="login" type="redirect">/login.jsp</result>
</global-results>

<!-- Action由spring来管理,那么此处的class属性只写spring中的id值即可 -->
<action name="customer_*" class="customerAction" method="{1}">
<!-- type默认请求转发 -->
<result name="page">/jsp/customer/list.jsp</result>
<result name="initAddUI">/jsp/customer/add.jsp</result>
<!-- 客户保存(添加)成功 需要转到客户列表查看 也即要转到另一个action 注意转到的action没有/ ".action"也可以省略也可以写-->
<result name="save" type="redirectAction">customer_findByPage</result>
<!-- 文件上传错误 文件过大 -->
<result name="input">/jsp/error.jsp</result>
<result name="delete" type="redirectAction">customer_findByPage.action</result>


<!-- 引入默认拦截器栈 修改上传文件类型 -->
<interceptor-ref name="defaultStack">
<!-- 设置fileUpload拦截器的allowedExtensions属性 能决定上传文件的类型-->
<param name="fileUpload.allowedExtensions">.jpg,.txt</param>
<!-- 设置单个上传文件的大小 也是200M-->
<param name="fileUpload.maximumSize">209715200</param>
</interceptor-ref>


</action>

<!-- 配置用户模块 -->
<action name="user_*" class="userAction" method="{1}">
<result name="loginOK" type="redirect">/index.jsp</result>
</action>

<!-- 配置字典Action -->
<action name="dict_*" class="dictAction" method="{1}">

</action>


</package>

</struts>

JSP

list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<TITLE>客户列表</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<LINK href="${pageContext.request.contextPath }/css/Style.css" type=text/css rel=stylesheet>
<LINK href="${pageContext.request.contextPath }/css/Manage.css" type=text/css
rel=stylesheet>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.11.3.min.js"></script>
<SCRIPT language=javascript>
// 提交分页查询的表单
function to_page(page){
if(page){
$("#page").val(page);
}
document.customerForm.submit();//提交下面的表单

}

//页面的加载
$(function() {
//alert("aaa");
//发送Adjx请求
var url="${pageContext.request.contextPath}/dict_findByCode.action";
var param={"dict_type_code":"006"};//key必须和属性值一样 千万别写错了 006查级别
$.post(url,param,function(data){
//alert(data);
//jquery遍历数组 翻笔记
$(data).each(function(i,n){//i迭代下标值 n迭代对象 或者不写参数 直接函数体内些this也行
//alert(i+":"+n.dict_type_code+":"+n.dict_type_name+":"+n.dict_item_name);//n.key 注意返回的是List<Dict> 遍历每次就是单个dict 取dict的属性
//alert(this.dict_item_name);

//选中上次的条件
//先获取值栈中的值 使用el表达式
var vsId="${model.level.dict_id}";
//alert(vsId);
//若本次遍历的是值栈中的id,则加个选中属性
if(vsId==n.dict_id){
$("#levelId").append("<option value='"+n.dict_id+"' selected>"+n.dict_item_name+"</option>");
}else{
$("#levelId").append("<option value='"+n.dict_id+"'>"+n.dict_item_name+"</option>");
}
});

},"json");

//获取来源
var param={"dict_type_code":"002"};//002 查来源
$.post(url,param,function(data){
$(data).each(function(){//i迭代下标值 n迭代对象 或者不写参数 直接函数体内些this也行
var vsId="${model.source.dict_id}";
if(this.dict_id==vsId){
$("#sourceId").append("<option value='"+this.dict_id+"' selected>"+this.dict_item_name+"</option>");
}else{
$("#sourceId").append("<option value='"+this.dict_id+"'>"+this.dict_item_name+"</option>");
}

});

},"json");



});

</SCRIPT>

<META content="MSHTML 6.00.2900.3492" name=GENERATOR>
</HEAD>
<BODY>
<FORM id="customerForm" name="customerForm" action="${pageContext.request.contextPath }/customer_findByPage.action" method=post>

<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
<TBODY>
<TR>
<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_019.jpg"
border=0></TD>
<TD width="100%" background="${pageContext.request.contextPath }/images/new_020.jpg"
height=20></TD>
<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_021.jpg"
border=0></TD>
</TR>
</TBODY>
</TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
<TBODY>
<TR>
<TD width=15 background=${pageContext.request.contextPath }/images/new_022.jpg><IMG
src="${pageContext.request.contextPath }/images/new_022.jpg" border=0></TD>
<TD vAlign=top width="100%" bgColor=#ffffff>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TR>
<TD class=manageHead>当前位置:客户管理 > 客户列表</TD>
</TR>
<TR>
<TD height=2></TD>
</TR>
</TABLE>
<TABLE borderColor=#cccccc cellSpacing=0 cellPadding=0
width="100%" align=center border=0>
<TBODY>
<TR>
<TD height=25>
<TABLE cellSpacing=0 cellPadding=2 border=0>
<TBODY>
<TR>
<TD>客户名称:</TD>
<TD>
<INPUT class=textbox id=sChannel2 style="WIDTH: 80px" maxLength=50 name="cust_name" value="${model.cust_name }">
</TD>

<td>客户级别:</td>
<td> <!-- ognl表达式的写法 struts2会帮你封装得很好(封装到level对象属性的dict_id字段里去) -->
<select name="level.dict_id" id="levelId">
<option value="">--请选择--</option>

</select>
</td>

<td>客户来源:</td>
<td> <!-- 同上 -->
<select name="source.dict_id" id="sourceId">
<option value="">--请选择--</option>

</select>
</td>


<TD>
<INPUT class=button id=sButton2 type=submit value=" 筛选 " name=sButton2>
</TD>


</TR>
</TBODY>
</TABLE>
</TD>
</TR>

<TR>
<TD>
<TABLE id=grid
style="BORDER-TOP-WIDTH: 0px; FONT-WEIGHT: normal; BORDER-LEFT-WIDTH: 0px; BORDER-LEFT-COLOR: #cccccc; BORDER-BOTTOM-WIDTH: 0px; BORDER-BOTTOM-COLOR: #cccccc; WIDTH: 100%; BORDER-TOP-COLOR: #cccccc; FONT-STYLE: normal; BACKGROUND-COLOR: #cccccc; BORDER-RIGHT-WIDTH: 0px; TEXT-DECORATION: none; BORDER-RIGHT-COLOR: #cccccc"
cellSpacing=1 cellPadding=2 rules=all border=0>
<TBODY>
<TR
style="FONT-WEIGHT: bold; FONT-STYLE: normal; BACKGROUND-COLOR: #eeeeee; TEXT-DECORATION: none">
<TD>客户名称</TD>
<TD>客户级别</TD>
<TD>客户来源</TD>
<TD>联系人</TD>
<TD>电话</TD>
<TD>手机</TD>
<TD>操作</TD>
</TR>
<c:forEach items="${page.beanList }" var="customer">
<TR
style="FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none">
<TD>${customer.cust_name }</TD>

<TD>${customer.level.dict_item_name }</TD>
<TD>${customer.source.dict_item_name }</TD>

<TD>${customer.cust_linkman }</TD>
<TD>${customer.cust_phone }</TD>
<TD>${customer.cust_mobile }</TD>
<TD>
<a href="${pageContext.request.contextPath }/customerServlet?method=edit&custId=${customer.cust_id}">修改</a>
  
<a href="${pageContext.request.contextPath }/customer_delete.action?cust_id=${customer.cust_id}" onclick="return window.confirm('确定删除吗?')">删除</a>
</TD>
</TR>

</c:forEach>

</TBODY>
</TABLE>
</TD>
</TR>

<TR>
<TD>
<SPAN id=pagelink>
<DIV style="LINE-HEIGHT: 20px; HEIGHT: 20px; TEXT-ALIGN: right">
共[<B>${page.totalCount}</B>]条记录,共[<B>${page.totalPage}</B>]页
,每页显示
<select name="pageSize">
<option value="2" <c:if test="${page.pageSize==2 }">selected</c:if>>2</option>
<option value="3" <c:if test="${page.pageSize==3 }">selected</c:if>>3</option>
<option value="4" <c:if test="${page.pageSize==4 }">selected</c:if>>4</option>
<option value="5" <c:if test="${page.pageSize==5 }">selected</c:if>>5</option>
<option value="10" <c:if test="${page.pageSize==10 }">selected</c:if>>10</option>
</select>

<c:if test="${page.pageCode>1 }">
[<A href="javascript:to_page(${page.pageCode-1})">前一页</A>]
</c:if>
<B>${page.pageCode}</B>
<c:if test="${page.pageCode<page.totalPage }">
[<A href="javascript:to_page(${page.pageCode+1})">后一页</A>]
</c:if>

<input type="text" size="3" id="page" name="pageCode" /><!-- 仅此name是pageCode 改完后直接提交即可 -->


<input type="button" value="Go" onclick="to_page()"/>
</DIV>
</SPAN>
</TD>
</TR>
</TBODY>
</TABLE>
</TD>
<TD width=15 background="${pageContext.request.contextPath }/images/new_023.jpg"><IMG
src="${pageContext.request.contextPath }/images/new_023.jpg" border=0></TD>
</TR>
</TBODY>
</TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
<TBODY>
<TR>
<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_024.jpg"
border=0></TD>
<TD align=middle width="100%"
background="${pageContext.request.contextPath }/images/new_025.jpg" height=15></TD>
<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_026.jpg"
border=0></TD>
</TR>
</TBODY>
</TABLE>
</FORM>
</BODY>
</HTML>

add.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<TITLE>添加客户</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<LINK href="${pageContext.request.contextPath }/css/Style.css" type=text/css rel=stylesheet>
<LINK href="${pageContext.request.contextPath }/css/Manage.css" type=text/css rel=stylesheet>
<META content="MSHTML 6.00.2900.3492" name=GENERATOR>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.11.3.min.js"></script>
<SCRIPT language=javascript>
//页面的加载
$(function() {
//发送Adjx请求
var url="${pageContext.request.contextPath}/dict_findByCode.action";
var param={"dict_type_code":"006"};//key必须和属性值一样 千万别写错了 006查级别
$.post(url,param,function(data){
//jquery遍历数组 翻笔记
$(data).each(function(i,n){//i迭代下标值 n迭代对象 或者不写参数 直接函数体内些this也行
//选中上次的条件 多余的懒得删
//先获取值栈中的值 使用el表达式
var vsId="${model.level.dict_id}";
//若本次遍历的是值栈中的id,则加个选中属性
if(vsId==n.dict_id){
$("#levelId").append("<option value='"+n.dict_id+"' selected>"+n.dict_item_name+"</option>");
}else{
$("#levelId").append("<option value='"+n.dict_id+"'>"+n.dict_item_name+"</option>");
}
});

},"json");

//获取来源
var param={"dict_type_code":"002"};//002 查来源
$.post(url,param,function(data){
$(data).each(function(){//i迭代下标值 n迭代对象 或者不写参数 直接函数体内些this也行
var vsId="${model.source.dict_id}"; //多余的懒得删 留着吧 更智能
if(this.dict_id==vsId){
$("#sourceId").append("<option value='"+this.dict_id+"' selected>"+this.dict_item_name+"</option>");
}else{
$("#sourceId").append("<option value='"+this.dict_id+"'>"+this.dict_item_name+"</option>");
}
});

},"json");

});

</SCRIPT>

</HEAD>
<BODY>
<FORM id=form1 name=form1 action="${pageContext.request.contextPath }/customer_save.action" method=post enctype="multipart/form-data">
<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
<TBODY>
<TR>
<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_019.jpg"
border=0></TD>
<TD width="100%" background="${pageContext.request.contextPath }/images/new_020.jpg"
height=20></TD>
<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_021.jpg"
border=0></TD>
</TR>
</TBODY>
</TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
<TBODY>
<TR>
<TD width=15 background=${pageContext.request.contextPath }/images/new_022.jpg><IMG
src="${pageContext.request.contextPath }/images/new_022.jpg" border=0></TD>
<TD vAlign=top width="100%" bgColor=#ffffff>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TR>
<TD class=manageHead>当前位置:客户管理 > 添加客户</TD>
</TR>
<TR>
<TD height=2></TD>
</TR>
</TABLE>

<TABLE cellSpacing=0 cellPadding=5 border=0>


<TR>
<td>客户名称:</td>
<td>
<INPUT class=textbox id=sChannel2 style="WIDTH: 180px" maxLength=50 name="cust_name">
</td>
<td>客户级别 :</td>
<td>
<select name="level.dict_id" id="levelId" style="WIDTH: 180px" maxLength=50>
</select>
</td>
</TR>

<TR>
<td>信息来源 :</td>
<td>
<select name="source.dict_id" id="sourceId" style="WIDTH: 180px" maxLength=50>
</select>
</td>
<td>联系人:</td>
<td>
<INPUT class=textbox id=sChannel2 style="WIDTH: 180px" maxLength=50 name="cust_linkman">
</td>
</TR>

<TR>
<td>固定电话 :</td>
<td>
<INPUT class=textbox id=sChannel2 style="WIDTH: 180px" maxLength=50 name="cust_phone">
</td>
<td>移动电话 :</td>
<td>
<INPUT class=textbox id=sChannel2 style="WIDTH: 180px" maxLength=50 name="cust_mobile">
</td>
</TR>

<TR>
<td>联系地址 :</td>
<td>
<INPUT class=textbox id=sChannel2 style="WIDTH: 180px" maxLength=50 name="cust_address">
</td>
<td>邮政编码 :</td>
<td>
<INPUT class=textbox id=sChannel2 style="WIDTH: 180px" maxLength=50 name="cust_zip">
</td>
</TR>
<TR>
<td>客户传真 :</td>
<td>
<INPUT class=textbox id=sChannel2 style="WIDTH: 180px" maxLength=50 name="cust_fax">
</td>
<td>上传资质 :</td>
<td>
<input type="file" name="upload"/>
</td>
</TR>
<tr>
<td rowspan=2>
<input class=button id=sButton2 type=submit value=" 保存 " name=sButton2>
</td>
</tr>
</TABLE>


</TD>
<TD width=15 background="${pageContext.request.contextPath }/images/new_023.jpg">
<IMG src="${pageContext.request.contextPath }/images/new_023.jpg" border=0></TD>
</TR>
</TBODY>
</TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="98%" border=0>
<TBODY>
<TR>
<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_024.jpg"
border=0></TD>
<TD align=middle width="100%"
background="${pageContext.request.contextPath }/images/new_025.jpg" height=15></TD>
<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_026.jpg"
border=0></TD>
</TR>
</TBODY>
</TABLE>
</FORM>
</BODY>
</HTML>

 

举报

相关推荐

RHCSA第二天

CSS第二天

html第二天

出差第二天

MySQL第二天

集合第二天

java第二天

DOM第二天

JavaSE 第二天

【JavaSE 第二天】

0 条评论