十七: 当使用拦截器,给拦截器注入参数的时候
<param name="拦截器名.可以set的属性的命(去对应的拦截器中找set方法)"></param>
动态指定action的input的值在action中定义一个属性inputpage
在配置文件中的input指定${inputAction}
执行到哪个拦截器没有通过这个拦截器的验证,那么就只能走到这个拦截器,不进入action的方法,就直接返回input或者拦截器指定的页面了
十八: 动态的给配置文件中result的name=input赋值的时候,出现未进入action就返回input的也没指向null的解决方法
/**由于使用了fileUpload拦截器,如果有错误会在拦截器中直接返回了input指定的页面
* 由于input是动态指定的页面,inputPage指向的动态路径,是进入到action以后才给它赋得值
* 所以需要在fileUpload之前将inputPage的值给指定了,经查看发现prepare拦截器在fileUpload拦截器之前
* 所以在这里使用prepare*方法给inputPage赋值
只要在fileUpload拦截器之前给其赋值都可以的
十九:通过序列化和反序列化深度复制对象图
/** * 深度复制,将源对象转换成字节数组,然后从新组装,虽然值相同,但是已经和原来的对象没有关系了 * @param src 源对象 * @return 复制出来的对象,是一个新的对象,而不是对原先对象的引用 */ public static Serializable deeplyCopy(Serializable src){ try { //定义一个字节数组输出流,通过序列化将对象变成字节数组 ByteArrayOutputStream baos=new ByteArrayOutputStream(); //定义个对象输出流 ObjectOutputStream oos=new ObjectOutputStream(baos); //把要复制的对象写入到字节数组中 oos.writeObject(src); //关闭流 oos.close(); baos.close(); //从字节输出流中获取字节数组 byte[] data=baos.toByteArray(); //通过字节数组输入流 反序列化将字节数组组装成对象 ByteArrayInputStream bais=new ByteArrayInputStream(data); ObjectInputStream ois=new ObjectInputStream(bais); Serializable copy=(Serializable)ois.readObject(); //关闭流 ois.close(); bais.close(); return copy; } catch (Exception e) { e.printStackTrace(); } return null; }
注意:
* 需要深度复制的对象必须实现序列化接口Serializable
* 如果不想深度复制对象图中某系相关联的对象,在关联的属性上加上transient这个关键字,在深度复制的时候不会复制该对象
相当于在这个关键字这里对象图的链已经断开了
二十:action实现parameterAware可以将页面提交过来的参数注入到当前的action
使用哪个button提交,也会将该button的name和value也当成参数提交过去
button没有点击不会激活传递到后台
二十一:使用动态表单获取参数与回显数据
1,action实现parameterAware,注入parameter
将当前的页面整个保存到session中
/** * 注入session对象,实现parameterAware以后必须实现的方法 */ public void setSession(Map<String, Object> session) { this.sessionMap=session; } Map<Integer,Map<String,String[]>> map=sessionMap.get(ALL_PARAMS); map.put(currPid, paramsMap);
2,循环遍历,在jsp页面中定义
二十二:如果form和按钮都有action,按钮上的为主,按钮的覆盖表单上的
二十三:在表单上disable和readonly的区别
* readonly只读,在表单上不可操作
但是提交form表单的时候会提交到后台去
* disable 禁用,在表单上也不可以操作
但是提交form的时候不会提交到后台去
文章评论