Линкване на статичен ресурс в JSP файл
Линкването на статичен ресурс - например CSS файл, намиращ в web папката (директно или в под-папка), в JSP файл, се оказа не толкова директна операция и ми се налжожи да се поборя известно време, докато го подкарам.
Поствам тук вариантите, които открих, за да спестя време на други колеги, тръгнали по този път.
За целите на демото, ще опитваме да линкнем bootstrap.min.css, който се намира в web/resources/css/bootstrap.min.css
I. Най-простият, и съответно - най-малко правилен начин, е директното инклудване на файла:
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<title>Hello JSP!</title>
<style><%@include file="/resources/css/bootstrap.min.css"%></style>
</head>
<body>
<h1>Hello JSP!</h1>
</body>
</html>
При извикване на това JSP, в браузъра ще получим HTML-а + цялото съдържание на bootstrap.min.css:
<html>
<head>
<title>Hello JSP!</title>
<style>/*!
* Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
...
// Follows the whole content of bootstrap.min.css
...
/*# sourceMappingURL=bootstrap.min.css.map */</style>
</head>
<body>
<h1>Hello JSP!</h1>
</body>
</html>
II. Използване на taglib директива - изисква се малко повече конфигуриране, но в крайна сметка получаваме решение, което като поведение се доближава максимално до стандартните решения за използване на статични ресурси.
Открих 3 варианта за реализацията на това решение (не съм тествал изрично вариант "C").
Ето накратко описанието и стъпките им (извинявам се за англ. ез., но си копирам директно записките):
Важно!!! No @WebServlet("/") should be used as it intercepts all static resource requests! Use @WebServlet("") instead for home page.
1. Добавете taglibs-standard-impl към проекта по един от следните начини:
A. Maven dependency:
- Add as dependency to pom.xml
- Важно!!! Make sure that it is included into the artifact (Project Structure, Project Settings -> Artifacts -> the WAR artifact: double-click on "Maven: org.apache.taglibs:taglibs-standard-impl:1.2.5" in "Available elements" to auto-include it into artifact's WEB-INF\lib
B. Add taglibs-standard-impl-1.2.5.jar directly into project:
- Download taglibs-standard-impl-1.2.5.jar from http://tomcat.apache.org/download-taglibs.cgi
- Place the file into web\WEB-INF\lib folder in your project's structure
C. Add taglibs-standard-impl-1.2.5.jar directly into Apache's lib folder:
Важно!!! Тhis is the least flexible solution as it should be applied individually to any server where the application is deployed!
- Download taglibs-standard-impl-1.2.5.jar from http://tomcat.apache.org/download-taglibs.cgi
- Place the file into "Apache root folder"\lib
Важно!!! For options B and C it could be necessary to add javax.servlet/jstl/1.2 dependency to pom.xml! More on JSTL
2. Add this taglib directive to JSP file (above <html> tag!):
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3. Link desired resource using this syntax:
href="<c:url value="path/to/resource/resource.file" />"
Example for a styling file located at web/resources/css/bootstrap.min.css:
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Hello JSP!</title>
<link rel="stylesheet" type="text/css" href="<c:url value="/resources/css/bootstrap.min.css" />">
</head>
<body>
<h1>Hello JSP!</h1>
</body>
</html>
При извикване на JSP-to ще получим това в браузъра:
<html>
<head>
<title>Hello JSP!</title>
<link rel="stylesheet" type="text/css" href="/resources/css/bootstrap.min.css">
</head>
<body>
<h1>Hello JSP!</h1>
</body>
</html>
Така изглежда сървлета, който извиква JSP-то (самото JSP се намира в web/WEB-INF/jsp/home.jsp):
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("")
public class HomeServlet extends HttpServlet {
@Override
protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws IOException, ServletException {
req.getRequestDispatcher("/WEB-INF/jsp/home.jsp").forward(req, resp);
}
}