🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 路径问题 在开发中,我们会出现请求的地方大致包括了以下几个地方 1. 在 HTML 页面通过 A 标签请求; 2. 在 JS 中的 AJAX 请求; 3. 在 Servlet 中通过 `response.sendRedirect(url)` 重定向; 4. 在 Servlet 中通过`request.getRequestDispatcher(url).forward(request, response)` 转发。 在实际的应用中,1/2/3 建议使用绝对路径去完成,4 通过相对路径完成。 所谓绝对路径就是请求的地址用完整的路径去表现,例如 `http://localhost:8080/demo1/loginServlet.do` ## 如果使用绝对路径 获取绝对路径: ~~~ String path = request.getContextPath(); // 获取应用上下文,即在 server.xml 中定义的 path String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; // request.getScheme():获取协议 http // request.getServerName():获取协议服务器 // request.getServerPort():获取端口号 // 上述定义的 basePath 就是请求的地址的完整前缀 ~~~ > 在开发中,我可以将 basePath 变量定义在 request 变量中,然后在需要的地方(如 jsp 中)通过 `request.getAttribute("bath")` 或者 EL `${basePath} `方式获取。 > 为了避免每个 Servlet 中都要定义 basePath,我们可以在过滤器中定义 basePath。 ~~~ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub // place your code here HttpServletRequest req = (HttpServletRequest) request; req.setCharacterEncoding(encoding); String path = req.getContextPath(); String basePath = req.getScheme()+"://"+req.getServerName()+":"+req.getServerPort()+path+""; req.setAttribute("path", basePath); // pass the request along the filter chain chain.doFilter(request, response); } ~~~ **在 JSP 中使用** ~~~ <script src="${path}/assets/js/jquery-3.2.1.min.js"></script> $.ajax({ url : "${path}/admin/UpdateForwardAjaxServlet.do", async:false, dataType : "json", data : toData, success : function(data) { $("#editStuId").val(data.id); $("#editStuName").val(data.name); $("#editStuCode").val(data.code); } }); ~~~ 在 Servlet 或者 过滤器中使用 ~~~ String path = req.getContextPath(); String basePath = req.getScheme()+"://"+req.getServerName()+":"+req.getServerPort()+path+""; res.sendRedirect(basePath + "/common/LoginServlet.do?error=LOGIN_ERROR_02"); ~~~