Il y avait une demande d'écrire directement dans HttpServletResponse, alors j'ai étudié comment le faire.
Tout ce que vous avez à faire est de définir HttpServletResponse dans l'argument Controller et d'y écrire.
HelloController.java
@Controller
public class HelloController {
@RequestMapping(value="/", method=RequestMethod.GET)
public void hello(HttpServletResponse response) throws Exception {
response.getWriter().write("hogehoge");
}
}
La valeur de retour est String. Si vous écrivez directement dans la réponse, null sera renvoyé.
HelloController.java
@Controller
public class HelloController {
@RequestMapping(value="/{param}", method=RequestMethod.GET)
public String hello(HttpServletResponse response, @PathVariable String param) throws Exception {
if(Objects.equals("param", param)){
response.getWriter().write("hogehoge");
return null;
}
return "hello";
}
}
Il y avait un rapport indiquant qu'un journal des erreurs est apparu lorsque j'ai renvoyé null. Quand j'ai vérifié le journal, j'ai cherché JSP mais je ne l'ai pas trouvé.
Donc, quand j'ai vérifié le code source, cela ressemblait à ce qui suit.
HelloController.java
@Controller
public class HelloController {
@Inject
HttpServletResponse response
@RequestMapping(value="/{param}", method=RequestMethod.GET)
public String hello(@PathVariable String param) throws Exception {
if(Objects.equals("param", param)){
response.getWriter().write("hogehoge");
return null;
}
return "hello";
}
}
Certes, une fois implémenté comme ça, il semblait rechercher une JSP et provoquer une erreur. Autrement dit, le processus de rendu de View est en cours d'exécution. Au fait, j'ai pensé que HttpServletResponse pouvait être injecté, mais ce n'est pas l'histoire principale, donc c'est fini.
Lorsque je vérifie le DispatcherServlet, j'exécute le HandlerAdapter pour obtenir le ModelAndView. À ce stade, si la valeur de retour est nulle, le traitement de rendu par View ne sera pas exécuté. Si vous écrivez directement la réponse, ce comportement est attendu. (DoDispatch, processDispatchResult, etc.)
En examinant le traitement de RequestMappingHandlerAdapter, null est renvoyé lorsque isRequestHandled de ModelAndViewContainer devient true. (GetModelAndView etc.)
Il existe différentes conditions, mais dans ce cas, il s'agit d'une condition selon laquelle HttpServletResponse est dans l'argument de la méthode Controller et la valeur de retour de Controller est nulle. La source où l'erreur s'est produite utilise le HttpServletResponse défini dans le champ, de sorte que la valeur de retour du HandlerAdapter n'est pas devenue nulle.
Si vous suivez le processus de applyDefaultViewName de DispatcherServlet, vous pouvez voir que l'URL demandée est appliquée comme nom de vue.
Ajoutons HttpServletResponse comme argument. Si vous ne pouvez pas faire cela, définissons le type de retour de Controller sur ModelAndView comme suit.
HelloController.java
@Controller
public class HelloController {
@Inject
HttpServletResponse response
@RequestMapping(value="/{param}", method=RequestMethod.GET)
public ModelAndView hello(@PathVariable String param) throws Exception {
if(Objects.equals("param", param)){
response.getWriter().write("hogehoge");
return null;
}
return new ModelAndView("hello");
}
}
Vous pouvez voir pourquoi cela fonctionne en lisant ModelAndViewMethodReturnValueHandler.
Recommended Posts