gpt4 book ai didi

java - 无法正确配置 Intellij Web App 部署

转载 作者:太空宇宙 更新时间:2023-11-04 09:41:09 25 4
gpt4 key购买 nike

我正在使用 JSP 和 Servlet、TomCat 9 和 IntelliJ 创建一个 Java Web 应用程序。我正在学习的教程使用 Eclipse,讲师只需以“运行方式”>“在服务器上运行”的方式运行项目,一切就可以无缝运行。

在 IntelliJ 中,事情似乎一团糟。

这是我的项目结构 -

enter image description here

这是运行配置 -

enter image description here

enter image description here

我将 web.xml 设置为 -

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Archetype Created Web Application</display-name>

<welcome-file-list>
<welcome-file>login.do</welcome-file>
</welcome-file-list>

</web-app>

因此,任何对 localhost:8080 的请求,或者在 IntelliJ 的情况下,http://localhost:8080/jspservlet_war_exploded/ 都应该重定向到 login.do,由 LoginServlet 处理 -

package app;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(urlPatterns = "/login.do")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String name = req.getParameter("name");
String pass = req.getParameter("password");
req.setAttribute("name", name);
req.setAttribute("password", pass);

RequestDispatcher requestDispatcher = req.getRequestDispatcher("views/login.jsp");
requestDispatcher.forward(req, resp);


}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
req.setAttribute("name", name);
RequestDispatcher requestDispatcher = req.getRequestDispatcher("views/welcome.jsp");
requestDispatcher.forward(req, resp);
}
}

首先,我在 LoginServlet 中测试 doGet() 方法,只需在起始页 - http://localhost:8080/jspservlet_war_exploded/ 中手动添加 ?name=xxx&password=xxx 查询字符串。这些属性在 request 中设置,然后转发到 login.jsp,后者仅使用 ${name}${password} 显示属性值。在这一步之前一切都运行良好。

然后,我更改了 login.jsp 页面,以包含一个简单的 form,该表单具有一个用于输入用户名的输入字段,并通过 action 属性将其发送到 /login.do使用 POST 方法。这就是事情爆发的地方。

这里是login.jsp -

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Login Page</title>
</head>
<body>
<h1>Welcome</h1>
<p>Time on server is <%= new Date()%></p>
<%--<p>Your name is ${name} and password is ${password}</p>--%>
<p>pageContext.request.contextPath: ${pageContext.request.contextPath}</p>

<form action="/login.do" method="post">
<label for="inp">Enter your name </label>
<input id="inp" type="text" name="name"/>
<button>Submit</button>
</form>
</body>
</html>

结果是这个页面 -

enter image description here

现在,一旦我点击“提交”,请求似乎就会转到 localhost:8080/login.do (因为这就是 action 属性的值),并且会引发错误 -

enter image description here

根据我在这里读到的其他问题,看起来发生这种情况是因为上下文路径(即应用程序的根)是http://localhost:8080/jspservlet_war_exploded/,并且所有位置都相对于该路径(?)。因此,推荐的方式似乎是 ${pageContext.request.contextPath}

基于此,如果我将 action 属性更改为 action="${pageContext.request.contextPath}/login.do",那么事情就会再次起作用。

但是,现在我尝试从 LoginServlet 中的 doPost() 方法重定向到 TodoServlet,如下所示 -

resp.sendRedirect("/todo.do");

这再次导致 404,因为 URL 变为 http://localhost:8080/todo.do,而它应该是 http://localhost:8080/jspservlet_war_exploded/todo.do

如何解决问题,以便默认情况下所有资源都相对于 http://localhost:8080/jspservlet_war_exploded/ 进行部署,并且我可以直接在 actionresp.sendRedirect() 中指定 URL 模式?

最佳答案

更改运行/调试配置中的部署上下文:

Context

如果您希望应用程序能够在任何上下文中工作,您应该使用相对路径,例如 described here .

不要使用 resp.sendRedirect("/todo.do");,而是使用 resp.sendRedirect("todo.do");resp.sendRedirect(req.getContextPath() + "/todo.do");

关于java - 无法正确配置 Intellij Web App 部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55980387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com