每一个系统都会有一些方法是需要携带一些提示消息返回给用户的。
比如{操作成功、操作失败、系统错误} 等这些消息。
既然是消息,又有这些类型,那么根据面向对象的思想,它就不应该只是一个字符串,而是一个对象。
那么就定义下面这样一个TipMessage类
/**
* 系统提示消息
* @author zhoufeng
*
*/
public class TipMessage {
private String message ;
private String type ;
public static final String INFO = "info"; //普通信息
public static final String ERROR = "error"; //错误信息
public static final String SUCCESS = "success"; //操作成功
public static final String FAIL = "fail"; //操作失败
public TipMessage(String message, String type) {
this.message = message;
this.type = type;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
当某个Action方法有消息要返回给页面时,就创建一个TipMessage存放在session里面,然后返回到页面。
例如在某个Action方法中加入:
session.put( ConstantSessionName.TIP_MESSAGE , new TipMessage("修改成功", TipMessage.SUCCESS)) ;
此时,就将一个TipMessage对象,存放在session中了,key为 ConstantSessionName.TIP_MESSAGE 常量 。
很多页面都有可能需要来读取提示消息的。所以,可以创建一个common.jsp文件。在该文件里面读取Message 。然后在每一个页面都inclued该文件就可以了。
在jsp里面写java代码来获取session中的Message不是很合适,所以,可以定义自定义标签来读取Message
自定义标签如下:
/**
* 页面输出SessionMessage
* @author zhoufeng
*
*/
public class SessionMessageTag extends BodyTagSupport {
private String property ; //要获取的属性
private boolean remove ; //是否移除该条消息
public static final String MESSAGE = "message";
public static final String TYPE = "type";
/**
*
*/
private static final long serialVersionUID = -6534466026479404293L;
@Override
public int doStartTag() throws JspException {
try {
Object msg = pageContext.getSession()
.getAttribute(ConstantSessionName.TIP_MESSAGE) ;
if(msg != null) {
TipMessage tm = (TipMessage) msg ;
Object out = null;
if(MESSAGE.equals(property))
out = tm.getMessage() ;
else if(TYPE.equals(property))
out = tm.getType() ;
if(out != null && !"".equals(out))
pageContext.getOut().print(out.toString());
if(remove)
pageContext.getSession().removeAttribute(ConstantSessionName.TIP_MESSAGE);
}
} catch (IOException e) {
e.printStackTrace();
}
return BodyTagSupport.EVAL_BODY_INCLUDE;
}
@Override
public int doEndTag() throws JspException {
return BodyTagSupport.EVAL_BODY_INCLUDE ;
}
public String getProperty() {
return property;
}
public void setProperty(String property) {
this.property = property;
}
public boolean isRemove() {
return remove;
}
public void setRemove(boolean remove) {
this.remove = remove;
}
}
然后在WEB-INF目录下面加入tld文件:tuanfang.tld(文件名可以随便取)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>tf</short-name>
<uri>http://www.tuanfang.tag</uri>
<tag>
<name>sessionMessage</name>
<tag-class>com.tuanfang.util.diytag.SessionMessageTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>property</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</attribute>
<attribute>
<name>remove</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Boolean</type>
</attribute>
</tag>
</taglib>
现在就可以在jsp页面使用自定义的标签了。
首先导入标签库:
<%@ taglib uri="http://www.tuanfang.tag" prefix="tf" %>
获取消息内容 <tf:sessionMessage property='message' remove='false' />
获取消息类型 <tf:sessionMessage property='type' remove='true' />
可以在common.jsp页面写一个js函数,使用jquery-ui 将消息显示出来,例如:
$(function(){
tip_message_dialog();
});
// 提示消息
function tip_message_dialog(){
var msg = "<tf:sessionMessage property='message' remove='false' />";
var type = "<tf:sessionMessage property='type' remove='true' />";
if(msg != null && "" != msg){
$("#tip_icon").attr("src" , "${basepath}/img/tip/" + type + ".gif" );
$("#tip_message").html(msg);
$("#tip_div").dialog({
title:"系统提示",
modal:true,
width:400,
height:150,
resizable:false
});
}
}
其中type的作用,就是用来显示相应的图片的,比如当type为SUCCESS时,就在消息前面加上一个勾勾的箭头,如果type为FAIL,就加上一个叉叉的箭头。