在我的网络应用程序中,我收到了客户的请求。我在我的jsp页面或servlet(曾经被调用过)中处理请求,并且希望相应地转发到其他jsp或servlet。
在转发之前我想设置一些参数然后转发它有了这些新参数。转发时不应出现旧参数。只应存在新参数。怎么办呢?
我可以从servlet转发到jsp,反之亦然吗?
请告诉我们如何完成上述工作?
答案 0 :(得分:3)
是的,您可以将参数servlet转发给jsp,将jsp转发给servlet。
当您可以在请求中设置属性时,它将在destination.means上丢失,您无法在第三个资源上访问该属性。
request.setAttribute(attribute name,attribute value)
你也可以在会议中做同样的事情。
答案 1 :(得分:3)
您可以根据需要和要求使用请求调度程序和重定向。
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher("url");
rd.forward(request,response);
或
response.sendRedirect("url");
sendRedirect()将标头发送回浏览器,其中包含要重定向到的资源的名称。因此,这将是来自浏览器的资源的新请求。
forward()动作在服务器内发生,不知道浏览器。
答案 2 :(得分:2)
如果您没有使用请求参数并且您的jsp / servlet没有向响应写入任何内容,那么我认为使用重定向而不是转发是正常的,因为重定向将丢弃请求以及参数。
当您进行重定向时,您可以动态创建并设置查询字符串,如下所示:
response.sendRedirect("url?a=" + var1 +"&b=" + var2);
请注意,这将是网址的GET方法。如果将url解析为servlet,则可以实现doGet方法来调用doPost。
请注意,如果jsp / servlet已经在响应中写入内容,则会忽略重定向...
答案 3 :(得分:0)
使用
ServletRequest.removeAttribute(name of your old attribute)
ServletRequest.setAttribute(name , value)
设置属性后,使用
获取 RequestDispatchergetRequestDispatcher(url)
然后使用 forward()方法
答案 4 :(得分:0)
您必须使用RequestDisptcher转发到JSP / Servlet。在请求上设置请求属性以使用
设置参数request.setAttribute(name, value)
Forwarded JSP可以使用
读取参数request.getAttribute(name)
但是,你cannot hide the attribute existing before forward by default
。您可以使用Request Wrapper实现此目的。在转发覆盖set和get属性方法之前包装请求。
以下代码说明
RequestDisptcher dispatcher = req.getRequestDispatcher("url");
HideExistingRequestWrapper requestWrapper =
new HideExistingRequestWrapper(request);
requestWrapper.setAtribute("forwarded", "forwarded value");
dispatcher.forward(requestWrapper, response);
以下是包装器实现的代码:
class HideExistingRequestWrapper extends HttpServletRequestWrapper {
private Map localattributes = new HashMap();
public HideExistingRequestWrapper (HttpServletRequest orignialRequest) {
super(orignialRequest);
}
public Object getAttribute(java.lang.String name) {
return localattributes.get(name);
}
public Object setAttribute(java.lang.String name, java.lang.String value) {
return localattributes.put(name, value);
}
}