每日总结2023-05-23

今天对于javaweb进行了复习以及回忆,

在进行javaweb项目中

使用idea进行时,webServlet注解不能正常使用,经讨论,查找资料,发现是路径错误,应该是

/包名/注解名/

的格式,在使用中发生了以上错误并加以改正。

package servlet;
import bean.keBean;
import repository.KeRep;

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.util.List;

@WebServlet("/student")
public class KeSer extends HttpServlet {
    //调用StudentRepository中的增删改查方法
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //判断前端传来的标记,以此执行相对应的增删改查操作
        String method=req.getParameter("method");
        if (method==null){
            method="findAll";
        }
        switch (method){
            case "findAll"://查询所有数据
                List<keBean> list = KeRep.findAll();//调用StudentRepository中的findAll()方法
                req.setAttribute("list",list);//存入request中
                req.getRequestDispatcher("index.jsp").forward(req,resp);//转发到index.jsp中
            case "delete"://删除操作
                String idStr=req.getParameter("classname");
                KeRep.deleteByClass(idStr);//根据id删除
                break;
            case "findById":
                idStr=req.getParameter("id");
                req.setAttribute("student", KeRep.findByClass(idStr));
                req.getRequestDispatcher("update.jsp").forward(req,resp);
                break;
            case "add":
                req.getRequestDispatcher("add.jsp").forward(req,resp);
        }


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");//防止中文乱码
        String method=req.getParameter("method");
        switch (method){
            case "add"://添加操作
                //获取前端传来的数据
                String classname = req.getParameter("classname");
                String teacher = req.getParameter("teacher");
                String address = req.getParameter("address");
                String time = req.getParameter("time");
                KeRep.add(classname,teacher,address,time);//调用add方法
                break;
            case "update"://更新操作
                classname = req.getParameter("classname");
                teacher = req.getParameter("teacher");
                address = req.getParameter("address");
                time = req.getParameter("time");
                KeRep.update(classname,teacher,address,time);
                break;
        }
        resp.sendRedirect("/test1/student");//重定向到index.jsp页面
    }
}

 

同时发生了异常


javaweb报错Servlet.service() for servlet [servlet.KeSer] in context with path [/test1] threw exception
java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed
at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:483)

 

这个错误提示意味着在调用response.sendRedirect()方法之前,已经有内容被输出到了response中,这导致了响应数据被提交,已经无法重定向到另一个页面。
在Java Web中,response用于向客户端发送响应数据,使用response.sendRedirect()方法可以将客户端重定向到另一个Web页面。但是,这个方法有一个限制,它必须在响应被提交之前调用。如果你在输出响应之后尝试使用它,将会引发IllegalStateException异常,提示“Cannot call sendRedirect() after the response has been committed”。
解决方法:要遵循如下步骤:
1、检查所有输出操作,确保在调用response.sendRedirect()方法之前没有提交任何响应数据。
2、确认代码中没有设置响应内容的长度或类型(例如使用response.setContentLength() 或 response.setContentType())。因为一旦发送了响应头,就太晚了。
3、在调用sendRedirect()之前把缓冲区内容清空。可以使用response.resetBuffer()方法清空缓冲区,这也可以避免如此错误。
4、在调用sendRedirect()之后,调用return语句以退出函数,以确保不会在之后尝试输出响应数据。
尽可能提早调用sendRedirect()方法,以确保操作顺利完成,同时,确保其他响应操作没有在该方法之前完成即可避免这个问题。

对此我进行了删除,重定向到此网页解决。

posted @ 2023-05-23 20:55  花伤错零  阅读(55)  评论(0)    收藏  举报