JSP 开发之THE SERVLET NAME ALREADY EXISTS.解决方法

本文介绍了解决Servlet名称已存在这一常见问题的方法。当部署Web应用时遇到Servlet名称冲突的情况,可以参考文中提供的步骤来有效解决。

The servlet name already exists.解决方法

原文链接:http://www.cnblogs.com/ncl-960301-success/p/7469079.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> <h2>用户注册</h2> <form action="RegisterServlet" method="post"> <label for="username">用户名:</label> <input type="text" id="username" name="username" required><br><br> <label for="password">密码:</label> <input type="password" id="password" name="password" required><br><br> <label for="email">邮箱:</label> <input type="email" id="email" name="email" required><br><br> <input type="submit" value="注册"> </form> </body> </html>package cake_shop; import java.io.IOException; import java.security.MessageDigest; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/RegisterServlet") public class RegisterServlet 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"); String email = request.getParameter("email"); // 对密码进行加密 String encryptedPassword = encryptPassword(password); String jdbcURL = "jdbc:mysql://localhost:3306/cake_store"; String dbUser = "root"; String dbPassword = "123456"; try { Class.forName("com.mysql.cj.jdbc.Driver"); try (Connection conn = DriverManager.getConnection(jdbcURL, dbUser, dbPassword); PreparedStatement pstmt = conn.prepareStatement("INSERT INTO users (username, password, email) VALUES (?, ?, ?)")) { pstmt.setString(1, username); pstmt.setString(2, encryptedPassword); pstmt.setString(3, email); int rows = pstmt.executeUpdate(); if (rows > 0) { response.sendRedirect("login.jsp"); } else { response.sendRedirect("register.jsp?error=注册失败"); } } } catch (Exception e) { e.printStackTrace(); response.sendRedirect("register.jsp?error=注册失败"); } } // 使用SHA-256加密密码 private String encryptPassword(String password) { try { MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] encodedHash = digest.digest(password.getBytes()); StringBuilder hexString = new StringBuilder(2 * encodedHash.length); for (int i = 0; i < encodedHash.length; i++) { String hex = Integer.toHexString(0xff & encodedHash[i]); if (hex.length() == 1) { hexString.append('0'); } hexString.append(hex); } return hexString.toString(); } catch (Exception e) { throw new RuntimeException(e); } } }为什么注册显示404
最新发布
05-26
### 使用 JSP + Servlet + JavaBean 实现简单书籍借阅系统 #### 项目结构概述 为了构建一个简单的书籍借阅系统,通常会采用三层架构模式:表示层(View)、业务逻辑层(Controller)以及数据访问层(Model)。这种分层设计有助于提高代码的可维护性和扩展性。 - **表示层 (JSP)** 负责展示页面给用户并收集用户的输入。 - **业务逻辑层 (Servlet)** 处理请求并将处理后的结果返回给前端显示。 - **数据访问层 (JavaBean)** 封装实体类和数据库交互操作[^1]。 #### 创建 Maven 工程 首先,在集成开发环境 IDEA 中创建一个新的 Maven Web Application Project。配置好项目的依赖库之后就可以开始编写具体的组件了。 #### 设计数据库表结构 对于本案例而言,至少需要两个表格来存储 `books` 和 `borrow_records` 的信息: ```sql CREATE TABLE books ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255), author VARCHAR(255), status ENUM('available', 'borrowed') DEFAULT 'available' ); CREATE TABLE borrow_records ( record_id INT AUTO_INCREMENT PRIMARY KEY, book_id INT NOT NULL, user_name VARCHAR(255), borrow_date DATE, due_date DATE, FOREIGN KEY (book_id) REFERENCES books(id) ); ``` #### 编写 JavaBeans 类 定义 Book.java 来映射书籍对象,并提供相应的 getter/setter 方法;另外还需要 BorrowRecord.java 表示一条借书记录。 ```java // src/main/java/com/example/entity/Book.java package com.example.entity; public class Book { private int id; private String title; private String author; private boolean available; // 是否可用 public Book() {} // Getters and Setters... } ``` ```java // src/main/java/com/example/entity/BorrowRecord.java package com.example.entity; import java.util.Date; public class BorrowRecord { private Integer recordId; private Integer bookId; private String userName; private Date borrowDate; private Date dueDate; public BorrowRecord() {} // Getters and Setters... } ``` #### 配置 DAO 接口及其实现 DAO 层负责与 MySQL 数据库之间的通信。这里可以利用 JDBC 或者 MyBatis 进行简化 SQL 查询语句的操作过程。 ```java // src/main/java/com/example/dao/IBookDao.java package com.example.dao; import com.example.entity.Book; import java.util.List; public interface IBookDao { List<Book> getAllBooks(); void addNewBook(Book newBook); void updateBookStatus(int bookId, Boolean isAvailable); } // src/main/java/com/example/dao/impl/BookDaoImpl.java package com.example.dao.impl; import com.example.dao.IBookDao; import com.example.entity.Book; import org.springframework.stereotype.Repository; @Repository public class BookDaoImpl implements IBookDao { @Override public List<Book> getAllBooks(){ // Implement query logic here using JDBC or ORM framework like MyBatis. } @Override public void addNewBook(Book newBook){ // Insert into database operation goes here. } @Override public void updateBookStatus(int bookId, Boolean isAvailable){ // Update the availability of a specific book in DB. } } ``` #### 构建 Service Layer Service 层作为 Controller 和 Model 之间的一个桥梁,它包含了应用程序的主要业务逻辑和服务方法。 ```java // src/main/java/com/example/service/BookService.java package com.example.service; import com.example.entity.Book; import java.util.List; public interface BookService { List<Book> fetchAllBooks(); void saveOrUpdateBook(Book book); void changeAvailabilityOfBook(Integer bookId, Boolean newState); } // src/main/java/com/example/service/impl/BookServiceImpl.java package com.example.service.impl; import com.example.dao.IBookDao; import com.example.entity.Book; import com.example.service.BookService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class BookServiceImpl implements BookService { @Autowired private IBookDao iBookDao; @Override public List<Book> fetchAllBooks(){ return this.iBookDao.getAllBooks(); } @Override public void saveOrUpdateBook(Book book){ if(book.getId()==null || !this.existsById(book.getId())){ this.iBookDao.addNewBook(book); }else{ // Handle updating existing records. } } @Override public void changeAvailabilityOfBook(Integer bookId, Boolean newState){ this.iBookDao.updateBookStatus(bookId,newState); } private boolean existsById(Integer id){ // Check whether an entity with given ID already exists within repository. return false; } } ``` #### 开发 Servlet 控制器 最后一步就是通过 Servlets 来接收 HTTP 请求并对这些请求作出响应。每个 servlet 可能对应着不同的 URL 映射路径,比如 `/list-books`, `/add-book` 等等。 ```java @WebServlet("/ListBooksServlet") public class ListBooksServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { try { BookService service = new BookServiceImpl(); // In real-world applications consider dependency injection instead direct instantiation. List<Book> allBooks = service.fetchAllBooks(); request.setAttribute("all_books", allBooks); // Pass data to view layer. RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/views/list_books.jsp"); dispatcher.forward(request,response); } catch(Exception e){ throw new RuntimeException(e.getMessage()); } } } ``` #### 建立视图模板文件 在 WEB-INF 文件夹下建立 views 子目录用于放置所有的 jsp 页面文件。例如 list_books.jsp 应该能够遍历传入的数据集合并将其渲染成 HTML 列表形式呈现出来。 ```jsp <!-- /src/main/webapp/WEB-INF/views/list_books.jsp --> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>List Books</title></head> <body> <h2>All Available Books:</h2> <ul> <c:forEach var="item" items="${all_books}"> <li>${item.title} by ${item.author}</li> </c:forEach> </ul> <a href="/index.html">Back Home</a> </body> </html> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值