2015-08-04 2 views
0

Я унаследовал веб-проект весны 4 на работе, который настроен с использованием структуры представления Tiles, рамки Spring для диспетчерского сервлета и IOC.Весна 4 ответ на форму представления dosent go toru view resolver. Возвращает возвращаемую строку в ответ

Я пытаюсь создать функцию сброса пароля, которая имеет три экрана с тремя формами.

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

<form:form class="form-horizontal" action="/NCHP/reset.htm" method="post" id="resetForm"> 
            <fieldset> 
             <legend>Enter your registered email address</legend> 
             <div class="form-group"> 
              <div class="col-sm-12"> 
               <input id="resetEmail" name="email" class="form-control" placeholder="Email" required="required" tabindex="1" type="email"> 
              </div> 
             </div> 
             <div class="form-group"> 
              <div class="col-sm-12 "> 
               <span class="pull-right"> 
                <button type="reset" class="btn btn-default" data-dismiss="modal">Back</button> 
                <button type="submit" class="btn btn-primary" >Submit</button> 
               </span> 
              </div> 
             </div> 
            </fieldset> 
           </form:form> 

2) Форма для входа Темп PWD:

<form:form class="form-horizontal" name="verify" method="POST" id='verifyform'> 

             <div class="form-group has-feedback"> 
              <i class="glyphicon glyphicon-user form-control-feedback"></i> 
              <input type="text" id="inputEmailVerify" name="userNameVerify" placeholder="User Name" class="form-control" autofocus="autofocus"> 
             </div> 

             <div class="form-group has-feedback"> 
              <i class="glyphicon glyphicon-lock form-control-feedback"></i> 
              <input type="password" name="passwordVerify" id="inputPasswordVerify" placeholder="Password" class="form-control" autofocus="autofocus"> 
             </div> 
             <div class="form-group" id="verify-btn"> 
              <div class="col-sm-12 "> 
               <span class="pull-right"> 
               <input type="submit" formaction="/NCHP/resetVerify.htm" value="Verify" class="btn btn-primary btn-block"> 
               </span> 
              </div> 
             </div> 
            </form:form> 

3) формы ввести новый пароль:

<form:form class="form-horizontal" name="resetPass" method="POST" id='resetPassForm' > 

             <div class="form-group has-feedback"> 
              <i class="glyphicon glyphicon-lock form-control-feedback"></i> 
              <input type="password" id="newpass" name="newpass" placeholder="new Password" class="form-control" autofocus="autofocus"> 
             </div> 
             <div class="form-group has-feedback"> 
              <i class="glyphicon glyphicon-lock form-control-feedback"></i> 
              <input type="password" name="newpass2" id="newpass2" placeholder="re enter Password" class="form-control" autofocus="autofocus"> 
             </div> 
             <div class="form-group" id="new-login-btn"> 
              <div class="col-sm-12 "> 
               <span class="pull-right"> 
             <input type="submit" formaction="/NCHP/changePass.htm" value="Save Password" onsubmit="modaljay();" class="btn btn-info btn-block"> 
             <div class="modaljay"><!-- Place at bottom of page --></div> 
             </span> 
             </div> 
             </div> 
            </form:form> 

Первые две формы я делаю AJAX Submit и получить обратно только данные без вида, как показано ниже, с помощью jquery $ .ajax()

$('#resetForm').submit(function(event) { 
             $("#verifyModal").hide(); 
             $("passModal").hide(); 
             var resetmail = $('#resetEmail').val(); 
             console.log(resetmail); 
             var json = { 
              "email" : resetmail 
             }; 

             $.ajax({ 
                url : "http://localhost:8080/NCHP/reset.htm", 
                data : json, 
                dataType : 'text json', 
                type : "POST", 

                success : function(e) { 
                 $('#resetModal').modal('hide'); 
                 $("#verifyModal").modal('show'); 
                 console.log(e); 
                }, 
                error : function(e) { 
                 console.log(e); 
                 if (e.responseText == "email sent") { 
                  $('#resetModal').modal('hide'); 
                  $("#verifyModal").modal('show'); 
                 } else if (e.responseText == "email not sent. UNAUTHORIZED") { 
                  $("#emailResponce").html("there was an error. We could not process your request at this time. Please contact [email protected]"); 
                 } 
                } 
               }); 

             event.preventDefault(); 
            }); 

Третья форма - обычная подача формы и отсутствие представления ajax. потому что я хочу, чтобы пользователь был перенаправлен на свою домашнюю страницу после входа в систему с помощью temp и установки нового пароля.

