在多个地方用到的值要抽取到常量类中
request.setAttribute(TableConstants.TOTAL_ROWS, (int) page.getTotalCount());
/* */ public class TableConstants
/* */ {
/* */ public static final String TOTAL_ROWS = "totalRows";
/* */ }
对于公共的值还可以抽取到父类中
public String execute() throws Exception {
return SUCCESS;
}
public abstract interface Action
{
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
public abstract String execute()
throws Exception;
}
对于工具类或一些公共类可以使用优秀开源的api,如:guava-12.0.jar
public void save() {
List majors = Lists.newArrayList();
}
建议统一异常处理,不仅要在日志中打印异常堆栈信息,还得给前端统一格式的响应信息,而不是前端页面直接提示给用户500
try {
} catch (Exception e) {
e.printStackTrace();
}
对于list 实体需要进一步遍历处理的,需要考虑到list 为null的情况
List emp = collegeService.find(filters);
if (null != emp && emp.size() > 0) {
jsonMap.put("result", "N");
}
对于后台采用map封装的key value 数据,在发回给前端的时候建议都统一转为json格式
public void checkUnique() {
Map jsonMap = Maps.newHashMap();
jsonMap.put("result", "Y");
// map 转json
Struts2Utils.renderJson(jsonMap);
}
对于多表insert、delete、update 的操作建议要根据每个操作的影响行数来判断操作是否成功,保证之后的逻辑安全性,金融项目尤其需要注意
int course = courseStudentDao.convert(fromEmpNo, toEmpNo);
int talent = talentDao.convert(fromEmpNo, toEmpNo);
int idp = idpOnJobDao.convert(fromEmpNo, toEmpNo);
map.put("Training Record", course);
map.put("IDP - On the Job Training", idp);
map.put("Talent Program", talent);
除了将常量值和不变信息写到常量类中统一管理,其实针对不同的业务划分,其实也可以将常量信息放到指定的业务中。
public class GraduateEmpMgrAction extends ParentActionSupport{
public static List getGraduateStatus(){
List list = Lists.newArrayList();
list.add("已报名");
list.add("已录取");
list.add("已注册");
list.add("在读中");
list.add("已毕业");
list.add("已中止");
return list;
}
}
不管是在web项目还是在app项目中,都不建议在java 后台拼接html 代码返回给前端,建议直接返回相关数据信息,前端去做
public String getAllMajorByCollege(){
String id = Struts2Utils.getParameter("id");
College college=collegeService.get(id);
List list=college.getMajor();
String html="";
for(Major major:list){
html=html+""+major.getName()+"";
}
Struts2Utils.renderHtml(html);
return null;
}
当存在先使用主键id 获取实体后要对实体进行修改的,1)可以创建新的实体,通过set id,set 变更的值,调用update,2)可以直接使用内存中的旧实体,重新set 变更的值,再调用update。优缺点:第一种在内存中需要创建一个新实体,需要消耗性能,第二种需要在MySQL中做一次比较原值和修改值是否一致,一致不做修改的性能消耗
public String save(){
GraduateStatus newGraduateStatus=graduateStatusService.get(entity.getId());
newGraduateStatus.setIsDiploma(entity.getIsDiploma());
newGraduateStatus.setIsFirstClaimForm(entity.getIsFirstClaimForm());
newGraduateStatus.setIsPassExam(entity.getIsPassExam());
newGraduateStatus.setIsZulassung(entity.getIsZulassung());
newGraduateStatus.setAttachIds(entity.getAttachIds());
graduateStatusService.save(newGraduateStatus);
if(entitys!=null&&entitys.size()!=0){
graduateReimburseService.saveList(entitys,entity.getId());
}
return S_P;
}
如何在使用BigDecimal的时候保证运算结果安全,BigDecimal的构造参数要选择String,divide(除法)都需要考虑一下除完后的精度问题。 在表单首部可以设置一个专门显示后台校验提示信息的div,设置统一的样式和布局,在所有的表单提交的功能上都加上该div。
在表单首部可以设置一个专门显示后台校验提示信息的div,设置统一的样式和布局,在所有的表单提交的功能上都加上该div。
<form action="${base}/exttraining/external-training!saveSubmitCreate.action" method="post" id="requrest-form">
<div class="validate-messages">
<h2 class="validate-messages-title">${errorMsg}:</h2>
<a href="javascript:;" class="validate-messages-close"></a>
<ul class="validate-messages-list"></ul>
</div>
</form>
实体中一个字段或多个字段需要同时校验的时候,可以在实体中新建一个hasXXX方法,用于校验
public Boolean hasTaskId(){
return StringUtils.isNotEmpty(this.getTaskId());
}
if (null != taskInfo && taskInfo.hasTaskId() && "processing".equals(pageType)) {}
常量表和实体的设计
public class TrnConstants implements Serializable {
private static final long serialVersionUID = 1L;
public static final String TRN_CONSTANTS_TYPE_COURSE_TYPE = "COURSE_TYPE";
public static final String TRN_CONSTANTS_TYPE_COURSE_CATEGORY = "COURSE_CATEGORY";
private String id; // 自增id
private String title; // key
private String value; // value
private String type; // 类别
private Integer sortNo; // 顺序
}