OA总结





1.  使用s:a标签,可以自动生成工程名前缀和扩展名后缀,且会自动将中文转换为UTF-8编码 
提示文本框确定是否要删除
<s:a action="role_delete?id=%{id}" οnclick="return confirm('确定要删除么?')">删除</s:a>    
    


2.  页面或者配置文件中的动作带参数,在POJO中或者实现modelDriven,自己写参数传来的字段,
并设置getter/setter属性(modelDriver中可以不写,POJO中可以定义自己的),则可以自动获取





3.  




4.  修改页面数据回显:


// 方式1:将要回显数据的对象放到map域中

/** 修改页面 */
public String editUI() throws Exception {
// 准备要回显的数据并将其放到map域中
Role role = roleService.getById(model.getId());
ActionContext.getContext().put("role",role);

// 注: 如果放到map域中还需要设置字段的值用来回显
model.setName(role.getName());

return "saveUI";
}


<body>
<s:form action="role_edit">
<s:hidden  name="id"></s:hidden>
名称:<s:textfield name="name" ></s:textfield> <br/><br/>
<!--  
注: 此时实际上省略了默认的value属性,完整如下:
<s:textfield name="name" value="%{name}"></s:textfield> <br/><br/>
-->
<s:submit value="添加"></s:submit>
</s:form>
</body>








// 方式2:将要回显数据的对象放到值栈对象的栈顶,在jsp页面获取属性方便,常用

/** 修改页面 */
public String editUI() throws Exception {
// 准备要回显的数据
Role role = roleService.getById(model.getId());
// 得到值栈对象并将要回显数据的对象放在栈顶,这样可以方便直接获取
ActionContext.getContext().getValueStack().push(role);
return "saveUI";
}


<body>
<s:form action="role_edit">
<s:hidden  name="id"></s:hidden>
名称:<s:textfield name="name" ></s:textfield> <br/><br/>
<s:submit value="添加"></s:submit>
</s:form>
</body>



5. 使用UML设计实体


6. 合并添加修改页面的方式:
1. Action中  addUI()和editUI()的方法的返回值都为saveUI,saveUI转向saveUI.jsp
2. 写saveUI.jsp,根据是否传id值来确定是转向添加页面还是修改页面
  <s:form action="role_%{id==null?'add':'edit'}">
<s:hidden name="id"></s:hidden>
......其他内容
  </s:form>



7. 步骤:
注: 此时是没有BaseAction,BaseDao,BaseDaoImpl的一般的MVC模式
1. 创建Action类,并在类上加注解@Controller和@Scope("prototype")
2. 写其中的方法:CRUD的6个方法(方法名、返回值、注释)
3. 创建JSP页面,此时为提示界面,并未完全实现
4. 配置struts.xml
5. 测试
6. 创建空的service接口,并在action中创建引用,并在引用上面写@Resource注解
7. 实现Action中的方法,此时先在service中创建需要的方法,先写注视但不实现
8. 创建serviceImpl类,并在类上写@Service注解,实现service接口中的方法
9. 创建空的dao接口,并在service中创建引用,并在引用上面写@Resource注解
10.创建daoImpl类,并在类上写@Repository注解,实现dao接口中的方法   
11.写页面
12.测试



8. alt + shift + a : 快操作模式




9. 不要同时解决俩个大问题,分开解决。 关注当前的问题。




10.struts2标签的回显   案例中的部门回显




11.如果想级联删除关联的元素,在POJO.hbm.xml配置中对应的属性添加cascade属性即可
   注意与inverse的区别,inverse是用来维护关系的,并没有删除元素,只是解除了关系。



12.要使用全角空格来避免网页自动忽略空格


13.修改类似syso之类的快捷键模版:
eg: 将ActionContext.getContext().put("",..);改为put快捷键
Window--> preferences --> 查找template --> 选中Templates
点击New, Name改为put, 
Pattern改为: ActionContext.getContext().put("${var}",${var});${cursor}即可;
注:${var}表示临近的变量。

14.会使用静态包含导入公共的header.jspf片段,然后在子JSP中引入该片段
<%@ include file="/WEB-INF/jsp/public/header.jspf"%>

15.@Transaction注解,当写到类上时,
该注解可以被继承:对本类中的公共方法有效,对子类中的公共方法有效。
但是对父类中的公共方法无效。所以该注解一般写在父类上。
注:注解是否可以被继承,需要在配置中配置。

16.struts标签<s:select multiple="true"/>即为多选
   <s:radio name="gender" list=" %{ #{'男':'男','女':'女'} }  "/>
   <s:radio name="gender" list=" %{ {'男','女'} }  "/>


