前几天在学习web基础项目时,在文件部署或者图片调用时,遇到了部分引用文件路径错误问题.
例如:第一种这样的直接在同级别部署没有问题;在login.jsp中引用同级别的JS文件夹中的jQuery部署文件,
而如果不是同级别目录,之前直接调用不到;
而如果在调用路径加上../
;即可正常调用
“../
”:表示上一层目录。
而如果,在student文件夹下还有一个文件夹;也需要部署上级student的上级web中的js文件夹下的jQuery
就需要用../../
<script src="../../js/jquery.1.8.3.min.js" type="text/javascript"></script>
JSP使用相对路径,前面的路径会自动补全,
使用相对路径回退到调用目录
相对于当前文件的路径
./ 当前的目录
/ 根目录
. ./ 上层目录
或者直接使用绝对路径
方式1:直接用服务器地址作为调用处,也就是文件真正的地址
但是ip或者项目名改变时,这个文件也就调用不到了,需要每个都去更改.
<script src="http://127.0.0.1:8080/xiaozhi/js/jquery.1.8.3.min.js" type="text/javascript"></script>
方式2:直接通过请求获取项目根路径
${pageContext.request.contextPath}
<script src="${pageContext.request.contextPath}/js/jquery.1.8.3.min.js" type="text/javascript"></script>
若出现错误情况,可能是EL表达式被忽略了;
在page指令中指定<%@page isELIgnored="false" %>
方式3:获取到项目的根地址名称,使用el表达式将根目录添加到调用处;
首先使用监听器,获取到项目的根地址名称;且将这个名称放到一个指定属性中;
创建监听器类;
//监听器; ServletContext ; 服务器启动时创建 ; 服务器关闭时销毁;
public class MyContextLinster implements ServletContextListener {
//初始化方法;
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("创建上下文监听ServletContext");
//获取ServletContext对象
ServletContext servletContext = sce.getServletContext();
//控制台查看项目根目录;
System.out.println(servletContext.getContextPath());
//设置属性名为path;值为项目根目录名
servletContext.setAttribute("path",servletContext.getContextPath());
}
}
在web.xml
文件中配置监听器
<!--配置项目的监听器-->
<listener>
<listener-class>com.xiaozhi.linster.MyContextLinster</listener-class>
</listener>
在jsp
中需要调用资源时,使用El表达式先将项目的根目录名获取,添加到调用之前;
例如:调用需要的jQuery文件
<script src="${path}/js/jquery.1.8.3.min.js" type="text/javascript"></script>
启动服务器,可以看到控制台有项目根目录名称;
且在打开的网页查看页面源码;已经自动地将项目根目录名称添加上去了
在servlet中也可以使用这样的方式指定根目录;
使用请求对象request
中的方法getContextPath()
例如:
@WebServlet(name = "login",urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//执行退出; 强制销毁session会话对象;
req.getSession().invalidate();
//重定向页面;
resp.sendRedirect(req.getContextPath()+"/login.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//执行登录;
try {
String account = req.getParameter("account");
String password = req.getParameter("password");
//记住密码的选项框提交数据;
String remember = req.getParameter("remember");
HttpSession session;
UserDao userDao=new UserDao();
//根据账号密码--查询到管理员;
User adminByAccount = userDao.findAdminByAccount(account, password);
//判断是否与数据库中的用户相同;
if (adminByAccount!=null) {
if (remember != null) {
//存储到cookie中,
Cookie accountCK = new Cookie("accountCK", account);
Cookie passwordCK = new Cookie("passwordCK", password);
//手动设置cookie缓存时间为一年;
accountCK.setMaxAge(3600 * 24 * 365);
passwordCK.setMaxAge(3600 * 24 * 365);
//将cookie对象数据添加到客户端;
resp.addCookie(accountCK);
resp.addCookie(passwordCK);
}
//获得session对象;
session = req.getSession();
//将登录人信息传入session对象; 这里传输的是对象;包含着Id和账户名;
session.setAttribute("adminByAccount", adminByAccount);
//登陆时保存日志:
UserLog userLog=new UserLog();
userLog.setAdminName(account);
userLog.setIp(req.getRemoteAddr());
userLog.setLogin_time(new Date());
userDao.saveLog(userLog);
//重定向到页面;
resp.sendRedirect(req.getContextPath()+"/success.jsp");
} else {
session = req.getSession();
session.setAttribute("errorMsg", "账号or密码错误");
//将页面重定向到login.jsp;
resp.sendRedirect(req.getContextPath()+"/login.jsp");
}
}catch (Exception e){
e.printStackTrace();
//出现异常就重定向到404页面;
resp.sendRedirect(req.getContextPath()+"/404.jsp");
}
}
}