5月16日java web学习笔记

异常处理
Java Web 中的异常类型
编译时异常 :如 SQLException、IOException 等,这类异常在编译时会被检查,必须进行处理。
运行时异常 :如 NullPointerException、ArrayIndexOutOfBoundsException 等,这类异常通常是由程序逻辑错误引起的,在运行时才会被发现。
错误(Error) :表示系统级的严重错误,如 OutOfMemoryError 等,通常无法恢复,应用程序一般不处理这类错误。
异常处理机制
try-catch-finally 块 :在 Java Web 开发中,可以使用 try-catch-finally 结构捕获和处理异常。在 try 块中编写可能抛出异常的代码,catch 块用于捕获并处理特定类型的异常,finally 块用于执行清理操作(如关闭资源等),无论是否发生异常都会执行。
自定义异常类 :为了更好地处理业务逻辑中的异常情况,可以创建自定义异常类,继承自 Exception 类或 RuntimeException 类。自定义异常可以携带更丰富的错误信息,方便在不同的业务场景中进行统一的异常处理和错误反馈。
JSP 中的异常处理
使用 errorPage 和 isErrorPage 指令 :在 JSP 页面中可以通过 page 指令的 errorPage 属性指定当出现异常时要跳转到的错误处理页面;在错误处理页面中使用 isErrorPage="true" 指令,可以在该页面中访问异常对象 exception,获取异常信息并进行展示。
示例 :在普通 JSP 页面中设置 <%@ page errorPage="error.jsp" %> ,在 error.jsp 页面中设置 <%@ page isErrorPage="true" %> ,然后在 error.jsp 中使用 <%= exception.getMessage() %> 等表达式输出异常信息。
全局异常处理(异常处理器)
使用 Servlet 容器的错误页面机制 :可以在 web.xml 文件中配置全局的错误页面映射,当发生特定类型的异常或 HTTP 状态码时,自动跳转到指定的错误页面。例如:
xml

java.lang.Exception /error/exception.jsp 404 /error/404.jsp 基于 Spring MVC 的全局异常处理 :在 Spring MVC 中,可以通过实现 HandlerExceptionResolver 接口或使用 @ControllerAdvice 和 @ExceptionHandler 注解来实现全局异常处理。@ControllerAdvice 注解标注的类可以对多个控制器中的异常进行统一处理,@ExceptionHandler 注解用于指定处理特定异常的方法。例如: java

@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public String handleException(Exception ex, Model model) {
model.addAttribute("errorMessage", ex.getMessage());
return "error/exception"; // 错误页面视图名称
}

@ExceptionHandler(NoSuchRequestHandlingMethodException.class)
public String handle404Exception(Exception ex, Model model) {
    model.addAttribute("errorMessage", "资源未找到!");
    return "error/404";
}

}
文件上传下载
文件下载
基本原理 :服务器将文件作为响应体发送给客户端,通过设置响应头信息告知客户端文件的类型、名称等,客户端浏览器会根据响应头信息进行文件下载。
实现步骤
获取文件的输入流 :在服务器端通过 FileInputStream 等获取要下载的文件的输入流。
设置响应头 :设置响应的内容类型(Content-Type)为文件的 MIME 类型,设置 Content-Disposition 响应头指定文件的下载名称和方式(inline 表示在浏览器中打开,attachment 表示下载文件)。
将文件内容写入响应输出流 :通过 ServletResponse 的 OutputStream 将文件内容分块写入响应中,最后关闭输入流和输出流。
示例代码 :
java

