1.common类

//1.Component:提供空的构造函数
//method:start,end, useBody

public boolean start(Writer writer){
	return true;
}

public boolean end(Writer writer, String body) {
	writer.write(body);
	return false;
}

public boolean usesBody(){
	return false;
}

//2.抽象类,公用Bean,继承Component
public abstract class CommonBean extends Component{
	//构造函数
	public CommonBean(HttpServletRequest request,HttpServletResponse response){
		this.request=request;
		this.response=response;
	}
	//抽象动作类,获取模板
	protected abstract String getTemplate();
	
	protected HttpServletRequest request;  //request
	protected HttpServletResponse response;//response
	protected Map<String,Object> dynamicAttributes=new HashMap<String,Object>();
	
	//基本的bean属性
	protected String id;    //id
	protected String name;  //name
	protected String cssStyle; //style样式
	protected String cssClass; //class样式
	protected String value; //取值
	protected String title; //标题
	protected String tabindex;//属性可设置或返回单选按钮的 tab 键控制次序。
	protected String accessKey; //属性可设置或返回访问单选按钮的快捷键
	protected String disabled; //属性可设置或返回是否禁用
	
	//基本的事件
	protected String onclick;//点击事件
	protected String onmousedown;//当鼠标按键被按下
	protected String onmouseup;//当鼠标按键被松开
	protected String onmouseover;//当鼠标被移到某元素之上
	protected String onmousemove;//鼠标被移动
	protected String onmouseout; //鼠标被移开
	protected String onfocus; //元素获取焦点
	protected String onblur;//失去焦点
	protected String onkeypress;//某个按键被按下或按住
	protected String onkeydown;//某个按键被按下
	protected String onkeyup;//当按键被松开
	protected String onselect;//文本被选定
	protected String onchange; //用户改变域的内容
} 

//3.基本的标签 CommonTag  抽象类,继承BodyTagSupport,实现DynamicAttributes
public abstract class CommonTag extends BodyTagSupport implements DynamicAttributes{
	//获取组件component的抽象类
	public abstract Component getBean(HttpServletRequest request,HttpServletResponse response);
	
	protected Map<String,Object> dynamicAttributes=new HashMap<String,Object>();
	//重写DynamicAttributes的setDynamicAttribute的方法
	//uri:是属性的namespace,如果默认空间设置为null
	//localName:被设置属性的名称
	//value:被设置属性的值
	public void setDynamicAttribute(String uri, String localName, Object value){
		dynamicAttributes.put(localName, value);
	}
	
	//注入component
	protected Component component;
	public Component getComponent(){
		return component;
	}
	
	//开始标签的动作
	public int doStartTag(){
		component=getBean((HttpServletRequest)pageContext.getRequest,(HttpServletResponse)pageContext.getResponse);
		populateParams();//自定义参数
		//eval()函数可计算某个字符串,并执行其中的JavaScript代码。
		boolean evalBody=component.start(pageContext.getOut());
		if(evalBody){
			return component.usesBody()? EVAL_BODY_BUFFERED : EVAL_BODY_INCLUDE;
		}else{
			return SKIP_BODY;
		}
	}
	//结束标签
	public int doEndTag(){
		component.end(pageContext.getOut,getBody());
		component=null;
		return EVAL_PAGE;
	}
	private String getBody(){
		//上下文 bodyContent
		if(bodyContent == null){
			return "";
		}else{
			return bodyContent.getString().trim();
		}
	}
	//基本的bean属性
	protected String id;    //id
	protected String name;  //name
	protected String cssStyle; //style样式
	protected String cssClass; //class样式
	protected String value; //取值
	protected String title; //标题
	protected String tabindex;//属性可设置或返回单选按钮的 tab 键控制次序。
	protected String accessKey; //属性可设置或返回访问单选按钮的快捷键
	protected String disabled; //属性可设置或返回是否禁用
	
