欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

绝对路径,根路径,相对路径

程序员文章站 2022-05-09 23:10:56
...
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2019/07/11
  Time: 15:40
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <%
        String basePath = request.getScheme()+"://"+request.getServerName()
                +":"+request.getServerPort()+request.getContextPath()+"/";
    %>
    <base href="<%=basePath%>">
</head>
<body>
    <h3>绝对路径:以http开始,包括ip、port、上下文路径、目录路径、文件名。访问范围所有服务器的所有应用</h3>
    <a href="http://127.0.0.1:8080/myservlet1/path1/insert.jsp">同一个应用同一个目录下的文件:insert.jsp</a><br>
    <a href="http://127.0.0.1:8080/myservlet1/path1/sub/show.jsp">同一个应用同级目录下的文件:sub/show.jsp</a><br>
    <a href="http://127.0.0.1:8080/myservlet1/path2/update.jsp">同一个应用其他目录下的文件1:path2/update.jsp</a><br>
    <a href="http://127.0.0.1:8080/myservlet1/index.jsp">同一个应用其他目录下的文件2:index.jsp</a><br>
    <a href="http://127.0.0.1:8080/myservlet1/servlet/FirstServlet">同一个应用的servlet FirstServlet</a><br>
    <a href="http://127.0.0.1:8080/myjsp1/cart/cart.html">同一个服务器不同应用cart.html</a><br>
    <a href="http://www.bjsxt.com">北京尚学堂</a><br>
    <a href="https://www.bjsxt.com:443/news/11377.html">乔迁之喜!武汉尚学堂乔迁光谷,欢迎考察!</a>
    <h3>根路径,以/开始,/代表当前服务器,访问范围:当前服务器的所有应用</h3>
    <a href="/myservlet1/path1/insert.jsp">同一个应用同一个目录下的文件:insert.jsp</a><br>
    <a href="/myservlet1/path1/sub/show.jsp">同一个应用同级目录下的文件:sub/show.jsp</a><br>
    <a href="/myservlet1/path2/update.jsp">同一个应用其他目录下的文件1:path2/update.jsp</a><br>
    <a href="/myservlet1/index.jsp">同一个应用其他目录下的文件2:index.jsp</a><br>
    <a href="/myservlet1/servlet/FirstServlet">同一个应用的servlet FirstServlet</a><br>
    <a href="/myjsp1/cart/cart.html">同一个服务器不同应用cart.html</a><br>
    <h3>相对路径1:相对于当前文件自身.访问范围:当前服务器的所有应用</h3>
    <a href="./insert.jsp">同一个应用同一个目录下的文件:insert.jsp</a><br>
    <a href="./sub/show.jsp">同一个应用同级目录下的文件:sub/show.jsp</a><br>
    <a href="../path2/update.jsp">同一个应用其他目录下的文件1:path2/update.jsp</a><br>
    <a href="../index.jsp">同一个应用其他目录下的文件2:index.jsp</a><br>
    <a href="../servlet/FirstServlet">同一个应用的servlet FirstServlet</a><br>
    <a href="../../myjsp1/cart/cart.html">同一个服务器不同应用cart.html</a><br>
    <h3>相对路径2:相对于基准路径。访问范围:当前服务器的所有应用</h3>
    <a href="path1/insert.jsp">同一个应用同一个目录下的文件:insert.jsp</a><br>
    <a href="path1/sub/show.jsp">同一个应用同级目录下的文件:sub/show.jsp</a><br>
    <a href="path2/update.jsp">同一个应用其他目录下的文件1:path2/update.jsp</a><br>
    <a href="index.jsp">同一个应用其他目录下的文件2:index.jsp</a><br>
    <a href="servlet/FirstServlet">同一个应用的servlet FirstServlet</a><br>
    <a href="../myjsp1/cart/cart.html">同一个服务器不同应用cart.html</a><br>
    <h3>request关于路径的方法</h3>
    <%=request.getScheme() %><br>
    <%=request.getServerName() %><br>
    <%=request.getServerPort() %><br>
    <%=request.getContextPath() %><br>
    <!--
    路径的选择
    1.访问其他服务器的资源,只能使用绝对路径
    2.访问当前服务器的其他项目,建议使用根路径
    3.访问当前服务器的当前项目,建议使用相对路径
      建议使用相对路径2
    以上路径理论的适用范围
        只适用HTML标签  
                                                                                                                        <a href=""></a>  <img src="" alt=""> <form action=""></form>
            <link rel="alternate" href="atom.xml" type="application/atom+xml" title="Atom">
            <script !src=""></script>
        不适用于JSP的路径
           转发
           重定向
           文件包含
    -->
