需求背景:
前些日子,有个客户咨询校验问题,在参数模板中使用校验,点查询时触发校验,正常过滤,但是现在的用户习惯于使用enter键提交,则不会触发校验。
场景模拟:
做一个订单表wangge2.raq,另做一个参数模板wangge2_arg.raq,以订单ID为参数,校验描述为订单ID<10257
下图为输入订单ID点击查询按钮正常触发校验
下图为输入订单ID直接按enter键未触发校验
由上图可见,校验失败,用户查出了错误数据。
解决方案:
利用参数监听类实现,不管客户点击查询按钮还是直接按enter键查询,最终都会进入到参数监听类中进行业务处理,在参数监听类中判断得到订单ID的值,如果值大于等于10257,则会alert窗口提示错误,并重定向到页面重新输入。如果订单ID的值符合查询条件,则正常查询
实现步骤:
一:编写参数监听类ParamProcessor
package com.runqian;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Hashtable;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.runqian.report4.usermodel.Context;
import com.runqian.report4.usermodel.input.AbstractParamProcessor;
public class ParamProcessor extends AbstractParamProcessor {
@Override
public String[] getParamNames() {
// TODO Auto-generated method stub
return super.getParamNames();
}
@Override
public String getParamValue(String arg0) {
// TODO Auto-generated method stub
return super.getParamValue(arg0);
}
@Override
public void process() throws Exception {
// TODO Auto-generated method stub
String orderid = request.getParameter("orderid");
System.out.println(orderid);
int orderid2 = Integer.parseInt(orderid);
if (orderid2 >= 10258) {
TipsServlet ts = new TipsServlet();
ts.doGet(request, response); // 执行这个方法弹出提示框 throw newException("校验未通过"); // 终止程序继续执行。
}
}
public class TipsServlet extends HttpServlet {
/**
* 定义内部类实现alert窗口,并负责页面的重定向
*/
private static final long serialVersionUID = 3733704363216916721L;
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException {
//设置页面编码
res.setContentType("text/html;charset=gb2312");
//创建PrintWriter对象
PrintWriter out = res.getWriter();
//定义alert及重定向
out .println("<body οnlοad=javascript:alert('订单ID应小于10257!');top.location.href='reportJsp/showReport.jsp?raq=wangge2.raq'>");
out.close();
}
}
@Override
public void putParam(String arg0, String arg1) {
// TODO Auto-generated method stub
super.putParam(arg0, arg1);
}
@Override
public void setContext(Context arg0, Hashtable arg1,
HttpServletRequest arg2, HttpServletResponse arg3,
ServletContext arg4) {
// TODO Auto-generated method stub
super.setContext(arg0, arg1, arg2, arg3, arg4);
}
}
二:修改参数模板的TAG标签
红色部分为使用参数监听类的标签
<report:param name="form1" paramFileName="<%=paramFile%>"
needSubmit="no"
params="<%=param.toString()%>"
processor ="com.runqian.ParamProcessor"
/>
三:copy 编译后的calss文件至calsses下的相应目录下
四:重启应用服务器
效果图
下图为输入不符合条件的订单ID后直接按enter键
下图为提示的错误窗口
最后返回重新录入数据的页面
总结:
对于参数模板的验证,我们可以采用参数监听类的放法实现,当然参数监听类的功能是非常强大的,凡事需要对参数来进行业务处理的需求,我们都可以考虑参数监听类。