巴巴运动网功能设计

1. 类别表里面, 一般不直接物理删除类别, 只是将可见标识设为不可见 
a) 分类功能有:    分页查看, 添加, 修改, 删除, 查询, 分级 2. 环境搭建,  
a) 一个一个环境的搭, 不要一口气全把jar包加进去 b) 顺序 
1. 先搭JPA 
a) jar包 
b) 加注解的实体类 i. @entity  @id  @generoal  @column c) persistence.xml 2. 数据库jar包 3. 再建Spring环境 
a) beans.xml 
b) 这时beans.xml里面的数据库属性与persistence.xml里面的数据库
属性有冲突 c) 写service类 4. 建Struts环境 
a) web.xml里面   listener  和 servlet b) struts-config.xml 
c) 写action,  注意给加上@Controler并且   把(“”)设为跟struts
里面配的路径一样的名称 
3. 类别的一对多自联映射 
a) 建一个属性    父类别   使用类别对象;   然后@onetoone b) 建一个属性    子类别   使用set集合   然后@onetomany c) 设置级联casecade={casecadeType.xxx} 
d) 因为是双向关系, 所以要定义维护方和被维护方,  一对多中,一的一方是被维护方  4. 把jsp中的包含代码放到一个jsp文件中, 其它的jsp包含这个jsp就行了 5. 关于分页 
a) 从数据库取出的是 
1. 数据集 2. 总数据条数 
a) 要传递给数据库的是 
1. 起始索引--- 2. 需要的条数 
b) 从Web层得到的是 
1. 当前页(即要显示哪一页) -------------------唯一由用户指定 2. 每页条数----------------------------------编程默认 
c) web层显示的是 
1. 页码 2. 当前页  3. 总页数 4. 总记录数 
5. 每页显示记录数 6. 数据集 




























1. 这些东西需要被封装成Web层使用的Page对象 2. 有些是被算出来的 
d) 可以优化的地方 
1. 当前页的页码变粗, 且不可点击 
2. 将页面杂七杂八的显示信息提取到一个jsp中 
a) 添加一个表单, 表单的路径提交到分页列表的url 
b) 添加页码连接之后, 触发表单的提交, 提交表单之前设置表单的
page请求参数为当前点击的页码 
3. js函数如果有参数, 在使用的时候一定要      ’el取值’   防止值为
空时出错 
6. 可以把增删改查共用同一个formbean, formbean不需要构造函数, 全部提交到一个
DispatchAction 
a) 属性设为method 
1. 去增加界面的method为 addUI 2. 去增加的method为 add 
b) 在 
7. 把所有页面的操作返回消息放在share/message.jsp里面, 同时传递一个url, 即确定
后返回到哪里 
8. 用<a>包含一张图片, 点图片就去href 9. 标题放在表格的第一行最左边 10. 可以把div放在单元格中 11. 颜色 
a) 表头背景6f8ac4    表格背景f5f5f5 
12. 在某一层类型里面加的类型应该还属于该层   即父节点 13. EL表达式 
a) 取   url参数是  ${param.xxx } 
b) 求 List长度   用${fn:length(list)}     fn为prefix  
1. 这时有延迟加载问题, 因为session已经关闭了, 解决方法是
OpenEntityManageInView 
c) function里面的length还可以求字符串的长度 
14. 如果修改页面是用struts表单, 为了能显示出来要修改的数据, 可以在前一个action
里面把值设到form里面去 15. jpa 
a) 没有主键uuid, 如果要用uuid, 不能general,  要@column之后, 自己生成 b) 外键JoinColumn c) @Lob是长文本的标注 
d) 枚举是@Enumerated(EnumType.STRING) 
e) 如果要设置多个级联, 就用cascade={xxx, xxx} 
16. 查询后, 会分页显示, 如果数目大于页面容量, 在翻到第二页时, 会出问题, 因为这时
没有查询条件了 
a) 所以, 要在分页显示中, 加入隐藏字段, 记录查询条件 b) 在分页显示的前置action里面判断是否加入查询条件 17. struts文件上传时 
a) 表单中要加enctype="multipart/form-data"      


















