java - ejemplo - httpurlconnection example
Avanzar hacia adelante con parĂ¡metros agregados? (4)
¿Hay alguna manera de reenviar una solicitud a otro Controlador al agregarle algunos datos de parámetros? Traté de agregar al ModelMap, pero no parece que se mantenga. Estoy haciendo algo como:
return "forward:/my-other-controller";
Solo otra forma en que puedo pensar es poner los parámetros en la sesión y luego soltarlos en el controlador objetivo.
¿Has considerado filtros? Puede crear un filtro utilizando el proxy de filtro de delegación que le dará acceso a los parámetros de solicitud, así como a los beans de primavera.
Considere el reenvío al igual que el redireccionamiento, pero sin la necesidad de un contexto y host en este sentido (el servidor maneja el reenvío interno, mientras que el redireccionamiento le indica al navegador del usuario que solicite un URL diferente).
Entonces, sí, use la sesión, las cookies o publíquelos o consiga los parámetros.
La forma más sencilla es agregar los datos a la solicitud. Como se trata de un reenvío, se pasa la misma solicitud a diferentes controladores dentro del servidor.
Como ejemplo, comencemos con una configuración simple de dos controladores, un reenvío al otro:
@Controller
public class TestController {
@RequestMapping(value="/test")
public String showTestPage() {
return "forward:/test2";
}
}
@Controller
public class TestController2 {
@RequestMapping(value="/test2")
public String showTestPage() {
return "testPageView";
}
}
La primera forma de agregar los datos es establecerlo como atributos en la solicitud. Los nuevos controladores se verán así ( A ):
@Controller
public class TestController {
@RequestMapping(value="/test")
public String showTestPage(HttpServletRequest request) {
request.setAttribute("param1", "foo");
request.setAttribute("param2", "bar");
return "forward:/test2";
}
}
@Controller
public class TestController2 {
@RequestMapping(value="/test2")
public String showTestPage(HttpServletRequest request) {
String param1 = (String) request.getAttribute("param1");
String param2 = (String) request.getAttribute("param2");
return "testPageView";
}
}
Dado que el nombre de vista en el prefijo de reenvío es básicamente una URL , también puede tener las siguientes versiones (atributo cambiado a parámetro) ( B ):
@Controller
public class TestController {
@RequestMapping(value="/test")
public String showTestPage() {
return "forward:/test2?param1=foo¶m2=bar";
}
}
@Controller
public class TestController2 {
@RequestMapping(value="/test2")
public String showTestPage(HttpServletRequest request) {
String param1 = request.getParameter("param1");
String param2 = request.getParameter("param2");
return "testPageView";
}
}
También puede simplificar aún más el segundo controlador utilizando anotaciones en su lugar:
@Controller
public class TestController2 {
@RequestMapping(value="/test2")
public String showTestPage(@RequestParam String param1, @RequestParam String param2) {
return "testPageView";
}
}
Y solo por el gusto de hacerlo, y para mostrar el comportamiento vinculante de Spring en acción, podrías hacerlo incluso así ( C ):
@Controller
public class TestController {
@RequestMapping(value="/test")
public String showTestPage() {
return "forward:/test2?param1=foo¶m2=bar";
}
}
@Controller
public class TestController2 {
@RequestMapping(value="/test2")
public String showTestPage(@ModelAttribute DummyBinder params) {
String param1 = params.getParam1();
String param2 = params.getParam2();
return "testPageView";
}
}
class DummyBinder {
private String param1;
private String param2;
public String getParam1() {
return param1;
}
public void setParam1(String param1) {
this.param1 = param1;
}
public String getParam2() {
return param2;
}
public void setParam2(String param2) {
this.param2 = param2;
}
}
Yo personalmente iría con la solución A para muchos parámetros y la solución B para algunos. La solución C tiene una especie de "¿eh ...?" efecto, así que lo evitaría (también funciona con los parámetros agregados a la URL, por lo que algunos de ellos o usted obtiene una URL desordenada).
Agregar los datos en la sesión también funcionaría fuera del curso, pero extendería la vida útil de los datos innecesariamente, por lo que el mejor lugar es agregarlo a la solicitud durante la transición al segundo controlador.
Encontré esta publicación , que usa un HttpRequestWrapper
:
Primero:
Defina HttpRequestWrapper
y anule los métodos getParameter
, getParameterMap
, getParameterNames
y getParameterValues
como en la publicación.
Segundo:
Reenviar a través de RequestDispatcher a su url, utilizando la solicitud envuelta en los parámetros del método:
request.getRequestDispatcher("myForwardUrl").forward(new MyRequestWrapper(request), response);
Lo probé para eliminar parámetros (¡lo cual es aún más difícil!) ¡Y funciona!