	//基本的事件
	protected String onclick;//点击事件
	protected String onmousedown;//当鼠标按键被按下
	protected String onmouseup;//当鼠标按键被松开
	protected String onmouseover;//当鼠标被移到某元素之上
	protected String onmousemove;//鼠标被移动
	protected String onmouseout; //鼠标被移开
	protected String onfocus; //元素获取焦点
	protected String onblur;//失去焦点
	protected String onkeypress;//某个按键被按下或按住
	protected String onkeydown;//某个按键被按下
	protected String onkeyup;//当按键被松开
	protected String onselect;//文本被选定
	protected String onchange; //用户改变域的内容
	
	//自定义参数
	protected void populateParams(){
		//将component强转为CommonBean
		CommonBean bean = (CommonBean)component;
		
		bean.setId(StringUtils.isBlank(id)? UUID.getUUID() : id);
		bean.setName(name);
		bean.setCssStyle(cssStyle);
		bean.setCssClass(cssClass);
		bean.setValue(value);
		bean.setTitle(title);
		bean.setTabindex(tabindex);
		bean.setAccessKey(accessKey);
		bean.setDisabled(disabled);

		bean.setOnclick(onclick);
		bean.setOnkeydown(onkeydown);
		bean.setOnmouseup(onmouseup);
		bean.setOnmouseover(onmouseover);
		bean.setOnmousemove(onmousemove);
		bean.setOnmouseout(onmouseout);
		bean.setOnfocus(onfocus);
		bean.setOnblur(onblur);
		bean.setOnkeypress(onkeypress);
		bean.setOnkeydown(onkeydown);
		bean.setOnkeyup(onkeyup);
		bean.setOnselect(onselect);
		bean.setOnchange(onchange);
		
		bean.setDynamicAttributes(dynamicAttributes);
	}
	
}



2.附件attachment

//1.附件上传的Bean对象 AttachmentUpload
public class AttachmentUpload extends CommonBean{
	//有参的构造函数
	public AttachmentUpload(HttpServletRequest request, HttpServletResponse response){
		super(request,response);
	}
	//实现抽象方法
	final public static String TEMPLATE="attachmentUpload";
	protected String getTemplate(){
		return TEMPLATE;
	}
	
	//自定义的参数
	protected String configCode;
	protected String className;
	protected String filedName;
	protected String ownerId;
	protected String finishCallback;  //结束后的回调方法
	protected String deleteCallback;  //删除后的回调方法
	protected Boolean required;//是否必须
}

//2.查看附件的Bean对象
public class AttachmentView extends CommonBean{
	//重写构造函数
	public AttachmentView(HttpServletRequest request,HttpServletResponse response){
		super(request,response);
	}
	final public static TEMPLATE="attachmentView";
	protected String getTemplate(){
		return TEMPLATE;
	}
	
	protected List<AttachmentVO> attachmentVOs;
	protected String zipUrl;
}

//3.JAVA VO 对象 AttachmentVO
public class AttachmentVO{
	private String id;
	private String name;
	private String downloadUrl;//下载路径
	private String picUrl;//图片路径
	private String audioUrl;//视频路径
}

//4.标签Tag,AttachemntUploadTag  附件上传的标签
public class AttachemntUploadTag extends CommonTag{
	//重写抽象方法
	public Component getBean(HttpServletRequest request,HttpServletResponse response){
		return new AttachmentUpload(request,response);
	}
	//自定义属性
	protect Object model=null;
	protected String configCode="default";//设置编码
	//默认上传的字段名称为id
	protected String fieldName="id";
	protected String finishCallback; 
	protected String deleteCallback;
	protected Boolean required=false;
	
	//重写自定义参数 populateParams
	protected void populateParams(){
		super.populateParams();
		String className="";
		String ownerId="";
		Object obj=model;
		if(obj==null){
			obj=pageContext.findAttribute("model");
		}
		//获取对象的名称
		className=obj.getClass().getName();
		//利用反射获取对象属性的值,(获取附件所属的对象的id--fieldName)
		Object ownerIdObj=ReflectUtil.getFieldValue(obj,fieldName);
		if(ownerIdObj!=null){
			ownerId=ownerIdObj.toString();
		}
		//commonTag里面有自己的component
		((AttachmentUpload) component).setConfigCode(configCode);
		((AttachmentUpload) component).setClassName(className);
		((AttachmentUpload) component).setFieldName(fieldName);
		((AttachmentUpload) component).setOwnerId(ownerId);
		((AttachmentUpload) component).setFinishCallback(StringUtils.isBlank(finishCallback) ? "" : finishCallback);
		((AttachmentUpload) component).setDeleteCallback(StringUtils.isBlank(deleteCallback) ? "" : deleteCallback);
		((AttachmentUpload) component).setRequired(required);
	}
}

