2016-04-13 2 views
2

Прежде всего, я использую простую тему, но даже без нее происходит такое же поведение (кроме форматирования страницы). Когда я отправляю форму, поле имени становится пустым и перенаправляет на register.jsp без отображения ошибки проверки. После проверки журналов или отладчика кажется, что проверка правильной работы и сообщения журнала сервера написаны так, как ожидалось. Я опубликую общий код.Проверка работоспособности Struts2 не работает должным образом, сообщения об ошибках проверки не показаны

struts.properties

struts.ui.theme=simple 

MyAction

private User user = new User() // getter and setter 

@Inject 
transient UserDAO userDAO; 

@Override 
public User getModel() { 
    return user; 
} 

public void validate(){ 

    LOG.debug("NAME VALIDATION " + user.getName()); 
    if("".equals(user.getName())){ 
     addFieldError("user.name", "Name can't be empty"); 
     LOG.debug("Validation Error on name"); 
    }  
} 

Проверено с отладчиком, проверить метод работает и журналы записываются.

struts.xml

<package name="users" extends="struts-default"> 
    <action name="registerUser" method="prepareRegister" class="com.test.MyAction"> 
     <result name="success">/register.jsp</result> 
    </action> 

    <action name="saveOrUpdateUser" method="saveOrUpdate" class="com.test.MyAction"> 
     <result name="input" type="redirect">registerUser</result> 
     <result name="success" type="redirect">listUser</result> 
    </action> 
</package> 

register.jsp

<td> 
    <s:textfield id = "userName" 
       label = "User Name" 
       name = "user.name" /> 
</td> 
<s:fielderror fieldName = "user.name" /> 

Не стесняйтесь спросить у меня уточнений. Я довольно новичок в struts 2, я попробовал процедуру проверки документации struts 2 и также проверил другие учебники. Я не знаю, не хватает ли чего-то или у меня есть некоторая конфигурация, которую я не замечаю, поскольку логика работает, а часть представления (jsp) - нет. Заранее спасибо.

+1

'getModel()' - используя modeldriven? Прекратите использовать его. –

+0

@Aleksandr M: Если это связано с моей проблемой, я буду :) – manu

+0

'redirect' удалит все ошибки. Не перенаправлять. И вообще, 'redirectAction' должен использоваться для перенаправления на действие. –

ответ

2

После прочтения how the INPUT result works и отказавшись от шаблона проектирования ModelDriven, что ничего не добавляет к вашему опыту программирования, кроме проблем, которые могли бы легко hide themselves in the middle of the Interceptor Stack отметить, что:

  • redirect является результатом использования при перенаправлении внешних URL-адресов или URL без действия, тогда как redirectAction следует использовать при перенаправлении на действие;
  • При переадресации создается новый запрос, и, следовательно, старые параметры (включая ошибки действий и сообщения и полевые ошибки) теряются.

Чтобы предотвратить это, если вы хотите продолжать использовать шаблон PRG (и, следовательно, перенаправление), вы можете использовать MessageStore Interceptor, который будет хранить и получать сообщения для вас через перенаправления; просто определите стек перехватчика, который содержит его, и он решит вашу проблему.

Или сделать это один раз, как in the example from the documentation.

+0

Спасибо за полезный материал Андреа. Я отказался от ModelDriven, и я попробовал это в struts.xml: добавил в action saveOrUpdateUser, хранил перехватчик с операцией STORE и defaultStuck. Затем я изменил тип ввода на redirectAction. Я что-то пропустил? После отправки формы с пустым именем перенаправляется на ту же страницу с пустыми полями. Ошибок проверки не отображаются. – manu

+1

'defaultStuck' путается забавно: D –

+1

Кстати: в struts.xml определите стек вашего (myStack), созданного копированием взорванного' defaultStack' (взято здесь https://struts.apache.org/docs/ struts-defaultxml.html) и добавление к нему перехватчика messagestore. Затем используйте 'default-interceptor-ref', чтобы указать, что myStack является перехватчиком по умолчанию для каждого действия, которое не определяет сам стек. Затем установите его в AUTOMATIC: он будет работать для каждого перенаправления, возможно, не давая вам недостатков. Если он все еще не работает, отредактируйте вопрос с обновленным кодом, и мы увидим –

1

Это то, что сделал работу в конце и после полезные комментарии Андреа:

<action name="saveOrUpdatePlayer" method="saveOrUpdate" class="com.test.MyAction"> 

    <interceptor-ref name="store"> 
     <param name="operationMode">STORE</param> 
    </interceptor-ref> 
    <interceptor-ref name="defaultStack" /> 

    <result name="input">/register.jsp</result> 
    <result name="success" type="redirectAction">listUser</result> 
</action> 

При этом, сообщения проверки отображаются правильно. Когда я использовал redirectAction тип для input, сообщения исчезали. Похоже, defaultStack выполнил свою работу.

+1

Проверьте, чтобы настроить перехватчики в верхней части struts.xml, так что вам не нужно наносить их на каждое действие отдельно. – Panos

Смежные вопросы