Benmao⁢ 2024-06-15 11:08 采纳率: 100%
浏览 6
已结题

javaee项目中出现的问题

这是一个servlet代码,其功能只是一个查询本地数据库中的信息。

问题:在我测试其功能中,当我输入数据库中存在的数据,可以正确查询;当我故意查找不存在的数据,弹出"用户不存在后",我再次查找存在的数据,然后没有反应了,一直转圈圈

会不会是servlet重定向导致了阻塞还是因为什么

package com.exam.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;

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 org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.exam.bean.User;
import com.exam.dao.UserDao;
import com.exam.dao.impl.UserDaoImpl;
import com.exam.service.UserService;

@WebServlet(urlPatterns = "/searchUser")
public class searchUserServlet extends HttpServlet {
    private ApplicationContext applicationContext;
    @Override  
    public void init() throws ServletException {  
        try {  
            applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");  
        } catch (Exception e) {  
            e.printStackTrace();  
            throw new ServletException("无法加载ApplicationContext", e);  
        }  
    }  
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //不写这句就会乱码
        request.setCharacterEncoding("utf-8");
        UserService userService = (UserService) applicationContext.getBean("userService");  
        // 获取表单数据
        String userName = request.getParameter("userId");
        
        // 在这里可以将用户信息存储到数据库或进行其他操作
        //增加到数据库
        UserDao user = new UserDaoImpl();
        System.out.println(userName);
        System.out.println(request.getCharacterEncoding());
        try {
            if(user.selectUserByName(userName)!=null) {
                System.out.println("查询成功");
                
                
                request.setAttribute("user", user.selectUserByName(userName));  
                request.getRequestDispatcher("searchshow.jsp").forward(request, response);  
            }else {
                System.out.println("用户不存在");
                
                // 设置响应的字符集和内容类型  
                response.setContentType("text/html;charset=UTF-8");  
                response.setCharacterEncoding("UTF-8");
                // 弹出JavaScript的alert提示框
                String alertMessage = "用户不存在!";
                PrintWriter out = response.getWriter();
                out.println("<script type=\"text/javascript\">");
                out.println("alert('" + alertMessage + "');");
                out.println("window.location='searchUserForm.jsp';"); // 重定向到成功页面
                out.println("</script>");
            }
            
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        // 进行重定向或其他操作
        //response.sendRedirect("index.jsp");
    }
}
<body>
    <h1>查询用户</h1>
    <form action="searchUser" method="post" accept-charset="UTF-8">
        <label for="userName">名字:</label>
        <input type="text" id="userId" name="userId" required>
        
        <input type="submit" value="查询">
    </form>
    <p style="text-align: center; margin-top: 20px;">  
        <a href="index.jsp">返回主界面</a>  
    </p>  
</body>

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-15 11:08
    关注

    引自免费微信小程序:皆我百晓生

    从描述来看,问题可能出现在Servlet处理请求的生命周期或者资源管理上。当Servlet在处理一个请求时,如果在某个点上卡住,后续的请求可能会被阻塞,直到当前请求完成。这通常发生在数据库连接未正确关闭、线程池耗尽或者资源锁定的情况下。

    在你提供的代码中,doGet方法中调用了userService.selectAllUsers(),如果这个方法内部有长时间运行的操作(比如等待数据库响应),并且没有正确地释放资源,那么就可能导致后续请求被阻塞。

    解决思路:

    1. 检查数据库连接管理

      • 确保数据库连接是在每次查询结束后都正确关闭的。如果userService.selectAllUsers()方法中使用了数据库连接,并且没有正确关闭,那么尝试在UserService中加入连接池(如HikariCP、C3P0等)的使用,确保每次操作后连接能被归还到连接池中。
    2. 异常处理与资源释放

      • try-catch块中,确保所有打开的资源(如数据库连接、事务等)都在finally块中被关闭或释放。
    3. 线程池监控

      • 如果应用服务器使用了线程池来处理请求,检查线程池的配置,确保线程数足够处理并发请求,同时避免过多线程导致的系统资源耗尽。
    4. 日志记录

      • 添加详细的日志记录,特别是在UserServiceselectAllUsers方法中,可以帮助追踪问题发生的具体位置。

    示例代码修改

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        UserService userService = (UserService) applicationContext.getBean("userService");
        try {
            List<User> userList = userService.selectAllUsers();
            req.setAttribute("userList", userList);
            req.getRequestDispatcher("show.jsp").forward(req, resp);
            
            // 测试打印
            for (User user : userList) {
                System.out.println("Name: " + user.getUserName());
                System.out.println("Age: " + user.getAge());
                System.out.println("Address: " + user.getAddress());
                System.out.println("--------------------");
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
            req.setAttribute("errorMessage", "数据库查询出错");
            req.getRequestDispatcher("error.jsp").forward(req, resp);
        } finally {
            // 假设在UserService中有需要关闭的资源,例如:
            // userService.closeResources();
        }
    }
    

    对于UserService中的资源管理,你需要检查具体实现,确保任何打开的资源(如PreparedStatement, Connection, ResultSet等)在方法结束时都被适当地关闭。这通常通过在finally块中调用close()方法实现,或者使用Java 7引入的try-with-resources语句简化资源管理。

    如果问题仍然存在,进一步的调试可能需要查看应用服务器的日志、线程堆栈以及数据库性能监控,以确定瓶颈所在。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月24日
  • 已采纳回答 6月16日
  • 修改了问题 6月15日
  • 创建了问题 6月15日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境