</body>
</html>
package com.bjsxt.servlet;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //解决post表单的中文乱码问题
        //request.setCharacterEncoding("utf-8");
        //获取表单的数据
        String username = request.getParameter("username");
        //解决get请求的乱码问题
//        byte [] bytes=username.getBytes("iso-8859-1");//string-- byte[]
//        username = new String(bytes,"utf-8");//byte []---string
        String password = request.getParameter("pwd");
        //增加服务器端的格式验证
        if(username == null || "".equals(username)){
            request.setAttribute("nameerror","用户名不能为空(JSP)");
            request.getRequestDispatcher("/admin/login.jsp").forward(request,response);
            return; //不加return,后面的语句还会执行
        }
        if(password == null || password.length()<=6){
            request.setAttribute("pwderror","密码长度要大于6(JSP)");
            request.getRequestDispatcher("/admin/login.jsp").forward(request,response);
            return;
        }
        //调用数据库判断登录是否成功
        boolean flag = false;
        if(username.indexOf("sxt")>=0 || username.indexOf("尚学堂")>=0){
            flag = true;
        }
        //页面的跳转
        if(flag){
            //跳到成功页面
            request.setAttribute("uname",username);
            //response.sendRedirect("/myservlet1/admin/success.jsp");//重定向Redirect
            //response.sendRedirect("http://www.bjsxt.com");
            //response.sendRedirect("/myservlet1/admin/success.jsp");
            //response.sendRedirect(request.getContextPath()+"/admin/success.jsp");
            //http://localhost:8080/myservlet1/servlet/LoginServlet
            //http://localhost:8080/myservlet1/admin/success.jsp
            //http://localhost:8080/myservlet1/servlet/success.jsp
            response.sendRedirect("../admin/success.jsp");
        }else{
            //跳回登录页面
            request.setAttribute("error","用户名或者密码错误(JSP)");
            //request.getRequestDispatcher("/admin/login.jsp").forward(request,response);//转发
            //request.getRequestDispatcher("http://www.bjsxt.com").forward(request,response);
            RequestDispatcher rd = request.getRequestDispatcher("../admin/login.jsp");
            rd.forward(request,response);
            //return;
        }
    }
}
/**
 * 客户端(用户控制)跳转的两种方式(发起新请求的两种方式)
 * 1.超链接
 * 2.提交表单
 * 本质都是:在地址栏给出请求资源的url
 *
 *
 * 服务器端控制的两种跳转方式
 * 1.转发:Dispatcher
 * 2.重定向:Redirect
 * 还有一种方式 include,使用很少,其实不属于跳转;
 转发和重定向的共同点
 都实现了跳转,并且是程序控制的
 不同点
 1.语句不同
 转发: request.getRequestDispatcher("/login2/login.jsp").forward(request,response);
 重定向 response.sendRedirect("/login2/success.jsp");
 2.跳转后地址栏路径不同
 转发:跳转之前的地址
 重定向:跳转之后的地址  success.jsp
 3.是否可以共享同一个request的数据
 转发:可以共享
 重定向:无法共享
 4.原理的不同
 转发:  110  呼叫转移
 重定向: 114  忘记带手机
 5.效率高低
 转发效率高
 6.跳转的范围
 转发:只限于当前项目(最大也就是当前服务器)
 重定向:可以重定向到互联网的任意位置
 7.路径的不同
   绝对路径
    转发:不支持
    重定向:支持
   根路径
    转发  /代表当前项目 应用
    重定向 /代表当前服务器
   相对路径
    只能相对于当前文件自身,不能相对于基准路径
    转发和重定向时使用哪个路径?
    1.要跳转到其他服务器,必须使用重定向,必须使用绝对路径
    2.要跳转到当前服务器,不管是当前项目还是其他项目,建议都使用根路径
          重定向:建议使用request.getContextPath() 动态获取上下文路径
            转发:指定在当前项目转发,/代表当前项目的根路径
    跳转时到底是使用转发还是重定向
     某些情况下,无可选择
        希望前后两个组件共享request数据,使用转发
        跳转到同一个应用的WEB-INF目录下只能用转发
        跳转到不同的应用只能使用重定向
        使用Cookie存储数据需要使用重定向
     跳转到同一个应用,哪种方式更好
        使用转发效率高,尽量使用转发
        使用转发需要解决重复提交问题,尤其是添加操作
        注销之后一般用重定向
        连续表单页面之间建议使用重定向,避免属性冲突
     转发和重定向是服务器端的跳转还是客户端跳转
       转发:服务器
       重定向:客户端跳转,由服务器端的程序控制的
        点击超链接、提交表单也是客户端跳转,由用户控制
 */