一:
在eclipse中jar包不能在lib下分类存放,如果分类存放,则会发生找不到类的异常
二:
在struts中使用validate和prepare的时候后面跟的是方法名(第一个字母大写),也可以加Do方法名
三: session关注
在struts的action中可以实现SessionAware接口,在经过session拦截器的时候会自动的创建
注入struts封装的session(是一个map集合)
四:自定义登录拦截器:
将自定义的拦截器放在所有的拦截器之前,从自定义拦截器中可以获取到当前访问的action
在这里可以做一些业务逻辑的判断
还可以在这里将一些值注入到访问的action中,必须实现接口化的编程,类似于sessionAware接口
注入的值最好是公共的。
如果单独为这个action设计一个接口,注入属性的值或者什么的也是可以的
五:自定义UserAware,用户关注对象(接口,参考sessionAware),哪个action需要user对象就在该action中实现这个UserAware,在登录拦截器中获取访问的action,是否instance of User关注,如果实现了用户关注了的话,就可以在登录拦截器中将session中的user对象注入到需要的action中
public String intercept(ActionInvocation invocation) throws Exception { Action action=(Action) invocation.getAction(); //如果进入的action是注册或者登录的action就放行 if(action instanceof RegAction ||action instanceof LoginAction){ return invocation.invoke(); } else{ //获取登录的用户session User user= (User) ServletActionContext.getRequest().getSession().getAttribute("loginUser"); if(user==null){ return "login"; } //如果用户登录了,判断该访问的action是否实现了UserAwre if(action instanceof UserAware){ //将user对象注入实现该接口的action中 ((UserAware)action).setUser(user); } //放行 return invocation.invoke(); } }
六:压栈是把对象的引用放入栈顶
压栈只是在进入action的之前压栈,执行action以后再改变action中的模型值,就相当于将model指向了新的对象,返回出去的时候不会再把model压入栈顶,所以栈中还是保存原来对象的引用
使用prepare拦截器解决这种问题,
但是在prepare拦截器之前没有拦截器给属性赋值
使用paramsPrepareParamsStack拦截器栈(可以查看struts-default.xml查看该配置)可以在prepare之前将参数传递过去
* 只要在action中给model赋值,就必须在preparexx或者prepareDoxxx中赋值
七: 解决懒加载的问题
1,一劳永逸:在web.xml中 必须
struts拦截器运行完以后不放行,所以解决懒加载的过滤器OpensessionViewFilter,要在之前使用
会将session的关闭延迟到页面渲染结束,如果网络不是很通畅的话,会占用数据库的连接资源,
缺点: 占用数据库资源,特别是在高并发的项目中,db是项目优化的瓶颈
2,在业务层中强行初始化,在高并发的系统中,效果要好的多
在事务关闭之前将值取出来就可以,类似于
public Survey getSurveyWithChildren(Integer sid){ Survey s = surveyDao.getEntity(sid); for(Page p : s.getPages()){ p.getQuestions().size(); } return s; }
3,关闭所有的懒加载
会造成大量的数据的冗余
解决懒加载优缺点对比:
使用配置web.xml的方法
优点:网络传输的数据,不是一次性的全部传完,而是用到的时候根据代理对象中的id去数据库中拿,相对来说传输的效率高些,客户的体验度好些
缺点:延迟session的关闭,极长时间的占用DB的链接资源,特别是在高并发的系统中
使用强行初始化的方法
优点:数据库资源的快速释放,
缺点:一次性传输到客户端的数量大
文章评论