【问题标题】:How to redirect the response of a servlet into the same jsp page from where we got the request如何将 servlet 的响应重定向到我们收到请求的同一 jsp 页面
【发布时间】:2013-09-20 19:37:49
【问题描述】:

如何将 servlet 的响应重定向到我从其中获取请求的同一 jsp 页面。假设我的 jsp 页面上有一个名为 status 的选项卡 http://localhost:8080/Example/status.jsp。现在,当我发送请求并收到响应时,它应该在同一页面上显示响应,即。它应该在
http://localhost:8080/Example/status.jsp 上显示响应。但它向我显示了
http://localhost:8080/Example/Statuswhere 中的响应,其中 Status 是 web.xml 文件中的 url 模式。请任何帮助表示赞赏。下面是我的代码。 如何在 status.jsp 中获得响应。

protected void doPost(HttpServletRequest req, HttpServletResponse res) throws 
IOException {

             try{

                 String showstatus =req.getParameter("showstatus");
                 PrintWriter out = res.getWriter();   
                 Runtime rt = Runtime.getRuntime();
                 Process pr = rt.exec("C:\\tools\\server\\util stat -a" );
                 BufferedReader stdInput = new BufferedReader(new   
InputStreamReader(pr.getInputStream()));

                BufferedReader input = new BufferedReader(stdInput);
                String stat = "";
                    while((stat = input.readLine()) != null){
                        out.println(stat);
                    }
             }
                catch (Throwable t)  
                  {  
                    t.printStackTrace();  
                  }  


                finally {  

                }  }

JSP 代码:

<div id= "status" style="display:none;">
            <FORM action="status" METHOD="POST">
                <input type=submit name=showstatus 
id=txtSubmit value=Status />

            </FORM>
        </div>

WEB.XML:

<servlet>       
    <servlet-name>Status</servlet-name>
    <servlet-class>com.emc.clp.license.Status</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Status</servlet-name>
    <url-pattern>/status</url-pattern>
</servlet-mapping>

【问题讨论】:

  • 您希望 status.jsp 处理表单发布吗?如果是这样,您需要将表单操作更改为/Example/status.jsp。就像现在一样,请求将由 servlet 处理,因为您的表单操作只是 status
  • @Tap:感谢您的快速回复。我没有 status.jsp。我需要创建一个吗?
  • 你没有status.jsp?!在您的问题中:“假设我的 jsp 页面上有一个名为 status 的标签 localhost:8080/Example/status.jsp
  • 哎呀对不起,这是我的错。我确实有 status.jsp。我按照上面的方法更改了表单操作,它将 url 显示为 http:....Example/status.jsp 但页面是空白的。里面没有回应
  • 请帮我解决这个问题。

标签: java spring jsp servlets model-view-controller


【解决方案1】:

在您的 servlet 中,与其将 util 的输出直接打印到响应中,不如将其保存在内存中并将其传递给 jsp:

String stat;
StringBuffer utilOutput = new StringBuffer();
while((stat = input.readLine()) != null){
    utilOutput.append(stat + "\n");
}
req.setAttribute("utilOutput", utilOutput.toString());
req.getRequestDispatcher("/Example/status.jsp").forward(req, res);

在你的 jsp 中,我假设你有一个 div 或者你想看到输出的东西:

<div id= "status" style="display:none;">
    <form action="/status" method="POST">
        <input type="submit" name="showstatus" id="txtSubmit" value="Status" />
    </form>
</div>
<div id="result">
    <pre>
        ${requestScope.utilOutput}
    </pre>
</div>

请注意,我在表单操作中添加了一个正斜杠。如果您的用户从/Example/status.jsp 提交表单,那么相对路径将使帖子转到/Example/status,但您的servlet 只处理对/status 的请求。

您的请求对象req 具有属性映射,您可以使用请求的 setAttribute() 方法将任何相关对象放入其中。请求调度程序将您的请求和响应对象转发到另一个资源(您的 jsp)进行处理。 jsp 可以通过名称访问这些值,使用上面的 EL 表示法。

如果以这种方式加载,您的内联样式中的display:none 将始终阻止在页面上看到该表单。我认为最明显的显示方式是在客户端使用 javascript。单击选项卡时,您需要更改显示值。你没有提到你的标签元素是什么,但假设它们是 div。您可以编写一个 javascript 函数来加载表单,或者您甚至可以全部内联:

<div id="mytab" onclick="document.getElementById('status').style.display = 'block';">Load the form</div>

【讨论】:

  • :非常感谢 Tap。有效。你拯救了我的一天。你能解释一下这是如何工作的吗?我真的很感激。但仍然有一个问题。如果正在使用
  • :再次感谢。上述建议使用
    加载表单
    确实有效。但它仍然有一个问题。假设我的网页上有以下选项卡 - 开始/停止、版本、视图日志、状态。当我单击单个选项卡时,它正在显示结果,但问题是假设如果我单击选项卡状态,它正在显示状态按钮,当我单击该按钮时,它会在网页上显示状态结果,但同时它也显示其余选项卡的按钮不应该发生。
  • 我的意思是,如果当我单击特定选项卡时,它应该只显示该选项卡的结果,而不应该显示正在发生的其他选项卡的任何信息。
  • 这变成了一个非常不同的问题。有图书馆可以帮助解决这个问题 - 查看jquery ui tabs。这对你的项目来说可能是多余的,但基本的想法是有一个功能来显示单击的选项卡的内容并隐藏所有其他选项卡的内容。 many ways 上有很多很好的信息可以解决这个问题。
猜你喜欢
相关资源
最近更新 更多
热门标签