Struts2的参数绑定固然好用,只需要在Action中声明参数属性,那么就能够实现表单参数的绑定,单我认为作为一个商业项目而言这种应用不可取。因为一个Action 80%的情况的是多用的,里面会有很多方法需要调用执行,那么如果每个方法的都采取Struts2的参数绑定传参势必造成Action中的属性泛滥,不利于开发和维护。我个人认为完全可以自己通过请求对象取出请求表单元素,当然为了效率,你可以封装一下代码:
以下是BaseAction类的代码:
[java] view plain copy
Map _paramMap = new HashMap();
/**
* 获得表单元素值
* @param name
* @return
*/
public Object getParam(String key){
if (_paramMap.size()==0){
Map<String,Object> paramMap = ActionContext.getContext().getParameters();
for (Map.Entry<String,Object> kvp : paramMap.entrySet()) {
_paramMap.put(kvp.getKey().toUpperCase(),kvp.getValue());
}
}
if(!_paramMap.containsKey(key.toUpperCase()))
return "";
Object[] values = (Object[])_paramMap.get(key.toUpperCase());
if (values==null || values.length==0)
return "";
if (values.length==1)
return values[0]==null?"":values[0];
return values;
}
/**
* 绑定参数到对象属性
* @param entity
* @param params
*/
public void bindParam2Bean(Object entity){
Map<String,Object> paramMap = ActionContext.getContext().getParameters();
if (paramMap==null || paramMap.size()==0)
throw new InvalidParameterException("没有有效的参数可以绑定");
Class classzz = entity.getClass();
//將所有私有字段裝入Map<字段名,字段對象>
Map<String,Field> fieldMap = new HashMap<String,Field>();
for (Field f : classzz.getDeclaredFields()) {
fieldMap.put(f.getName().toUpperCase(),f);
}
Field f = null;
Object fvalue = null;
for (Map.Entry<String,Object> kvp : paramMap.entrySet()) {
try {
Object[] values = (Object[])kvp.getValue();
if (null != values && values.length==1){
//f = classzz.getDeclaredField(kvp.getKey());
f = fieldMap.get(kvp.getKey().toUpperCase());//從HashMap中取得字段對象[不區分大小寫]
if ( null == f)
continue;
f.setAccessible(true);
if (f.getType()==String.class){
f.set(entity, values[0]);
}else{
fvalue = f.getType().getDeclaredMethod("valueOf",String.class).invoke(null, values[0]);
f.set(entity, fvalue);
}
}
} catch (Exception e) {
if (super.LOG.isInfoEnabled())
super.LOG.info(java.text.MessageFormat.format("封装请求参数{0}到JavaBean的{1}属性失败[{2}]", kvp.getKey(),f.getName(),e.getMessage()));
}
}
}
所有Action类继承自BaseAction类,子类中调用上面的父类方法实现参数获取非常方便,例如:
[java] view plain copy
/**
* 添加诊所管理文章
*
* @return
*/
public String addCliniqueArticle() {
CliniqueArticle ca = null;
try {
ca = new CliniqueArticle();
super.bindParam2Bean(ca);
if (StringUtils.isBlank(ca.getTitle())
|| !com.defshare.foundation.global.StringUtils.isValid(ca
.getTitle())) {
super.request.setAttribute("ErrorMessage", "诊所文章的标题不能为特殊字符或空");
return "add_input";
}
if (StringUtils.isBlank(ca.getContent())) {
super.request.setAttribute("ErrorMessage", "诊所文章的内容不能为空");
return "add_input";
}
if (StringUtils.isBlank(ca.getSummary())) {
super.request.setAttribute("ErrorMessage", "文章摘要不能为空");
return "add_input";
}
if (null == ca.getOrderNum()) {
ca.setOrderNum(0);
}
// 当没有上传图片时,则将设置为默认的图片
if (StringUtils.isBlank(super.getUploadFileName())) {
ca.setPic(super.DEFAULT_PIC);
} else {
ca.setPic(super.saveFile());
}
cliniqueArticleService.addCliniqueArticle(ca);
super.request.setAttribute("ErrorMessage", "添加诊所文章信息成功");
return "add_success";
} catch (Exception e) {
// 出异常时,当已经上传的图片删除
new File(super.getSavePath() + "\\" + ca.getPic()).delete();
super.addFieldError("message", e.getMessage());
return "add_input";
}
}
@SuppressWarnings("static-access")
public String updateCliniqueArticle() {
CliniqueArticle clinique = null;
try {
clinique = new CliniqueArticle();
String id = super.getParam("cliniqueArticleId").toString();
String title = super.getParam("title").toString();
String summary = super.getParam("summary").toString();
String content = super.getParam("content").toString();
String defaultPic = super.getParam("dfpic").toString();
clinique.setContent(content);
clinique.setSummary(summary);
clinique.setTitle(title);
clinique.setCliniqueArticleId(Long.parseLong(id));
if (null == clinique.getCliniqueArticleId()
|| clinique.getCliniqueArticleId() < 1) {
request.setAttribute("ErrorMessage", "管理文章编号无效!");
super.request.setAttribute("clinique", clinique);
return "update_input";
}
if (StringUtils.isBlank(clinique.getTitle())
|| !com.defshare.foundation.global.StringUtils
.isValid(clinique.getTitle())) {
request.setAttribute("ErrorMessage", "文章管理标题不能为特殊字符或空!");
super.request.setAttribute("clinique", clinique);
return "update_input";
}
if (StringUtils.isBlank(clinique.getContent())) {
request.setAttribute("ErrorMessage", "文章管理内容不能为空!");
super.request.setAttribute("clinique", clinique);
return "update_input";
}
if (StringUtils.isBlank(clinique.getSummary())) {
request.setAttribute("ErrorMessage", "文章摘要不能为空");
super.request.setAttribute("clinique", clinique);
return "update_input";
}
if (!StringUtils.isBlank(defaultPic)) {
clinique.setPic(DEFAULT_PIC);
}
// 获得图片,当用户上传图片的时候
else if (!StringUtils.isBlank(super.getUploadFileName())) {
clinique.setPic(super.saveFile());
}
// 获得原来的图片地址
String oldPic = cliniqueArticleService.getCliniqueArticle(
clinique.getCliniqueArticleId().longValue()).getPic();
cliniqueArticleService.updateCliniqueArticle(clinique);
// 判断是否是缺省图片
if (!StringUtils.isBlank(super.getUploadFileName())) {
if (!oldPic.equals(super.DEFAULT_PIC)) {
new File(super.getSavePath() + "\\" + oldPic).delete();
}
}
super.request.setAttribute("ErrorMessage", "修改诊所文章成功");
return "update_success";
}catch (NumberFormatException e) {
request.setAttribute("ErrorMessage", "无效的编号信息");
return "update_input";
}
catch (Exception e) {
super.request.setAttribute("clinique", clinique);
request.setAttribute("ErrorMessage", e.getMessage());
return "update_input";
}
}
/**
* 后台显示诊所文章信息
* @return
*/
public String getAllCliniqueArticle() {
try {
int page = -1;
int size = -1;
// 获得当前页
String index = super.getParam("pageIndex").toString();
String pageSize = super.getParam("pageSize").toString();
String title = super.getParam("title").toString().trim();
PageInfo<CliniqueArticle> pageInfo = new PageInfo<CliniqueArticle>(
CliniqueArticle.class);
// 对当前页进行判断,如果为null则设置当前页为首页
if (StringUtils.isBlank(index)) {
index = "1";
}
if (StringUtils.isBlank(pageSize)) {
pageSize = "10";
}
// 判断是否是数字
if (!StringUtils.isNumeric(index)) {
request.setAttribute("ErrorMessage", "当前页无效");
return "page_input";
} else {
page = Integer.valueOf(index);
}
// 判断是否是数字
if (!StringUtils.isNumeric(pageSize)) {
request.setAttribute("ErrorMessage", "每页数据无效");
return "page_input";
} else {
size = Integer.valueOf(pageSize);
}
pageInfo.setPageIndex(page);
pageInfo.setPageSize(size);
pageInfo.getConditions().add(
new Condition("title", Compare.LIKE, title));
cliniqueArticleService.getCliniqueArticleByPageInfo(pageInfo);
// 将诊所文章的信息列表放到坏境中去
request.setAttribute("pi", pageInfo);
return "page_success";
} catch (Exception e) {
request.setAttribute("ErrorMessage", e.getMessage());
return "page_input";
}
}