Java新手求助:${pageContext.request.contextPath}/myservlet含义是什么?
关于Java内置HTTP服务器关闭按钮与路径的解惑
嘿,刚入门Java就要搞HTTP服务器,这起点可不低啊!我来帮你把困惑的点捋明白~
先搞懂${pageContext.request.contextPath}/myservlet是什么
你在Stack Overflow看到的这个写法,是JSP(JavaServer Pages)里的EL表达式(表达式语言),专门用来在JSP页面中动态获取服务器相关信息的,拆解来看:
${pageContext}:JSP自带的内置上下文对象,相当于一个“工具箱”,能拿到当前请求、会话、应用的各种信息${pageContext.request}:从工具箱里取出当前的HTTP请求对象${pageContext.request.contextPath}:获取当前Web应用的上下文路径——简单说就是你的应用在服务器上的“根目录标识”。比如你把应用部署在Tomcat的webapps/myServer文件夹下,那contextPath就是/myServer;如果是Tomcat默认的ROOT应用,这个值就是空字符串。- 后面拼上
/myservlet,就组成了这个Servlet的完整访问路径,浏览器点击按钮时会把请求发到这个地址,触发Servlet里的逻辑(比如关闭服务器)
适配你的Java内置HTTP服务器场景
不过注意哦!你用的是Java内置的com.sun.net.httpserver.HttpServer,这是个轻量级的服务器,默认不支持JSP和EL表达式,所以Stack Overflow里的那个JSP方案对你不太适用,得换个方式来实现关闭按钮:
1. 先写一个处理关闭请求的Handler
这个Handler负责接收关闭请求,返回确认页面,然后关闭服务器:
import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; import java.io.IOException; import java.io.OutputStream; public class ShutdownHandler implements HttpHandler { private final HttpServer server; public ShutdownHandler(HttpServer server) { this.server = server; } @Override public void handle(HttpExchange exchange) throws IOException { // 给浏览器返回关闭确认页面 String responseContent = "<html><body><h3>服务器即将关闭,请刷新页面确认</h3></body></html>"; exchange.sendResponseHeaders(200, responseContent.getBytes().length); OutputStream outputStream = exchange.getResponseBody(); outputStream.write(responseContent.getBytes()); outputStream.close(); // 延迟1秒再关闭,确保响应能正常发送给浏览器 new Thread(() -> { try { Thread.sleep(1000); server.stop(0); // 0表示立即关闭所有活跃连接 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } }).start(); } }
2. 启动服务器时注册Handler和首页
在你的主类里,注册关闭Handler,同时在首页返回带关闭按钮的HTML页面——这里直接写固定路径就行,因为内置服务器的根路径就是你应用的根:
import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; import java.io.IOException; import java.io.OutputStream; import java.net.InetSocketAddress; public class MyHttpServer { public static void main(String[] args) throws IOException { // 创建服务器,监听8080端口 HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0); // 注册关闭请求的Handler,路径设为/shutdown server.createContext("/shutdown", new ShutdownHandler(server)); // 注册首页的Handler,返回带关闭按钮的页面 server.createContext("/", new HttpHandler() { @Override public void handle(HttpExchange exchange) throws IOException { String homePage = "<html><body>" + "<h1>我的第一个Java内置HTTP服务器</h1>" + "<button style='padding: 8px 16px; cursor: pointer;' onclick=\"window.location.href='/shutdown'\">点击关闭服务器</button>" + "</body></html>"; exchange.sendResponseHeaders(200, homePage.getBytes().length); OutputStream outputStream = exchange.getResponseBody(); outputStream.write(homePage.getBytes()); outputStream.close(); } }); server.setExecutor(null); // 使用默认线程池 server.start(); System.out.println("服务器已启动,访问地址:http://localhost:8080"); } }
为什么不用EL?
因为Java内置HTTP服务器的定位是轻量级工具,主要用来做简单的HTTP服务、测试或者嵌入式场景,默认没有集成JSP的解析能力,所以你直接在HTML里写绝对路径/shutdown就可以,服务器会自动把这个路径映射到你注册的ShutdownHandler上。
内容的提问来源于stack exchange,提问作者Christopher Littlewood
相关产品推荐
相关产品推荐

