首先是通過一個ForwardAction
public class ForwardAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private BookTypeDao bookTypeDao;// 依赖Spring注入
private BookPressDao bookPressDao;// 依赖Spring注入
private List<BookType> types;
private List<BookPress> press;
// 跳转到添加图书页面
public String execute() throws Exception {
types = bookTypeDao.listBookType();
press = bookPressDao.listBookPress();
return SUCCESS;
}
         //get set 省略
}
跳转到页面addBook.jsp
<s:form action="addBook">
  <s:textfield required="true" maxlength="50" label="书名" name="name" />
  <s:textfield required="true" maxlength="20" label="作者" name="author" />
  <s:textfield required="true" label="页数(10~10000)" name="pages" />
  <s:textarea label="备注" name="re" />
  <s:select list="types" label="分类" name="type_id" listKey="id" listValue="name" />
  <s:select list="press" label="出版社" name="press_id" listKey="id" listValue="name" />
  <s:submit value="添加"></s:submit>
</s:form>
校验失败后,又跳转回addBook.jsp但是<result name="input">/WEB-INF/jsp/addBook.jsp</result>是会发生异常的,因为没有对types和press赋值会出现异常。但是如果用<result name="input" type="redirect">ForwardAction</result>可以正常到达addBook.jsp,可是不会显示校验出错的提示信息。有什么方法可以解决?

解决方案 »

  1.   

    so far !赚分 !帮楼主顶!
      

  2.   

    http://blog.csdn.net/APOLLO_TS/archive/2010/03/01/5336849.aspx第二条
      

  3.   

    4楼 不是要显示单独字段的错误,而是既要能正确的到达addBook.jsp页面又要显示出校验信息。比如说我编写的校验文件限定了书名和作者不能为空,如何能显示出“书名不能为空”“作者不能为空”这样的提示。
      

  4.   

    我找到的方法是采用<result name="input" type="chain">ForwardAction<result>,用链式Action实现。不知道各位有什么其他的方法和建议?
      

  5.   

    用校验框架!<validators>
        <field name="user.userName">
            <field-validator type="requiredstring">
                <param name="trim">true</param>
                <message key="HUMSG001"></message>
            </field-validator>
        </field>
      

  6.   

    有用校验框架的,看来各位没有看清楚问题。就是用校验框架校验不符合要求后会返回input视图,但是要怎样来回到我原来的addBook.jsp页面。要是用默认的dispatcher
    <result name="input">/WEB_INF/jsp/addBook.jsp</result>这样是会报异常的,因为addBook.jsp页面里有
    <s:select list="types" label="分类" name="type_id" listKey="id" listValue="name" /> 
    这样的标签。必须通过ForwardAction来跳转到addBook.jsp页面才能为types赋值,才不会发生异常!但是如果是用redirect方式 会失去校验失败的信息。
      

  7.   

    <s:select 你这个标签要是不能保存住值,那你要多看看环境部署了,s标签都是有存值功能的。一般采用静态List存 select的值。先别用校验框架,就是一个回显值都可以使用OGNL表达式在页面上显示出来,你的要是不能显示可就太背了!

    @Override
    public void validate(){
            写上你的方法注入值即可。
            }
      

  8.   

    <s:select list="types" label="分类" name="type_id" listKey="id" listValue="name" />
    private List <BookType> types; 
    //types是用的List存的,为它赋值是通过ForwardAction执行的execute()方法
    public String execute() throws Exception { 
       types = bookTypeDao.listBookType(); //调用做好的方法,从数据库或得所有图书类型
       return SUCCESS; 

    你的意思在校验失败后input视图那里 到底该怎么做?
    <result name="input"></result>这里
      

  9.   

    我在网上找到的做法是用链式Action,在input视图那里:
    <result name="input" type="chain">ForwardAction</result>
    并且需要
    <action name="ForwardAction" class="forwardActionBean">
      <result name="input">/WEB-INF/jsp/addBook.jsp</result>
      <result name="success">/WEB-INF/jsp/addBook.jsp</result>
    </action>
    必须要加上<result name="input">/WEB-INF/jsp/addBook.jsp</result>
    结果才行。我试过能行。