springboot项目中报错:Path with "WEB-INF" or "META-INF": [WEB-INF/jsp/error.jsp]
时间: 2024-04-15 15:03:16 浏览: 253
这个错误通常是因为在Spring Boot项目中使用了传统的Servlet容器部署方式,而不是使用Spring Boot的内置Tomcat容器导致的。在传统的Servlet容器中,JSP页面需要放在WEB-INF目录下,但是在Spring Boot中,JSP页面不应该放在WEB-INF目录下。
解决方案是将JSP页面放到resources/static或resources/public目录下,或者使用Thymeleaf等模板引擎来替代JSP。如果你一定要使用JSP,可以将项目打成war包并部署到传统的Servlet容器中。
相关问题
假设用户登录页面login.jsp在web工程web2022的hw目录下,即访问login.jsp的URL地址是http://localhost:8080/web2023/hw/login.jsp,将login.jsp提交的用户名和密码由FirstServlet(映射地址为/servlet/firstServlet.do)获取进行判断,如果登录成功,则跳转至SecondServlet(映射地址为/servlet/secondServlet.do)显示用户名信息,如果登录不成功,则跳转至登录失败页面hw/failed.jsp。 要求:用户名和密码存在WEB-INF/userinfo.txt文件中,若页面出现404错误则统一跳转至404.html页面,500错误则统一跳转至500.html页面,并提示出错信息。
首先需要在web2023工程下创建以下目录结构:
```
web2023
├── WEB-INF
│ ├── classes
│ ├── lib
│ └── userinfo.txt
├── hw
│ ├── login.jsp
│ └── failed.jsp
├── servlet
│ ├── FirstServlet.java
│ └── SecondServlet.java
├── 404.html
└── 500.html
```
其中,userinfo.txt文件用于存储用户名和密码,格式为:
```
username1=password1
username2=password2
```
FirstServlet的实现如下:
```java
package servlet;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
// 读取userinfo.txt文件
String path = getServletContext().getRealPath("/WEB-INF/userinfo.txt");
File file = new File(path);
BufferedReader reader = new BufferedReader(new FileReader(file));
// 验证用户名和密码是否正确
String line;
boolean found = false;
while ((line = reader.readLine()) != null) {
String[] parts = line.split("=");
if (parts.length == 2 && parts[0].equals(username) && parts[1].equals(password)) {
found = true;
break;
}
}
reader.close();
// 根据验证结果跳转页面
if (found) {
HttpSession session = request.getSession();
session.setAttribute("username", username);
response.sendRedirect(request.getContextPath() + "/servlet/secondServlet.do");
} else {
response.sendRedirect(request.getContextPath() + "/hw/failed.jsp");
}
}
}
```
SecondServlet的实现如下:
```java
package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class SecondServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取用户名
HttpSession session = request.getSession();
String username = (String) session.getAttribute("username");
// 显示用户名信息
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("<h1>欢迎您," + username + "!</h1>");
}
}
```
login.jsp的实现如下:
```html
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/servlet/firstServlet.do" method="post">
<label>用户名:</label>
<input type="text" name="username" /><br />
<label>密码:</label>
<input type="password" name="password" /><br />
<input type="submit" value="登录" />
</form>
</body>
</html>
```
failed.jsp的实现如下:
```html
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录失败</title>
</head>
<body>
<h1>登录失败,请检查用户名和密码是否正确!</h1>
</body>
</html>
```
web.xml的实现如下:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
id="WebApp_ID" version="4.0">
<display-name>web2023</display-name>
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.html</location>
</error-page>
<servlet>
<servlet-name>firstServlet</servlet-name>
<servlet-class>servlet.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>firstServlet</servlet-name>
<url-pattern>/servlet/firstServlet.do</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>secondServlet</servlet-name>
<servlet-class>servlet.SecondServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>secondServlet</servlet-name>
<url-pattern>/servlet/secondServlet.do</url-pattern>
</servlet-mapping>
</web-app>
```
在以上实现中,使用了ServletContext的getRealPath方法获取userinfo.txt文件的绝对路径;使用HttpSession对象在FirstServlet和SecondServlet之间传递数据;使用EL表达式获取web应用的上下文路径;使用了web.xml的error-page配置实现404和500错误页面的统一处理。
请基于JSP + Servlet + JavaBean + JDBC+MYsql8.0.2 使用Myeclipse软件,制作一个商品查询项目,根据可以用户输入的商品号从数据库中查询该商品信息和查询所有商品信息 遵循MVC设计模式,其中视图有queryProduct.jsp、displayProduct.jsp、displayAllProduct.jsp和error.jsp几个页面,Product类实现模型,QueryProductServlet类实现控制器。数据库表为products。请具体代码和步骤
好的,请按照以下步骤进行操作:
Step1:创建项目
1. 打开MyEclipse,选择File -> New -> Project
2. 在新建项目对话框中,选择Web -> Dynamic Web Project,输入项目名称(例如ProductQuery),选择Target Runtime为Apache Tomcat 9.0,点击Next
3. 在下一个页面中,选择Generate web.xml deployment descriptor并点击Finish
Step2:创建数据库
1. 打开MySQL Workbench,连接到MySQL服务器
2. 在左侧的Navigator中,选择SCHEMAS,右键选择Create Schema,输入Schema名称(例如product_db),点击Apply
3. 在新建Schema下,右键选择Create Table,输入Table名称(例如products),添加相关字段(例如id、name、price等),点击Apply
Step3:编写JavaBean
1. 在MyEclipse中,右键项目,选择New -> Class,输入类名称(例如Product)
2. 在类中添加对应的属性和getter/setter方法
示例代码如下:
```java
public class Product {
private int id;
private String name;
private double price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
```
Step4:编写控制器
1. 在MyEclipse中,右键项目,选择New -> Servlet,输入Servlet名称(例如QueryProductServlet)
2. 在doGet方法中,获取用户输入的商品编号,根据编号查询数据库,将查询结果存入JavaBean中,将JavaBean存入request中,转发到对应的JSP页面
3. 在doPost方法中,调用doGet方法
示例代码如下:
```java
@WebServlet("/queryProduct")
public class QueryProductServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取商品编号
int id = Integer.parseInt(request.getParameter("id"));
// 查询商品信息
Product product = getProductById(id);
if (product != null) {
// 存入request中
request.setAttribute("product", product);
// 转发到displayProduct.jsp页面
request.getRequestDispatcher("/displayProduct.jsp").forward(request, response);
} else {
// 转发到error.jsp页面
request.getRequestDispatcher("/error.jsp").forward(request, response);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
// 根据商品编号查询商品信息
private Product getProductById(int id) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
Product product = null;
try {
// 获取数据库连接
conn = DBUtil.getConnection();
// 定义SQL语句
String sql = "SELECT * FROM products WHERE id=?";
// 创建PreparedStatement对象
stmt = conn.prepareStatement(sql);
// 设置参数
stmt.setInt(1, id);
// 执行查询操作
rs = stmt.executeQuery();
// 处理查询结果
if (rs.next()) {
product = new Product();
product.setId(rs.getInt("id"));
product.setName(rs.getString("name"));
product.setPrice(rs.getDouble("price"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭数据库资源
DBUtil.close(rs, stmt, conn);
}
return product;
}
}
```
Step5:编写JSP页面
1. 在项目中,创建queryProduct.jsp、displayProduct.jsp、displayAllProduct.jsp和error.jsp四个页面
2. 在queryProduct.jsp页面中,添加一个表单,用户可以输入商品编号,点击查询按钮提交表单
示例代码如下:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>商品查询</title>
</head>
<body>
<h1>商品查询</h1>
<form action="${pageContext.request.contextPath}/queryProduct" method="get">
商品编号:<input type="text" name="id"><br>
<input type="submit" value="查询">
</form>
</body>
</html>
```
3. 在displayProduct.jsp页面中,根据JavaBean中的属性显示商品信息
示例代码如下:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>商品信息</title>
</head>
<body>
<h1>商品信息</h1>
<table border="1">
<tr>
<th>编号</th>
<th>名称</th>
<th>价格</th>
</tr>
<tr>
<td>${product.id}</td>
<td>${product.name}</td>
<td>${product.price}</td>
</tr>
</table>
</body>
</html>
```
4. 在displayAllProduct.jsp页面中,查询所有商品信息并显示在表格中
示例代码如下:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>所有商品信息</title>
</head>
<body>
<h1>所有商品信息</h1>
<table border="1">
<tr>
<th>编号</th>
<th>名称</th>
<th>价格</th>
</tr>
<c:forEach var="product" items="${products}">
<tr>
<td>${product.id}</td>
<td>${product.name}</td>
<td>${product.price}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
```
5. 在error.jsp页面中,显示错误信息
示例代码如下:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>错误提示</title>
</head>
<body>
<h1>错误提示</h1>
<p>查询商品信息失败!</p>
</body>
</html>
```
Step6:配置web.xml
1. 在项目的WebContent/WEB-INF目录下,创建web.xml文件
2. 在web.xml中添加Servlet和JSP的映射关系
示例代码如下:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
<servlet>
<servlet-name>QueryProductServlet</servlet-name>
<servlet-class>com.example.QueryProductServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>QueryProductServlet</servlet-name>
<url-pattern>/queryProduct</url-pattern>
</servlet-mapping>
</web-app>
```
Step7:运行项目
1. 在MyEclipse中,右键项目,选择Run As -> Run on Server
2. 在浏览器中输入http://localhost:8080/ProductQuery/queryProduct.jsp,即可访问商品查询页面
以上就是基于JSP + Servlet + JavaBean + JDBC+MySQL8.0.2使用MyEclipse软件制作商品查询项目的全部步骤和代码,希望对你有所帮助!
阅读全文