Java面试黄金宝典37

1. 转发与重定向的区别

 

  • 定义
  1. 转发:服务器内部的一种请求处理方式,当客户端向服务器发送请求后,服务器将该请求转发到另一个资源(如 JSP、Servlet)进行处理,整个过程在服务器端完成,客户端并不知道请求被转发,且使用的是同一个请求对象和响应对象。
  2. 重定向:服务器向客户端发送一个状态码(通常为 302)和一个新的 URL,客户端接收到后会重新向新的 URL 发送请求,这是两个独立的请求。
  • 要点
  1. 地址栏变化:转发时地址栏不会改变,重定向会改变。
  2. 数据共享:转发可共享请求中的数据,重定向无法直接共享,若要共享需借助 session 等。
  3. 性能:转发性能较好,是服务器内部操作;重定向涉及客户端和服务器多次交互。
  • 应用
  1. 转发:常用于 MVC 架构中,控制器将请求转发给视图进行渲染。例如在 Spring MVC 里,控制器接收请求后,将其转发到 JSP 页面。
  2. 重定向:可避免表单重复提交问题,如用户注册成功后重定向到登录页面。

Java 代码示例

java

import javax.servlet.RequestDispatcher;
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;

// 转发示例
@WebServlet("/forwardExample")
public class ForwardExampleServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        RequestDispatcher dispatcher = req.getRequestDispatcher("/target.jsp");
        dispatcher.forward(req, resp);
    }
}

// 重定向示例
@WebServlet("/redirectExample")
public class RedirectExampleServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        resp.sendRedirect("/target.jsp");
    }
}

 

2. TCP 与 UDP 区别

 

  • 定义
  1. TCP:面向连接的传输协议,在传输数据前需建立连接,传输完成后断开连接。通过三次握手建立连接,四次挥手断开连接,保证数据可靠传输。
  2. UDP:无连接的传输协议,无需建立连接,直接发送数据,不保证数据可靠传输和顺序。
  • 要点
  1. 可靠性:TCP 可靠,UDP 不可靠。
  2. 连接性:TCP 面向连接,UDP 无连接。
  3. 效率:UDP 效率高,无需建立和断开连接;TCP 效率相对较低。
  4. 应用场景:TCP 适用于对数据准确性要求高的场景,UDP 适用于对实时性要求高的场景。
  • 应用
  1. TCP:常用于文件传输、网页浏览、数据库连接等场景。例如 Java 应用程序通过 JDBC 连接数据库时使用 TCP 协议。
  2. UDP:适用于视频直播、游戏、物联网设备通信等对实时性要求高的场景。

Java 代码示例

java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

// TCP 服务器示例
class TCPServer {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(8888)) {
            System.out.println("TCP Server is listening on port 8888");
            Socket socket = serverSocket.accept();
            InputStream inputStream = socket.getInputStream();
            byte[] buffer = new byte[1024];
            int bytesRead = inputStream.read(buffer);
            String message = new String(buffer, 0, bytesRead);
            System.out.println("Received: " + message);
            OutputStream outputStream = socket.getOutputStream();
            String response = "Message received";
            outputStream.write(response.getBytes());
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

// TCP 客户端示例
class TCPClient {
    public static void main(String[] args) {
        try (Socket socket = new Socket("localhost", 8888)) {
            OutputStream outputStream = socket.getOutputStream();
            String message = "Hello, Server!";
            outputStream.write(message.getBytes());
            InputStream inputStream = socket.getInputStream();
            byte[] buffer = new byte[1024];
            int bytesRead = inputStream.read(buffer);
            String response = new String(buffer, 0, bytesRead);
            System.out.println("Received from
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值