Struts2的参数绑定固然好用,只需要在Action中声明参数属性,那么就能够实现表单参数的绑定,单我认为作为一个商业项目而言这种应用不可取。因为一个Action 80%的情况的是多用的,里面会有很多方法需要调用执行,那么如果每个方法的都采取Struts2的参数绑定传参势必造成Action中的属性泛滥,不利于开发和维护。我个人认为完全可以自己通过请求对象取出请求表单元素,当然为了效率,你可以封装一下代码:
以下是BaseAction类的代码:
- Map<String,Object> _paramMap = new HashMap<String,Object>();
- /**
- * 获得表单元素值
- * @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()));
- }
- }
- }
Map<String,Object> _paramMap = new HashMap<String,Object>();
/**
* 获得表单元素值
* @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类,子类中调用上面的父类方法实现参数获取非常方便,例如:
- /**
- * 添加诊所管理文章
- *
- * @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";
- }
- }