17.public List<T> getByIds(Long[] ids) {
if (ids == null || ids.length == 0) {
// 对于集合,如果为null,不要返回null,
// 应返回的是空的list集合,但是ArrayList定义一个默认长度是10,会占用资源
// 所以使用Collections.EMPTY_LIST,里面没有长度,不占用资源
return Collections.EMPTY_LIST;
}
return list;

    
18. 需要jar包: commons-codec-1.3.jar
使用codec.digest.DigestUtils包的DigestUtils的md5Hex方法
设置默认的密码为123456
String md5 = DigestUtils.md5Hex("123456");




19. 先完成一个模块,当做下一个模块时,需要关联之前的模块时,可以在修改。




20. 如果有需要刚开始就放到数据库中的内容,在需要自己创建一个初始化类,
直接用SessionFactory.getSession().save(entity)保存即可


21. treeView插件树状结构的使用


22. 在jsp页面中写<%-- --%>注释,不会在源代码上显示,而<!-- --!>会在JSP页面中显示


23. set无序,不重复;  
list有序,重复;
TreeSet和LinkedHashSet有序,

24. POJO.hbm.xml配置文件中,<set>元素有一个order-by属性,可以用来排序,使得查询出来的数据
列表按一定的顺序(以某一字段为序)显示,


25. 用户的登录与注销可以单独写一个Action
由ActionContext获取session: 不依赖servletAPI
ActionContext.getContext().getSession();
而由request获取session,则以来ServletAPI
ActionContext.getContext().getRequest().getSession();  没有这个方法


26. 在Action中可以直接使用addFieldError("login","密码不正确");
可以在JSP页面中用如下方式获取错误:
<s:fielderror fieldName="login"/> 显示指定的错误
<s:fielderror /> 显示所有的错误

27. struts2标签通过showPassword="false"属性设置密码不需要回显                        
<s:password size="20" cssClass="TextField" showPassword="false" name="password" />


28. <s:a action="user_list">用户列表</s:a>
等价于<a href="${pageContext.request.contextPath}/userAction_list.do">用户列表</a>




29. 学会使用FrameSet来控制页面布局



30. @Scope("prototype")是为了是为了线程安全问题而使用的多例。
    当没有涉及公共资源时,该注解可以省略,即可以使用单例

31. 比方说权限这类数据,数据量不大,又一直要用,而且每次查询的所有权限结果列表都一样,
所以可以将其放到缓存中,查询一级即可。 要放到公共存放数据的地方,所以要放到application中  

32. 技巧:当遍历时需要对应的图标时,可以在图片的路径中图片的名称改为${id},
 然后将图片的名称改为对应的id即可。
    如: 遍历: <img src="style/images/MenuIcon/${id}.gif" class="Icon" />


33. 获取session:
pageContext.getSession().getAttribute("user");
而在Action中获取session:
ActionContext.getContext().getSession().getAttribute("user");



34. // 获取全局的作用域application
ServletContext application = sce.getServletContext(); 
// 获取spring的监听器中创建的spring容器对象
ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(application);
// 从spring容器中取出PrivilegeService的对象实例
PrivilegeService privilegeService = (PrivilegeService) ac.getBean("privilegeServiceImpl");                  



// 查询出所有权限的Url集合并放到application作用域中
List<String> allPrivilegeUrls = privilegeService.getAllPrivilegeUrls();
application.setAttribute("allPrivilegeUrls", allPrivilegeUrls);

// 注: 此处将topPrivilegeList放到了application作用域中了,在jsp中要用#application.topPrivilegeList获取
application.setAttribute("topPrivilegeList", topPrivilegeList);


Collection<String> allPrivilegeUrls = (Collection<String>) ActionContext.getContext().getApplication().get("allPrivilegeUrls"); 




35. 区分struts2的监听器,拦截器


监听器要写监听器类,实现监听器接口,并在web.xml中配置
拦截器要写拦截器类,实现拦截器接口,并在struts.xml文件中配置拦截器栈。


36. 解决tomcat重启后还得继续登录的问题:
实现序列化接口: 
在tomcat关闭的时候,会将session钝化到C:\apache-tomcat-6.0.35\work\Catalina\localhost\itcastOA,生成一个文件
在tomcat重启的时候,会将钝化后的session文件从目录中序列化还原到内存中,该文件消失,
然后刷新页面的时候不用再重新登录,仍然是原有的User对象。


37. 登录页面嵌套的问题:
session的默认存在时间为半小时,如果过半小时未操作,则会注销。
模拟: 在新建页面打开, 然后注销,在原来的窗口点连接,会在目标位置出现登录页面,
而不是在整个页面显示登录页面,出现了登录页面嵌套的问题。
解决方案:
方案1:刷新一下即可;
方案2:在loginoutUI.jsp页面添加:
<head>
<script type="text/javascript">
// 如果有父窗口,就在父窗口刷新 
if(window.parent != window){
window.parent.location.href = window.location.href;
}
</script>
</head>



38. HQL语句
分页:
如下 没有limit关键字,需通过setFirstResult(0)和setMaxResults(1)方法指定  
CASE语句:
"FROM Topic t WHERE t.forum=? ORDER BY (CASE t.type WHEN 2 THEN 2 ELSE 0 END) DESC, t.lastUpdateTime DESC")//                




39. <%-- 最上面的不能上移 注:status在map栈中,所有要加#号--%>
<s:iterator value="forumList" status="status">
<s:if test="#status.first">
<span style="color: gray; cursor: pointer" >上移</span>
</s:if>
<s:else>
<s:a action="forumManage_moveUp?id=%{id}">上移</s:a>
</s:else>
</s:iterator>

40. ctrl + H 快捷键  搜索


41. 学会使用jquery的validation框架


42. struts2标签转换日期格式:
<s:date name="lastTopic.postTime" format="yyyy年MM月dd日 HH:mm:ss"/>




43. 防止HTML标签的自动转义
<s:property value="#topic.title" escape="true"/>

44. 在线编辑器FCKeditor的使用


45. // TODO待完成任务   FIXME紧急任务


46. 注释的时候有多行,加<br/>可以实现换行


47. 

























  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值