//4.标签Tag,AttachmentViewTag  附件查看的标签
public class AttachmentViewTag extends commonTag{
	//重写抽象方法
	public Component getBean(HttpServletRequest request,HttpServletResponse response){
		return new AttachmentView(request,response);
	}
	private Object model;
	private String fieldName="id";
	private String period="year";
	private Boolean showAll=true;
	private Boolean showZipUrl=true;
	private Boolean checkUser;
	
	protected void populateParams(){
		super.populateParams();
		Object obj=model;
		if(obj==null){
			obj=pageContext.findAttribute("model");
		}
		Object ownerId = ReflectUtil.getFieldValue(obj,fieldName);
		if(ownerId!=null){
			AttachmentService attachmentService=SpringContextHolder.getBean(AttachmentService.class);
			List<Attachment> attachments=attachmentService.getAttachmentsWithOwnerId(ownerId.toString(),AttachmentConstant.STATUS_ABLE);
			List<AttachmentVO> attachmentVOs=new ArrayList<AttachmentVO>();
			String zipUrl="";
			if(showAll){
				if(attachments.size()>0){
					for(Attachment att : attachments){
						AttachmentVO vo=new AttachmentVO();
						vo.setName(att.getSourceFilename());
						String downloadUrl = AttachmentUtil.getDownloadUrl(attr,checkUser,period);
						vo.setDownloadUrl(downloadUrl);
						vo.setId(att.getId());
						attachmentVOs.add(vo);
					}
				}
			}
			((AttachmentView) component).setAttachmentVOs(attachmentVOs);
			if(showZipUrl){
				if(attachments.size()>0){
					zipUrl=AttachmentUtil.getZipDownloadUrl(ownerId,checkUser,period);
				}
				((AttachmentView)component).setZipUrl(zipUrl);
			}
		}
	}
}

//5.标签AttachmentUrlTag,直接继承BodyTagSupport,重写doStartTag,doEndTag标签
public class AttachmentUrlTag extends BodyTagSupport{
	private Object model = null;
	private String fieldName = "id";
	private Boolean checkUser=false;
	private String var;
	private String period="year";
	
	public int doStartTag(){
		return EVAL_BODY_BUFFERED;
	}
	public int doEndTag(){
		Object obj=model;
		if(obj == null){
			obj=pageContext.findAttribute("model");
		}
		Object ownerId=ReflectUtil.getFieldValue(obj,fieldName);
		List<AttachmentVO> attachmentVOs = new ArrayList<AttachmentVO>();
		if(ownerId!=null){
			AttachmentService attachmentService=SpringContextHolder.getBean(AttachmentService.class);
			List<Attachment> attachments = attachmentService.getAttachmentsWithOwnerId(ownerId.toString(),AttachmentConstant.STATUS_ABLE);
			if (attachments.size() > 0) {
				for (Attachment att : attachments) {
					AttachmentVO vo = new AttachmentVO();
					vo.setName(att.getSourceFilename());
					String downloadUrl = AttachmentUtil.getDownloadUrl(att, checkUser, period);
					String picUrl = AttachmentUtil.getPicUrl(att, checkUser, period);
					String audioUrl = AttachmentUtil.getAudioUrl(att, checkUser, period);
					vo.setDownloadUrl(downloadUrl);
					vo.setPicUrl(picUrl);
					vo.setAudioUrl(audioUrl);
					vo.setId(att.getId());
					attachmentVOs.add(vo);
				}
			}			
		}
		pageContext.getRequest.setAttribute(var,attachmentVOs);
		return EVAL_PAGE;
	}
}