Es gab eine Anfrage, direkt an HttpServletResponse zu schreiben, daher habe ich untersucht, wie das geht.
Sie müssen lediglich HttpServletResponse im Controller-Argument definieren und darauf schreiben.
HelloController.java
@Controller
public class HelloController {
@RequestMapping(value="/", method=RequestMethod.GET)
public void hello(HttpServletResponse response) throws Exception {
response.getWriter().write("hogehoge");
}
}
Der Rückgabewert ist String. Wenn Sie direkt in die Antwort schreiben, wird null zurückgegeben.
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";
}
}
Es gab einen Bericht, dass ein Fehlerprotokoll angezeigt wurde, als ich null zurückgab. Als ich das Protokoll überprüfte, suchte ich nach JSP, konnte es aber nicht finden.
Als ich den Quellcode überprüfte, sah er wie folgt aus.
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";
}
}
Bei einer solchen Implementierung schien es sicherlich nach einer JSP zu suchen und einen Fehler zu verursachen. Das heißt, der Renderprozess von View wird ausgeführt. Übrigens dachte ich, dass HttpServletResponse injiziert werden kann, aber es ist nicht die Hauptgeschichte, also ist es vorbei.
Wenn ich das DispatcherServlet überprüfe, führe ich den HandlerAdapter aus, um das ModelAndView abzurufen. Wenn der Rückgabewert zu diesem Zeitpunkt null ist, wird die Renderverarbeitung durch View nicht ausgeführt. Wenn Sie die Antwort direkt schreiben, wird dieses Verhalten erwartet. (DoDispatch, processDispatchResult usw.)
Bei der Verarbeitung von RequestMappingHandlerAdapter wird null zurückgegeben, wenn isRequestHandled von ModelAndViewContainer true wird. (GetModelAndView usw.)
Es gibt verschiedene Bedingungen, aber in diesem Fall ist es eine Bedingung, dass das Argument der Controller-Methode HttpServletResponse enthält und der Rückgabewert vom Controller null ist. Die Quelle, in der der Fehler aufgetreten ist, verwendet die im Feld definierte HttpServletResponse, sodass der Rückgabewert des HandlerAdapter nicht null wurde.
Wenn Sie den Vorgang von applyDefaultViewName von DispatcherServlet aus verfolgen, können Sie sehen, dass die angeforderte URL als Ansichtsname angewendet wird.
Fügen wir als Argument HttpServletResponse hinzu. Wenn Sie dies nicht tun können, setzen wir den Rückgabetyp des Controllers wie folgt auf ModelAndView.
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");
}
}
Sie können sehen, warum dies funktioniert, indem Sie ModelAndViewMethodReturnValueHandler lesen.
Recommended Posts