在项目中的注册页面需要判断影片编码是否存在,采用了jquery的验证框架的remote方法来实现。
1、js脚本:
$(document).ready(function(){ $("#myForm").validate({ rules:{ "mediaInfo.mediacode":{ required:true, remote:"media!validateMediacode.action" //验证影片编码是否存在的Action } }, messages: { "mediaInfo.mediacode":{ required:"请输入影片编码", remote:"该影片编码已被注册" //当后台返回false时,不许注册 } } }); }) ;
2、java代码:
由于jquery的remote方法只允许返回true或者false,当返回false时,输出messages的内容:"该影片编码已经注册"。在Struts2的有两种方法可以实现:
(1)、利用HttpServletResponse对象的response实例,Java代码如下:
public String validateMediacode() throws Exception{ HttpServletRequest sRequst= ServletActionContext.getRequest(); sRequst.setCharacterEncoding("UTF-8"); HttpServletResponse response = ServletActionContext.getResponse(); response.setContentType("text/plain;charset=UTF-8"); String meidacode = sRequst.getParameter("mediaInfo.mediacode"); if(null != meidacode && "wangwang".equals(meidacode)){ //影片编码已经存在,不许注册 response.getWriter().write("false"); } else { //允许注册 response.getWriter().write("true"); } return null; }
struts.xml配置:可以不用配置<result>输出项。本方法的缺点是依赖于HttpServletResponse。
(2)、使用Struts2的stream返回类型:
Boolean canSign = true; // 数据库中是否存在该用户名 if (null != meidacode && "wangwang".equals(meidacode)) { canSign = false;// 表示存在,要返回false } inputStream = new ByteArrayInputStream(canSign.toString().getBytes()); //将true或者false转化为流,要为inputStream提供getter方法。 return null;
引用
由于remote规则只允许后台返回true或false,因此struts2的action得不同于一般的action,不能返回一个字符串,然后dispatch一个视图之类的。研究之后,发现struts2中有一种result类型:stream,通过该类型可以实现返回true或false。action代码如下
struts.xml配置:
<package name="media" extends="struts-default"> <action name="media" class="mediaAction"> <result type="stream"> <param name="contentType">text/plain</param><!-- 默认为text/plain --> <param name="inputName">inputStream</param><!-- 默认就为inputStream --> </result> </action> </package>
以上的contentType不能使用text/html类型,也可以不用配置该项,默认就是text/plain类型。