b) FormBean中用FormFile来接收 
c) 可以通过image/xxx/”year”/”month”/”day”/”hour”/uuid.ext来生成文
件名,   时间通过SimpleDateFormat来做 d) ext可以通过表单中文件对象的文件名截取 e) 先判断文件夹存不存在, 如果不存在, 就创建 f) 再用流写入 g) 记得关闭流 18. 文件上传时类型问题 
a) 客户端要判断一次, 减轻压力 b) 服务器端也要判断一次,  
1. 判断文件名时,要都小写或都大写 
c) 反射技术限定文件名可以将上传文件字段抽取出来, 然后可以在各formbean通用 
PropertyDescriptor[] propertydesc = 
Introspector.getBeanInfo(this.getClass()).getPropertyDescriptors();   for(PropertyDescriptor property : propertydesc){    if(property.getName().equals(propertyName)){   
 
 
Method method = property.getReadMethod();  
 
 
d) 可以取代反射技术的是, 将验证函数的参数设为 FormFile, 就可以不用反射, 而
直接调用参数的方法进行判断 
e) FormFile对象.getContentType() 可以返回”image/jpeg”样式的文件类型 19. 如果要直接写下一个List, 可以List list = Arrays.asList( xxx, xxx2 ,xxx4); 20. List的contains ()可以返回一个值是否在List里面 21. 分帧后, 右侧滚动使用scroll=”auto” 22. 显示图片时, 可以只设宽度, 高度不设 
23. 有时候要把url存到request里面, 再传到message页面, 让message页面的确定按
钮点击后可以转到对应的页面 a) 这时, 应该把url独立到配置文件中, 以key来使用 
b) 调用类里面把properties定义成静态, 写静态代码段来装载, 再用静态方法来获取 24. 做js全选 
a) , 可以把所有勾选框的名字搞成一样的, 通过this.form.xxx将名字xxx传到函数
中 
b) 把全选按扭的名字也传到函数中 
c) 函数中获得全选勾选框的状态后, 将xxx数组的状态设成一样的 d) 注意, 全选框和函数的名称不能相同 
function allselect(allobj,items){ 
     var state = allobj.checked;    
   if(items.length){ 
       for(var i=0;i<items.length;i++){         if(!items[i].disabled) items[i].checked=state; 
       }    
    }else{ 
      
 
if(!items.disabled) 


















items.checked=state;  
         } 
i.  
25. formbean中可以用数组来接收勾选框的值 
a) 然后在数据库中查找对应的数据 i. select o.filepath from UploadFile o where o.id in("+ jpql.toString()+ 
") 
26. 枚举 
a) 例如与性别有关的可以使用枚举 
b) 枚举相当于是一个类, 它里面的成员变量是继承枚举对象本身的一些类 
1. 所以可以给枚举对象声明一些抽象方法 
2. 然后枚举的所有值(成员变量) 都要实现这些方法(在变量后面加{}) 
27. 巴巴运动网把产品的  样式、类型、品牌   独立成类了,  单独管理 
28. 添加产品时, 类别是多级的, 这时, 可以点击添加类别后弹出一个新的页面, 在这个新
的页面里面显示一级类别, 如果有下级, 点击后就显示下级, 如果没有下级, 点击后就选择该类别 
a) 有一堆单选radio, 要选择后确定, 可以设隐藏字段, 当选择某一个之后把值设到
隐藏字段中, 确定后提交表单到上一个网页 
29. where o.parent.id = null 30. <c:foreach/> 里面 
a) varStatus=”loops” 是专门获取循环状态的 
b) index是从0开始的,  第n次循环, index的值为n-1 c) count是从1开始的,  第n次循环, count的值为 n d) 用法 :    ${loops.count} 31. js打开一个新网页 
theWindow = window.open (strURL,strName,"width="+width+" height="+height+" scrollbars=yes left="+(1024-width)/2+" top="+(768-height)/2);  
if (theWindow.opener == null) theWindow.opener = window; 
      if (window.focus) theWindow.focus(); 
a) js的被打开窗口里面的js可以直接用opener调用原始窗口了 
32. 页面的层级导航 
a) 因为是层级, 所以相互之间有父子关系 b) 做法 
1. 在要打开的网页之前的action里面求层级列表 2. 即通过要去的网页推出其各个父节点 3. 把父节点存入list 4. 在网页中显示 
c) where(parent = type.getParent() != null) 会进入死循环,  因为parent会被隐
含的new出来 
d) 要把层级反过来, 所以先存到list里面去, 再借助数组反一次或在页面中反过来
显示 i. 也可以在页面反 
<c:set var="menuout" value="&gt;&gt;<a href=''>${menu.name}</a>${menuout}"/> 


















ii. 最后的${ menuout }是关键,   即利用el表达式反向拼串 
iii. 
然后输出就行<c:out value="${menuout}" escapeXml="false"/> 1. 其中escapeXml="false"是不对输出中的html代码进行格式化. 
e) 顶级目录单独加在前面 33. 另一个文本编辑器tinyMCE 
a) 在表单验证之前, 要调用下面一个方法, 因为tinyMCE是使用的替换 
tinyMCE.triggerSave();//手动把iframe的值赋给textarea表单元素 
b)  
34. 优化表单校验 
a) 先定义表单项对象 
1.  
function Formfield(name, label){  this.name=name;  this.label=label; 

b) 再通过循环进行验证 i. 123  
function verifyForm(objForm){ 
 tinyMCE.triggerSave();//手动把iframe的值赋给textarea表单元素 
var list  = new Array(new Formfield("name", "产品名称
"),new Formfield("typeId", "产品类型"),......); 
 for(var i=0;i<list.length;i++){    var objfield = eval("objForm."+ list[i].name);    if(trim(objfield.value)==""){ 
  
 
 alert(list[i].label+ "不能为空"); 
if(objfield.type!="hidden" && objfield.focus()) 
objfield.focus(); 
   return false; 
  } 
 } 
 var imagefile = objForm.imagefile.value; 
var ext = imagefile.substring(imagefile.length-3). 
toLowerCase(); 
 if (ext!="jpg" && ext!="gif" && ext!="bmp" && ext!="png"){   alert("只允许上传gif、jpg、bmp、png!");   return false;   } 
  return true; } 
c) 表单提交的部分 i. 1  
function SureSubmit(objForm){  if (verifyForm(objForm)) objForm.submit(); 
































































































































































































































































































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值