Struts2的参数绑定

Struts2的参数绑定固然好用,只需要在Action中声明参数属性,那么就能够实现表单参数的绑定,单我认为作为一个商业项目而言这种应用不可取。因为一个Action 80%的情况的是多用的,里面会有很多方法需要调用执行,那么如果每个方法的都采取Struts2的参数绑定传参势必造成Action中的属性泛滥,不利于开发和维护。我个人认为完全可以自己通过请求对象取出请求表单元素,当然为了效率,你可以封装一下代码:

以下是BaseAction类的代码:

  1. Map<String,Object> _paramMap = new HashMap<String,Object>();
  2. /**
  3. * 获得表单元素值
  4. * @param name
  5. * @return
  6. */
  7. public Object getParam(String key){
  8. if (_paramMap.size()==0){
  9. Map<String,Object> paramMap = ActionContext.getContext().getParameters();
  10. for (Map.Entry<String,Object> kvp : paramMap.entrySet()) {
  11. _paramMap.put(kvp.getKey().toUpperCase(),kvp.getValue());
  12. }
  13. }
  14. if(!_paramMap.containsKey(key.toUpperCase()))
  15. return "";
  16. Object[] values = (Object[])_paramMap.get(key.toUpperCase());
  17. if (values==null || values.length==0)
  18. return "";
  19. if (values.length==1)
  20. return values[0]==null?"":values[0];
  21. return values;
  22. }
  23. /**
  24. * 绑定参数到对象属性
  25. * @param entity
  26. * @param params
  27. */
  28. public void bindParam2Bean(Object entity){
  29. Map<String,Object> paramMap = ActionContext.getContext().getParameters();
  30. if (paramMap==null || paramMap.size()==0)
  31. throw new InvalidParameterException("没有有效的参数可以绑定");
  32. Class classzz = entity.getClass();
  33. //將所有私有字段裝入Map<字段名,字段對象>
  34. Map<String,Field> fieldMap = new HashMap<String,Field>();
  35. for (Field f : classzz.getDeclaredFields()) {
  36. fieldMap.put(f.getName().toUpperCase(),f);
  37. }
  38. Field f = null;
  39. Object fvalue = null;
  40. for (Map.Entry<String,Object> kvp : paramMap.entrySet()) {
  41. try {
  42. Object[] values = (Object[])kvp.getValue();
  43. if (null != values && values.length==1){
  44. //f = classzz.getDeclaredField(kvp.getKey());
  45. f = fieldMap.get(kvp.getKey().toUpperCase());//從HashMap中取得字段對象[不區分大小寫]
  46. if ( null == f)
  47. continue;
  48. f.setAccessible(true);
  49. if (f.getType()==String.class){
  50. f.set(entity, values[0]);
  51. }else{
  52. fvalue = f.getType().getDeclaredMethod("valueOf",String.class).invoke(null, values[0]);
  53. f.set(entity, fvalue);
  54. }
  55. }
  56. } catch (Exception e) {
  57. if (super.LOG.isInfoEnabled())
  58. super.LOG.info(java.text.MessageFormat.format("封装请求参数{0}到JavaBean的{1}属性失败[{2}]", kvp.getKey(),f.getName(),e.getMessage()));
  59. }
  60. }
  61. }
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类,子类中调用上面的父类方法实现参数获取非常方便,例如:

  1. /**
  2. * 添加诊所管理文章
  3. *
  4. * @return
  5. */
  6. public String addCliniqueArticle() {
  7. CliniqueArticle ca = null;
  8. try {
  9. ca = new CliniqueArticle();
  10. super.bindParam2Bean(ca);
  11. if (StringUtils.isBlank(ca.getTitle())
  12. || !com.defshare.foundation.global.StringUtils.isValid(ca
  13. .getTitle())) {
  14. super.request.setAttribute("ErrorMessage", "诊所文章的标题不能为特殊字符或空");
  15. return "add_input";
  16. }
  17. if (StringUtils.isBlank(ca.getContent())) {
  18. super.request.setAttribute("ErrorMessage", "诊所文章的内容不能为空");
  19. return "add_input";
  20. }
  21. if (StringUtils.isBlank(ca.getSummary())) {
  22. super.request.setAttribute("ErrorMessage", "文章摘要不能为空");
  23. return "add_input";
  24. }
  25. if (null == ca.getOrderNum()) {
  26. ca.setOrderNum(0);
  27. }
  28. // 当没有上传图片时,则将设置为默认的图片
  29. if (StringUtils.isBlank(super.getUploadFileName())) {
  30. ca.setPic(super.DEFAULT_PIC);
  31. } else {
  32. ca.setPic(super.saveFile());
  33. }
  34. cliniqueArticleService.addCliniqueArticle(ca);
  35. super.request.setAttribute("ErrorMessage", "添加诊所文章信息成功");
  36. return "add_success";
  37. } catch (Exception e) {
  38. // 出异常时,当已经上传的图片删除
  39. new File(super.getSavePath() + "\\" + ca.getPic()).delete();
  40. super.addFieldError("message", e.getMessage());
  41. return "add_input";
  42. }
  43. }
  44. @SuppressWarnings("static-access")
  45. public String updateCliniqueArticle() {
  46. CliniqueArticle clinique = null;
  47. try {
  48. clinique = new CliniqueArticle();
  49. String id = super.getParam("cliniqueArticleId").toString();
  50. String title = super.getParam("title").toString();
  51. String summary = super.getParam("summary").toString();
  52. String content = super.getParam("content").toString();
  53. String defaultPic = super.getParam("dfpic").toString();
  54. clinique.setContent(content);
  55. clinique.setSummary(summary);
  56. clinique.setTitle(title);
  57. clinique.setCliniqueArticleId(Long.parseLong(id));
  58. if (null == clinique.getCliniqueArticleId()
  59. || clinique.getCliniqueArticleId() < 1) {
  60. request.setAttribute("ErrorMessage", "管理文章编号无效!");
  61. super.request.setAttribute("clinique", clinique);
  62. return "update_input";
  63. }
  64. if (StringUtils.isBlank(clinique.getTitle())
  65. || !com.defshare.foundation.global.StringUtils
  66. .isValid(clinique.getTitle())) {
  67. request.setAttribute("ErrorMessage", "文章管理标题不能为特殊字符或空!");
  68. super.request.setAttribute("clinique", clinique);
  69. return "update_input";
  70. }
  71. if (StringUtils.isBlank(clinique.getContent())) {
  72. request.setAttribute("ErrorMessage", "文章管理内容不能为空!");
  73. super.request.setAttribute("clinique", clinique);
  74. return "update_input";
  75. }
  76. if (StringUtils.isBlank(clinique.getSummary())) {
  77. request.setAttribute("ErrorMessage", "文章摘要不能为空");
  78. super.request.setAttribute("clinique", clinique);
  79. return "update_input";
  80. }
  81. if (!StringUtils.isBlank(defaultPic)) {
  82. clinique.setPic(DEFAULT_PIC);
  83. }
  84. // 获得图片,当用户上传图片的时候
  85. else if (!StringUtils.isBlank(super.getUploadFileName())) {
  86. clinique.setPic(super.saveFile());
  87. }
  88. // 获得原来的图片地址
  89. String oldPic = cliniqueArticleService.getCliniqueArticle(
  90. clinique.getCliniqueArticleId().longValue()).getPic();
  91. cliniqueArticleService.updateCliniqueArticle(clinique);
  92. // 判断是否是缺省图片
  93. if (!StringUtils.isBlank(super.getUploadFileName())) {
  94. if (!oldPic.equals(super.DEFAULT_PIC)) {
  95. new File(super.getSavePath() + "\\" + oldPic).delete();
  96. }
  97. }
  98. super.request.setAttribute("ErrorMessage", "修改诊所文章成功");
  99. return "update_success";
  100. }catch (NumberFormatException e) {
  101. request.setAttribute("ErrorMessage", "无效的编号信息");
  102. return "update_input";
  103. }
  104. catch (Exception e) {
  105. super.request.setAttribute("clinique", clinique);
  106. request.setAttribute("ErrorMessage", e.getMessage());
  107. return "update_input";
  108. }
  109. }
  110. /**
  111. * 后台显示诊所文章信息
  112. * @return
  113. */
  114. public String getAllCliniqueArticle() {
  115. try {
  116. int page = -1;
  117. int size = -1;
  118. // 获得当前页
  119. String index = super.getParam("pageIndex").toString();
  120. String pageSize = super.getParam("pageSize").toString();
  121. String title = super.getParam("title").toString().trim();
  122. PageInfo<CliniqueArticle> pageInfo = new PageInfo<CliniqueArticle>(
  123. CliniqueArticle.class);
  124. // 对当前页进行判断,如果为null则设置当前页为首页
  125. if (StringUtils.isBlank(index)) {
  126. index = "1";
  127. }
  128. if (StringUtils.isBlank(pageSize)) {
  129. pageSize = "10";
  130. }
  131. // 判断是否是数字
  132. if (!StringUtils.isNumeric(index)) {
  133. request.setAttribute("ErrorMessage", "当前页无效");
  134. return "page_input";
  135. } else {
  136. page = Integer.valueOf(index);
  137. }
  138. // 判断是否是数字
  139. if (!StringUtils.isNumeric(pageSize)) {
  140. request.setAttribute("ErrorMessage", "每页数据无效");
  141. return "page_input";
  142. } else {
  143. size = Integer.valueOf(pageSize);
  144. }
  145. pageInfo.setPageIndex(page);
  146. pageInfo.setPageSize(size);
  147. pageInfo.getConditions().add(
  148. new Condition("title", Compare.LIKE, title));
  149. cliniqueArticleService.getCliniqueArticleByPageInfo(pageInfo);
  150. // 将诊所文章的信息列表放到坏境中去
  151. request.setAttribute("pi", pageInfo);
  152. return "page_success";
  153. } catch (Exception e) {
  154. request.setAttribute("ErrorMessage", e.getMessage());
  155. return "page_input";
  156. }
  157. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值