Ниже приведены сопоставления контроллеров для первых двух форм.

@Controller 
public class UserLoginreset 
{ 
@Autowired 
public UserDao userDao; 
@Autowired 
public BCryptPasswordEncoder encoder; 
@Autowired 
public SecureServiceClient serviceClient; 

@RequestMapping(value = "/reset", method = RequestMethod.POST) 

public @ResponseBody String reset(@RequestBody(required=true) String email, 
              HttpServletRequest request) 
{ 
    String mail=""; 
    try{ 
      mail = java.net.URLDecoder.decode(email, "UTF-8").replace("email=", ""); 
     } 
    catch (UnsupportedEncodingException e){ 
      e.printStackTrace(); 
     } 
    User user =userDao.findUserByemail(mail); 
    request.getSession().setAttribute("user",user); 
    String resetPwd= encoder.encode("xxxx"); 

    if(user!=null && email!=null){ 
     userDao.resetPass(user.getUser_name(), resetPwd); 
     return (String) serviceClient.returnRestTemplate("email", mail);//"home"; 
    } else { 
     return "login";//"index"; 
    } 
} 

@RequestMapping(value = "/resetVerify", method = RequestMethod.POST) 
public @ResponseBody String resetVerify(@RequestParam(value="user",required=true) String user,@RequestParam(value="pass",required=true) String pass, 
              HttpServletRequest request) 
{ 
    User user1 =userDao.findUserByName(user); 
    if(user1!=null && pass.matches("xxxx")){ 
     return "success";//"home"; 
    } else { 
     return "unauthorised";//"index"; 
    } 

} 

}

и третья форма.

@RequestMapping(value = "/changePass", method = RequestMethod.POST) 
public @ResponseBody String resetPass(@RequestParam(value="newpass", required=true) String newpass, @RequestParam(value="newpass2", required=true) String newpass2, 
              HttpServletRequest request, Model model, HttpServletResponse httpServletResponse) 
{ 
    User user = (User)request.getSession(false).getAttribute("user"); 
    if(user.getUser_name()!=null && newpass.matches(newpass2)){ 
     userDao.resetPass(user.getUser_name(), encoder.encode(newpass)); 
     String news = userDao.getDynamicNewsByUser(user.getUser_name()); 
     model.addAttribute("user",user); 
     model.addAttribute("news", news); 
     return "MainLayout_Jay";//"home"; 

    } else { 
     return "login";//"index"; 
    } 

} 

И ниже моя весна конфигурации

<bean id="annotationResolver" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" /> 
<context:component-scan base-package="com.nexis.cardholder" /> 
<mvc:annotation-driven > 
</mvc:annotation-driven> 
<mvc:default-servlet-handler /> 
<mvc:interceptors> 
    <bean class="com.nexis.cardholder.session.interceptors.URLInterceptor" /> 
</mvc:interceptors> 
<mvc:resources mapping="/resources/**" location="/resources/" /> 
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix"> 
     <value>/Pages/</value> 
    </property> 
    <property name="suffix"> 
     <value>.jsp</value> 
    </property> 
    <property name="order" value="1" /> 
</bean> 
<bean id="viewResolver" class="org.springframework.web.servlet.view.tiles3.TilesViewResolver" > 
    <property name="order" value="2" /> 
</bean> 
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" id="tilesViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView" /> 
    <property name="order" value="0" /> 
</bean> 
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer"> 
    <property name="definitions"> 
     <list> 
      <value>/WEB-INF/views.xml</value> 
     </list> 
    </property> 
</bean> 

У меня есть два вопроса. 1) Последний дозатор представления формы возвращает представление с данными в нем. Он просто возвращает пустую страницу с возвращаемой строкой метода контроллера.

2) Я сконфигурировал домашнюю страницу в файле tiles.xml и поместил ее в папку/webcontent/pages. так что, если плитка видит, что распознаватель не смог ее найти, должен быть обычный резольвер. я сомневаюсь, что он рассматривает этот запрос как запрос ajax и полностью пропускает часть отображения модели. как я могу выяснить основную причину.

2.5) если я хочу анализировать запросы ajax как Json, должен ли я использовать @restcontroller и будет ли он автоматически отправлять ответ как json? Я попытался использовать MappingJackson2HttpMessageConverter, но не видел никакой разницы в режиме отладки? он даже привык?

ответ

0

Got it. Это не заняло столько времени, сколько набирало этот вопрос.

мне нужно, чтобы удалить @ResponseBody аннотацию на

общественного @ResponseBody Струнный resetPass (