Java 如何在Action类之外从Struts2向HTML发布错误消息

Java 如何在Action类之外从Struts2向HTML发布错误消息,java,spring,validation,jsp,struts2,Java,Spring,Validation,Jsp,Struts2,我有一个注册程序。在数据库中插入记录时,我将实例化一个类并调用方法insert()。当我插入同一条记录时,当然会出现重复的数据错误和大量错误消息。我想用try和catch捕捉它。我能做到。但是,我不知道如何向JSP显示消息 据我所知,在action类中,首先运行validate()方法和validation.xml。调用这些方法后发生了insert duplicate错误 import com.opensymphony.xwork2.ActionSupport; import lotmoveme

我有一个注册程序。在数据库中插入记录时,我将实例化一个类并调用方法
insert()
。当我插入同一条记录时,当然会出现重复的数据错误和大量错误消息。我想用
try
catch
捕捉它。我能做到。但是,我不知道如何向JSP显示消息

据我所知,在action类中,首先运行
validate()
方法和
validation.xml
。调用这些方法后发生了insert duplicate错误

import com.opensymphony.xwork2.ActionSupport;
import lotmovement.business.crud.InsertUserProfile;
import lotmovement.business.entity.UserProfile;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class RegisterAction extends ActionSupport {

    private static String userId;
    private static String password;
    private static String firstName;
    private static String lastName;
    private static int securityLevel;

    @Override
     public String execute() {    
         ApplicationContext context = 
                 new ClassPathXmlApplicationContext("spring.xml");

          InsertUserProfile iup = 
                 (InsertUserProfile)context.getBean("insertuserprofile");
         iup.Insert();       

      return SUCCESS;
    }
这是我的插入用户配置文件方法

 public void Insert() {          
    ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
    UserProfile up = (UserProfile)context.getBean("userprofile");
    RegisterAction ra = (RegisterAction)context.getBean("registeraction");
    EntityStart es = (EntityStart)context.getBean("entitystart");

    es.StartDbaseConnection();

    up.setUserId(ra.getUserId());
    up.setFirstName(ra.getFirstName());
    up.setLastName(ra.getLastName());
    up.setPassword(ra.getPassword());
    up.setSecurityLevel(ra.getSecurityLevel());

    es.StartPopulateTransaction(up);

    es.CloseDbaseConnection();        
}
这是我的JSP:

<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  <link rel="stylesheet" type="text/css" href="CSS/register.css">
  <title>Register</title>
  <s:head />
</head>
<body>
<s:form method="POST" action="register" >
  </tr>
  <tr>
    <td colspan="2">
      <s:actionerror/>
      <s:fielderror/>
    </td>
  </tr>
  <s:textfield label="UserID"     key="userId" maxLength="20"/>
  <s:password label="Password"    key="password" maxLength="20"/>
  <s:password label="retype-Password"  key="retypepassword" maxLength="20"/>
  <s:textfield label="Firstname"  key="firstName" maxLength="20"/>
  <s:textfield label="Lastname"   key="lastName" maxLength="20"/>
  <s:textfield label="SecurityLevel" key="securityLevel" maxLength="20"/>
  <s:submit   value="Register"/>
</s:form>
</body>
</html>

登记

ActionSupport
中有
addActionError
addFieldError
方法。您可以捕获
validate
方法中的任何错误。并在提交错误数据时调用这些方法。一旦应用,请求将发送到
输入
结果。在JSP中,您可以使用
试试这个:

1.定义自己的异常类

public class MyException extends Exception {}
2.如果
insert
方法中存在异常,则抛出此异常

if(insertError){
    throw new MyExecption("your message");
}
3.在action类中,使用try-catch块调用
insert方法

try{
    insert();
} catch(MyException me){
    addActionError(me.getMessage());
    return "anything_you_want";
}

4.您可以使用

在jsp中显示消息,您的意思是即使在action类之外也可以使用ActionSupport吗?如果我在insertrecord类上放置了一个验证方法,验证方法仍然是第一个触发的方法?不,您的操作应该扩展
ActionSupport
,它覆盖了
validate
方法。是的,这是我的问题,因为我所做的是。Actionclass-->insertrecord类。错误发生在insertrecord类的insertmethod中。insertrecord已在actionclass之外?对不起,我问了一些愚蠢的问题,我在这个问题上非常乞讨。感谢您可以编写一个代码来检查是否可以插入记录,并通过
validate
方法调用此代码。如果结果是否定的,那么按照我的回答去做。非常感谢。所以try-catch不应该在insert方法中。但是在动作课上取而代之。:)这是一个非常糟糕的解决方案。请看我的答案,这篇文章的评论中有一个链接解释得很好。@RomanC我读了你的活动,在这种情况下,他在访问db之前无法进行验证,如果你坚持覆盖
validate
方法,他每次填充操作时必须访问db 2次。一次检查用户是否已存在,另一次保存用户。我认为你投了反对票。请考虑一下你的解决方案,然后把我的分数还给我。你不明白,db访问不是问题,在验证过程之前,它可能需要访问任意多次。ORM为您承担所有数据库访问。@Stevenbeintez很抱歉打扰您,请您解释一下。请考虑使用S2 Spring插件;你在行动中做了大量的体力劳动,这既不必要也没有效率。此外,每个请求都会实例化操作:静态变量在几乎所有情况下都非常糟糕,会导致竞争条件和其他不确定行为,特别是在负载下。