kui(kui) 请您具体解释一下!!

解决方案 »

  1.   

    <logic:messagesPresent>
       <bean:message key="errors.header"/>
       <ul>
       <html:messages id="error">
          <li><bean:write name="error"/></li>
       </html:messages>
       </ul><hr>
    </logic:messagesPresent>
    我看到有些例子是用 html 标签中 message 这个 bean 来做提示的 , id="error" 是不是应该在actionform 中 定义呢?? 还是在别的地方!!!! 我是个初学者!
      

  2.   

    顺便问一个别的问题:谁用过 java 调用 ocx 或者 dll 听说要使用 jni 接口 ? 有没有相关的例子??我指的不是在jsp 内用 javascript 或 vbscript 调用ocx!而是在 java 中的rmi 或 自己的类里调用也就是说在server 中调用!!!!!!!
      

  3.   

    1、先建立一个propertier文件(定义错误的显示方式)
    2、在web.xml中进行参数定义
    3、在actionform中进行检测的定义
    4、在struts-config.xml中对actionform的action加上判断。
    5、在jsp页面上加上<html:errors>
      

  4.   

    你说的对我也是按照上面的步骤来做的! 但是 不知道在那个环节出现了错误! ^_^
    但我可以肯定的是我是在显示错误的提示信息时出现的异常!!
    <logic:messagesPresent>
       <bean:message key="errors.header"/>
       <ul>   <html:messages id="error" >              //异常位置
          <li><bean:write name="error"/></li>
       </html:messages>
       </ul><hr>
    </logic:messagesPresent>
      

  5.   

    我记得以前用Struts开发时,
    关于这个<html:errors>,它是保存在Request里的。
    如果你得Request里没有errors的话,<html:errors>它是不起作用的(不显示)。还有,他跟Properties文件的位置也是有关系的。
    好像是得带个包名!自己再调调吧不难的。 将“流氓无赖”测试到底
    ——始于2003年7月
    树欲止而风不停,行云流水匆匆去;
    树梢蚂蚱凭空望,江边浪花碎巨石; 支持“流金岁月”!!!
    发送框,少个“右键菜单,选择粘贴”;
    ——2003年12月24日am^@^
      

  6.   

    你可以在jsp里检查一下是不是有error这个对象 将“流氓无赖”测试到底
    ——始于2003年7月
    树欲止而风不停,行云流水匆匆去;
    树梢蚂蚱凭空望,江边浪花碎巨石; 支持“流金岁月”!!!
    发送框,少个“右键菜单,选择粘贴”;
    ——2003年12月24日am^@^
      

  7.   

    to :Leemaasn(祝大家新年愉快!) 你说得有道理,但是 我怎么才知道 Request 里是否存在 errors 呢 ?
      

  8.   

    还有在你的<action    path="/user_edit"
                   type="com.user.UserEditAction"
           name="user_editForm"
           scope="request"
           input="/manage/user/user_add.jsp"
           validate="true">
           <forward name="success"      path="/manage/user/user_add.jsp"/>
           <forward name="fail"      path="/err/err.jsp"/>    </action>注意 : validate="true"> 要这样写
    那里的判断才能进行
      

  9.   

    我也是那样写的啊 !!但是  对于 数据具体的判断应该在哪里呢 ??实在 actionform 里 还是在 action 里?? 或者就在 validation.xml 里??
      

  10.   

    哦 MY GOD 刚才好象回答错了不好意思啊
    package com.user;import javax.servlet.http.HttpServletRequest;
    import org.apache.struts.action.ActionError;
    import org.apache.struts.action.ActionErrors;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionMapping;
    import org.apache.struts.util.*;
    import java.util.*;public class LogonForm extends ActionForm {
       private String loginuserpassword = null;
       private String loginusername = null;
           public String getLoginuserpassword() {
          return loginuserpassword;
       }   public void setLoginuserpassword(String loginuserpassword) {
          this.loginuserpassword = loginuserpassword;
       }   public String getLoginusername() {
          return loginusername;
       }   public void setLoginusername(String loginusername) {
          this.loginusername = loginusername;
       }       public void reset(ActionMapping mapping, HttpServletRequest request) {
          loginusername = null;
          loginuserpassword = null;
    //初始化登陆页面的option 实际应用中要做到bean中 
       
       }   public ActionErrors validate(ActionMapping mapping,
                                 HttpServletRequest request) {
          ActionErrors errors = new ActionErrors();
          if((loginusername == null) || (loginusername.length() < 1)) {
             errors.add("loginusername",
                 new ActionError("error.loginusername.required"));
          }
          if((loginuserpassword == null) || (loginuserpassword.length() < 1)) {
             errors.add("loginuserpassword",
                 new ActionError("error.loginuserpassword.required"));
          }      return errors;
       }
    }这是我FORM里的 在这里可以进行判断啊
      

  11.   

    有一个疑问你觉得 这种结构 要把所有的验证都方到 actionform 里面 合理么??
      

  12.   

    你的action 里 是怎么处理的呢 ??
      

  13.   

    package shopbag;import org.apache.struts.action.*;
    import javax.servlet.http.*;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;public class RegistrationAction extends Action
    {
      private Log log;  public RegistrationAction()
      {
          log = LogFactory.getFactory().getInstance(getClass().getName());
      }  public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
          throws Exception
      {
          HttpSession session = request.getSession();
          java.util.Locale locale = getLocale(request);
          org.apache.struts.util.MessageResources messages = getResources(request);
          OrderCarForm info = (OrderCarForm)form;      String action = request.getParameter("action");
          if(isCancelled(request))
          {
              if(log.isInfoEnabled())
                  log.info(" " + mapping.getAttribute() + " - Registration transaction was cancelled");
              removeFormBean(mapping, request);
              return mapping.findForward("success");
          }
          /*
          else
          {
            ActionErrors errors = new ActionErrors();
            System.out.println("in action errorsadd !!");
            errors.add(ActionErrors.GLOBAL_ERROR,new ActionError("error"));
            request.setAttribute("org.apache.struts.action.ERROR",errors) ;
            saveErrors(request,errors);
            //return (new ActionForward(mapping.getInput()));
            System.out.println("out action errorsadd !!");
            return mapping.findForward("error");
            //return (new ActionForward(mapping.getInput()));
          }
            */
          ActionErrors errors = info.validate(mapping, request);
                  if(errors != null && errors.isEmpty())
                  {
                      if(info.getPage() == 1)
                          return mapping.findForward("input2");
                      if(info.getPage() == 2)
                          return mapping.findForward("success");
                  } else
                  {
                      saveErrors(request, errors);
                      if(info.getPage() == 1)
                          return mapping.findForward("input" + info.getPage());
                      if(info.getPage() == 2)
                          return mapping.findForward("input" + info.getPage());
                  }
                  return mapping.findForward("input1");  }  protected void removeFormBean(ActionMapping mapping, HttpServletRequest request)
      {
          if(mapping.getAttribute() != null)
              if("request".equals(mapping.getScope()))
              {
                  request.removeAttribute(mapping.getAttribute());
              } else
              {
                  HttpSession session = request.getSession();
                  session.removeAttribute(mapping.getAttribute());
              }
      }}这是我的actiong 有一部分隐掉了 是我调试用的 !!
      

  14.   

    楼主的上述程序出错处理主要有三个地方:一是Action中的出错处理:
    ActionErrors errors = new ActionErrors();
            System.out.println("in action errorsadd !!");
            errors.add(ActionErrors.GLOBAL_ERROR,new ActionError("error.login.failed"));
            saveErrors(request,errors);
            return (new ActionForward(mapping.getInput()));
    二是ActionForm中validate效验:
     public ActionErrors validate(ActionMapping actionMapping, HttpServletRequest httpServletRequest)
      {
       /**@todo: finish this method, this is just the skeleton.*/
       ActionErrors errors = new ActionErrors();
       
           errors.add("username", new ActionError("username.errors"));
           return errors;
     }三是定义Bean一个出错消息属性:
    ublic String getErrormessage()
      {
        return errormessage;
      }
      public void setErrormessage(String errormessage) {
        this.errormessage = errormessage;
      }前两个出错处理的本质是一样的,都是通过ActionServlet把错信息转发到输入页面中:其中validate效验是在表单提交到ActionServlet中调用Action前由ActionServlet调用处理的,当validate返回的错误数不为0时,在列出错误键名的Request属性中保存这个实例,并不再调用Action而是直接转发到输入页面中,如果在输入页面中有<html:errors/>标签,将显示出错信息。Action中的出错处理也是同样的道理,由ActionServlet把出错信息转发到输入页面中。要注意的是转发的是输入页面而不是输出页面,如果转发到输出页面,如果是saveErrors函数用request值,将得不到出错信息。
     前两个出错处理不同的是前者要用saveErrors(request,errors)保存出错消息,后者由ActionServlet自动完成。
    另外一个是楼主在Bean中自己定义了一个errormessage属性,采用通常的显示Bean属性的方法显示就行了,但是楼主如下代码:
    OrderCarForm form = new OrderCarForm();
    form.setErrormessage("用户名称不可以为空!");
    这样不行的,不要用新的对象,直接用setErrormessage("用户名称不可以为空!");就行了。前两者楼主的代码没有错误,主要代码我调试了一次,能正常显示出错消息,如果用<html:errors/>标签不显示出错消息,那只有一种可能,就是在shopbag\ApplicationResources.properties文件没定义键值username.errors(注意文件路径shopbag\)。要注意的是new ActionError("username.errors")是提取properties文件中的username.errors的值,而不是生意定义一个新的username.errors值。对于下述代码:
    <logic:messagesPresent>
       <bean:message key="errors.header"/>
       <ul>   <html:messages id="error" >              
          <li><bean:write name="error"/></li>
       </html:messages>
       </ul><hr>
    </logic:messagesPresent>
    我调试没能过, 建议用<html:errors/>标签行了。
      

  15.   

    to : kui(kui)  感谢你的详细解答,对于struts 我也是初学 !
      这段程序已经调试好了,问题的确是在 对errors 引用上  马上结贴 ! 我想请教一下 : 我感觉对于数据的验证 在server端上执行 无论是安全性还是这对执行效率 都应该很优化 ! 但是对于复杂的处理,如果都放到actionform 里去执行 ??!! 这合理么? 您在大中型项目中是怎么组织结构的呢 ?? 还有,如果结合ejb 对于那些复杂逻辑处理怎么样才可以合理的调用呢 ?  感谢各位的参与和帮助 !! 以后希望我们共同进步!
      

  16.   

    对于数据的验证问题,特别是数据量大时,最好采用在客户端进行验证,方法是在<html:javascript/>标签中处理,例如Struts11RC2中的struts-example就是这样做的,你上述也用了这个标签,<html:javascript/>标签可以理解为把放在配置文件中的javascript代码插入到JSP页中。详细分析一下Struts11RC2中的struts-example有关Logon部分的代码,什么都清楚了,javascript代码放在validator-rules.xml文件中。