【问题标题】:Forward request from servlet to jsp将请求从 servlet 转发到 jsp
【发布时间】:2014-02-25 10:49:28
【问题描述】:

我有一个小型应用程序(HTML 表单、作为控制器的 servlet 和 jsp 文件),我试图弄清楚为什么我不能将请求从 servlet 转发到 jsp 文件。

问题是从 html 提交后,显示“HTTP Status 404”

申请流程:

  1. 从 html 提交。
  2. 控制器从 html 中获取名称。
  3. 控制器应该将请求移动到 jsp 文件。

谢谢!

项目层次结构: http://s23.postimg.org/kgt7r7lwb/Capture.jpg

main.html:

<html>
<title>Coupons categories</title>
<body>
  <h1 align="center">Coupons categories</h1>
  <form method="GET" action="Controller">
    Select category 
    Type:
    <select name="type" size=1>
      <option value="restaurants">Restaurants</option>
      <option value="electrics">Electrics</option>
      <option value="hotels">Hotels</option>
    </select>
    <br><br>
      <input type="Submit">
   </form>
</body>
<html>

controller.java:

   @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //PrintWriter out = response.getWriter();
        //out.write(request.getPathInfo());

        String path = request.getParameter("type");
        if(path.equals("electrics"))
        {
            request.setAttribute("timestamp", new Date());
            RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/view/electrics.jsp");
            dispatcher.forward(request, response);
        }
        else if(path.equals("hotels"))
        {
            request.setAttribute("timestamp", new Date());
            RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/view/hotels.jsp");
            dispatcher.forward(request, response);          
        }
        else if(path.equals("restaurants"))
        {
            request.setAttribute("timestamp", new Date());
            RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/view/restaurants.jsp");
            dispatcher.forward(request, response);          
        }
    }

electrics.jsp:

<%@ page language="java" contentType="text/html; charset=windows-1255"
    pageEncoding="windows-1255"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1255">
<title>Insert title here</title>
</head>
<body>
    <h2>products list...</h2>
    <%
    Object ob = request.getAttribute("timestamp");
    out.println(ob);
    %>
</body>
</html>

web.xml:

    <description>
      CouponsServer
    </description>
    <display-name>Controller for CouponsServer</display-name>

    <servlet>
      <servlet-name>Controller</servlet-name>
      <servlet-class>uses.server.Controller</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Controller</servlet-name>
        <url-pattern>/Controller</url-pattern>
    </servlet-mapping>


</web-app>

更新: 可能问题出在controller.java 中。 当我尝试以下代码时,我得到了 HTTP 状态 500。 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        PrintWriter out = response.getWriter();
        out.write(request.getPathInfo());
    }

【问题讨论】:

  • 如果 getRequestDispatcher 上的路径参数是绝对的,它仍然相对于 servlet 上下文(部署应用程序名称)。 '/view' 目录是应用程序的第一层目录吗?您还可以将相对路径与 getRequestDispatcher 一起使用,该路径相对于 Servlets 当前路径。
  • @user1257931 /查看 WebContet 中的文件夹。你可以看到层次结构:s23.postimg.org/kgt7r7lwb/Capture.jpg
  • main.htmlview 移动到WebContent 时是否出现问题?
  • @Pshemo 是的,仍然出现。
  • @user1257931 请在上面的问题中查看我的编辑。

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


【解决方案1】:

web.xml

<servlet>
    <servlet-name>Controller</servlet-name>
    <servlet-class>uses.server.Controller</servlet-class>
</servlet>

<servlet-mapping>
     <servlet-name>Controller</servlet-name>
     <url-pattern>/Controller</url-pattern>
</servlet-mapping>

<welcome-file-list>
     <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

【讨论】:

    【解决方案2】:

    您的代码在我的本地运行良好,web.xml 在最后定义了欢迎列表,甚至没有它。尝试使用自动生成 web.xml 的动态 Web 内容版本 2.5 运行您的代码。

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
     <description>
          CouponsServer
        </description>
      <display-name>Controller for CouponsServer</display-name>
    
    
      <servlet>
    
        <display-name>Controller</display-name>
        <servlet-name>Controller</servlet-name>
        <servlet-class>uses.server.Controller</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>Controller</servlet-name>
        <url-pattern>/Controller</url-pattern>
      </servlet-mapping>
    </web-app>
    

    【讨论】:

      【解决方案3】:

      试试这个

       request.getRequestDispatcher("/view/electrics.jsp").forward(req,res);
      

      【讨论】:

      • 它不工作。你有别的想法吗? @Ayushman Ashish
      • 你检查过控制器上的路径值是多少???
      • main.html 中的操作怎么样?看起来您的控制器映射是“/Controller”,但您的 main.html 位于 /view 下,而您的 action="Controller"。那不应该是 action="../Controller" 吗?
      • 你确定吗?我相信 url-pattern /Controller 只会匹配 scheme://host/webapp/Controller。看来您的 html 正在尝试访问 scheme://host/webapp/view/Controller
      • 没有你的控制器工作正常......我只是复制粘贴你的代码和它的工作,
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 2013-04-28
      • 2022-01-10
      • 2011-06-20
      • 2011-06-25
      相关资源
      最近更新 更多