Java Servlet:RequestDispatcher无法正常工作不会重定向路径

时间:2018-09-03 00:39:47

标签: java jsp tomcat servlets intellij-idea

我有一个start.jsp,一个UserInfo.java servlet和一个view.jspstart.jsp具有接受用户名输入的形式,然后将其发送到servlet,然后该servlet又将其发送到view.jsp。但是,当我按下表单上的“提交”按钮时,没有重定向发生。我怀疑这里的路径有问题,但无法找出问题所在。这是我的目录树:

AppName
  pages
    projects
      ProjectName
        start.jsp
        view.jsp
  src
    com
      web
        UserInfo.java
  WEB-INF
    classes
      com
        UserInfo.class
    web.xml

UserInfo.java

public class UserInfo extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        response.getWriter().println("GET");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        String userName = request.getParameter("username");

        RequestDispatcher view= request.getRequestDispatcher("/projects/ProjectName/view.jsp");
        view.forward(request, response);

    }

}

web.xml

<servlet-mapping>
    <servlet-name>UserInfo</servlet-name>
    <url-pattern>/User.do</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>UserInfo</servlet-name>
    <servlet-class>com.web.UserInfo</servlet-class>
</servlet>

start.jsp

<form method="POST" action="User.do">
    <div class="form-group">
        <label for="usr">username:</label><br/><br/>
        <input type="text" class="form-control"name="username"><br/><br/>

    </div>
</form>

<button type="button" class="btn btn-primary"  type="submit">
   Get info
</button>

view.jsp

<h3>Hello,
   <%
      out.println(request.getParameter("username"));
   %>
</h3>

3 个答案:

答案 0 :(得分:2)

关于发布的示例,有几点需要注意:


(1)按钮:

(a)这些按钮定义了一个可点击的按钮-主要用于JavaScript以激活脚本。以下两个是相似的;一个有身体,另一个没有。

<INPUT TYPE="BUTTON" VALUE="Get Info">

<BUTTON TYPE="BUTTON">
    Get Info
</BUTTON>

(b)要提交带有其输入内容的表单,如本例所示,请单击“提交”按钮。将该表单发送到FORM的ACTION属性指定的Servlet(服务器端程序)。以下两个相似;一个有身体,另一个没有。

<INPUT TYPE="SUBMIT" VALUE="Get Info">

<BUTTON TYPE="SUBMIT">
    Get Info
</BUTTON>


(2)表单:

所有要提交的输入(与表单相关)都将在该表单中定义-包括用户名文本输入提交按钮start.jsp的更正标记:

<form method="POST" action="User.do">
    <div>
        <label>username:</label><br/><br/>
        <input type="text" name="username"><br/><br/>
    </div>
    <button type="submit">
        Get info
    </button>
</form>


(3)Servlet:

UserInfo.java

public class UserInfo extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        response.getWriter().println("GET");
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        String userName = request.getParameter("username");
        getServletContext().log("# User name: " + userName);
        RequestDispatcher view = request.getRequestDispatcher("view.jsp");
        view.forward(request, response);
    }
}


(4)(为方便起见),我对目录树的结构略有不同:

servlet-1
    start.jsp
    view.jsp
src
    com
        web
            UserInfo.java
WEB-INF
    classes
        com
            web 
                UserInfo.class
     web.xml

start.jspweb.xmlview.jsp中没有其他更改。已使用以下URL调用了已部署的Web应用程序(在本例中为部署在Apache Tomcat Web服务器上):http://localhost:8080/servlet-1/start.jsp

这将在浏览器中显示start.jsp。输入文本“用户名”,然后单击“获取信息”按钮。结果将显示在view.jsp中(我想这是预期的结果)。

最后,如前所述,RequestDispatcher用于转发到另一个资源或 include 来自另一个资源的内容-它不是重定向。注意:可以从ServletContextServletRequest获取请求分派器。请注意获得调度程序的两种方法之间的区别。

答案 1 :(得分:1)

好吧,你不说会怎样。

PIL是否有效?即是否出现新页面?因为imgOut = Image.open('sample-out.jpg') new_img = imgOut.resize((640,384), Image.ANTIALIAS) new_img.save("small-out.jpg", "JPEG", optimize=True) 不是重定向。

重定向将明确的响应发送到浏览器,然后加载新页面,并且在浏览器中URL发生更改的情况下最明显。

但是forward不能这样做。而是,它仅更改当前发送的请求的输出页面。因此,您并没有真正详细地说明此处正在发生(或未发生)的情况。

但是,从表面上看,您的问题不会得到重定向,因为forward根本不会重定向。

答案 2 :(得分:1)

将按钮保留在表单内。

<form method="POST" action="User.do">
    <div>
        <label>username:</label><br/><br/>
        <input type="text" name="username"><br/><br/>
    </div>
    <button type="submit">
        Get info
    </button>
</form>