@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filename = request.getParameter("filename");
String filepath = getServletContext().getRealPath("/files/") + File.separator + filename;

    File file = new File(filepath);
    if (file.exists()) {
        // 设置响应头
        String mimeType = getServletContext().getMimeType(filename);
        if (mimeType == null) {
            mimeType = "application/octet-stream";
        }
        response.setContentType(mimeType);
        String encodedFilename = URLEncoder.encode(filename, "UTF-8");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedFilename + "\"");

        // 写入文件内容
        FileInputStream fis = new FileInputStream(file);
        OutputStream os = response.getOutputStream();
        byte[] buffer = new byte[1024];
        int len;
        while ((len = fis.read(buffer)) != -1) {
            os.write(buffer, 0, len);
        }
        fis.close();
        os.close();
    } else {
        response.sendError(HttpServletResponse.SC_NOT_FOUND, "文件不存在!");
    }
}

}
文件上传
HTML 表单的 enctype 属性 :在实现文件上传时,HTML 表单的 enctype 属性必须设置为 multipart/form-data,表示表单数据以二进制分隔符的方式进行编码和传输,这样可以支持文件数据的上传。
Servlet 3.0 文件上传 :Servlet 3.0 规范提供了内置的文件上传支持,通过 HttpServletRequest 的 getPart 方法可以获取上传的文件项(Part 对象),然后对 Part 对象进行操作(如获取文件名、保存文件等)。
实现步骤
创建 HTML 表单 :设置 enctype="multipart/form-data",指定文件输入项()。
获取上传文件 :在 Servlet 中通过 request.getPart("fileParamName") 获取对应的 Part 对象,其中 "fileParamName" 是文件输入项的 name 属性值。
保存文件 :调用 Part 的 write 方法将文件保存到服务器端的指定路径,也可以通过 getInputStream 方法读取文件内容进行自定义处理。
获取其他表单字段 :对于非文件类型的表单字段,可以通过 request.getParameter 方法获取,但在使用 getParameter 之前必须先调用 getPart 方法,否则可能会导致表单数据解析异常(因为表单数据是以 multipart/form-data 方式传输的,不能同时使用两种不同的解析方式)。
示例代码 :
java

@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取上传文件
Part filePart = request.getPart("file");
String fileName = getFileNameFromPart(filePart);

    // 保存文件到服务器
    String savePath = getServletContext().getRealPath("/uploads/") + File.separator + fileName;
    filePart.write(savePath);

    // 获取其他表单字段
    String description = request.getParameter("description");

    // 返回上传成功信息
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    out.println("<html><body>");
    out.println("<h3>文件上传成功!</h3>");
    out.println("<p>文件名:" + fileName + "</p>");
    out.println("<p>描述:" + description + "</p>");
    out.println("</body></html>");
    out.close();
}

private String getFileNameFromPart(Part part) {
    String contentDisposition = part.getHeader("Content-Disposition");
    String[] elements = contentDisposition.split(";");
    for (String element : elements) {
        if (element.trim().startsWith("filename")) {
            return element.substring(element.indexOf('=') + 1).trim().replace("\"", "");
        }
    }
    return null;
}

}
注意事项 :在实际应用中,需要对上传的文件进行严格的校验和限制,包括文件类型、文件大小、病毒扫描等,以防止恶意文件上传导致的安全问题。同时,要合理设置服务器端的文件保存路径和权限,避免文件覆盖、路径遍历等风险。
四、AJAX 技术
AJAX 概述
AJAX(Asynchronous JavaScript and XML) :是一种在无需重新加载整个网页的情况下,能够与服务器进行数据交换并更新部分网页内容的技术。通过在后台与服务器进行异步通信,AJAX 可以实现更流畅、更动态的用户体验,减少页面刷新带来的延迟和数据传输量。
AJAX 的工作原理 :在浏览器端,通过 JavaScript 创建 XMLHttpRequest 对象,向服务器发送异步请求;服务器接收到请求后进行处理,并返回响应数据(可以是 XML、JSON、HTML 等格式);JavaScript 收到响应数据后,根据需要更新网页的 DOM 元素,实现局部刷新。
AJAX 的实现步骤
创建 XMLHttpRequest 对象 :在 JavaScript 中,通过 var xhr = new XMLHttpRequest(); 创建 XMLHttpRequest 实例。
设置请求参数 :调用 xhr.open(method, url, async) 方法设置请求的方法(如 GET、POST)、URL 和是否异步(通常设置为 true 表示异步)。
发送请求 :使用 xhr.send(data) 方法发送请求,对于 GET 请求,data 参数通常为 null,对于 POST 请求,data 包含要发送的数据。
设置请求头(可选) :对于 POST 请求,可能需要设置请求的内容类型,如 xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 或其他合适的内容类型。
处理服务器响应 :通过监听 xhr 的 readystatechange 事件,在事件处理函数中根据 xhr.readyState 的值判断请求的状态。当 readyState 等于 4(表示请求完成)且 status 等于 200(表示请求成功)时,通过 xhr.responseText 或 xhr.responseXML 获取服务器返回的数据,并进行相应的页面更新操作。
示例代码(前端部分) :
HTML

AJAX 示例
posted @ 2025-05-16 23:59  头发少的文不识  阅读(41)  评论(0)    收藏  举报