我以前从未见过 实际使用过的<base>
HTML标签.它的使用存在缺陷,这意味着我应该避免它吗?
事实上我从来没有注意到它在现代生产网站(或任何网站)上的使用让我对它持怀疑态度,尽管看起来它可能有用于简化我网站链接的有用应用程序.
使用基本标签几周后,我最终找到了使用基本标签的一些主要问题,这使得它比最初出现时更不可取.从本质上讲,变化href='#topic'
和href=''
基本标签下是非常有它们的默认行为不兼容,并可以从默认行为,这种变化很容易使第三方库的控制范围之外的非常不可靠的 以意想不到的方式,因为它们在逻辑上依赖于默认行为.通常,这些更改是微妙的,并且在处理大型代码库时会导致不那么明显的问题.我已经创建了一个回答,详细说明了我在下面遇到的问题.因此,在您进行广泛部署之前,请自行测试链接结果<base>
,这是我的新建议!
当我将servlet转发到JSP时,我在加载CSS和图像以及创建指向其他页面的链接方面遇到了麻烦.具体而言,当我把我的<welcome-file>
给index.jsp
的CSS被加载并正在显示我的图片.但是,如果我将我设置<welcome-file>
为HomeServlet
哪个转发控制index.jsp
,则不应用CSS并且不显示我的图像.
我的CSS文件在web/styles/default.css
.
我的照片在web/images/
.
我像这样链接到我的CSS:
<link href="styles/default.css" rel="stylesheet" type="text/css" />
Run Code Online (Sandbox Code Playgroud)
我正在显示我的图像如下:
<img src="images/image1.png" alt="Image1" />
Run Code Online (Sandbox Code Playgroud)
这个问题是怎么造成的,怎么解决?
更新1:我添加了应用程序的结构,以及其他一些可能有用的信息.
该header.jsp
文件是包含CSS链接标记的文件.该HomeServlet
设置为我welcome-file
在web.xml
:
<welcome-file-list>
<welcome-file>HomeServlet</welcome-file>
</welcome-file-list>
Run Code Online (Sandbox Code Playgroud)
servlet被声明并映射为web.xml
:
<servlet>
<servlet-name>HomeServlet</servlet-name>
<servlet-class>com.brianblog.frontend.HomeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HomeServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
更新2:我最终发现了问题 - 我的servlet映射不正确.显然当设置一个Servlet时,<welcome-file>
它不能有一个URL模式/
,我觉得有点奇怪,因为它不代表网站的根目录?
新映射如下:
<servlet-mapping>
<servlet-name>HomeServlet</servlet-name>
<url-pattern>/HomeServlet</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud) 有时您需要在servlet/JSP /基于内容的任何内容中构建Web应用程序上下文的完整URL HttpServletRequest
.像http://server.name:8080/context/这样的东西.Servlet API没有一种方法可以实现这一点.
直接的方法是将所有URL组件附加到a StringBuffer
,例如
ctxUrl = sb.append(req.getScheme()).append("://")
.append(req.getgetServerName()).append(":")
.append(req.getServerPort()) etc
Run Code Online (Sandbox Code Playgroud)
我想知道这个替代方案是否有任何问题(速度提高了10倍):
ctxUrl = req.getRequestURL();
ctxUrl = ctxUrl.substring(0, ctxUrl.lastIndexOf("/")));
Run Code Online (Sandbox Code Playgroud)
以上两种方法总会产生相同的结果吗?
在JSF 2.0中生成绝对链接的更好方法是什么?现在我正在<h:outputLink/>
以#{facesContext.externalContext.requestContextPath}
如下丑陋的方式使用.我不想使用JSTL和<c:url />
<h:outputLink value="#{facesContext.externalContext.requestContextPath}/pages/home.jsf">Home</h:outputLink>
Run Code Online (Sandbox Code Playgroud) 重要提示:自2015年4月8日发布的PrimeFaces 5.2 final(社区发布)以来,此问题已得到修复.因此,如果您碰巧使用该版本或更新版本,则无需使用临时解决方法.
现在可以安全地修改先前给出的示例,如下所示.
public StreamedContent getImage() throws IOException {
FacesContext context = FacesContext.getCurrentInstance();
if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
return new DefaultStreamedContent();
} else {
String id = context.getExternalContext().getRequestParameterMap().get("id");
byte[] bytes = Utils.isNumber(id) ? service.findImageById(Long.parseLong(id)) : null;
return bytes == null ? null : new DefaultStreamedContent(new ByteArrayInputStream(bytes));
}
}
Run Code Online (Sandbox Code Playgroud)
LONGBLOB
在我厌倦了操作/管理存储在磁盘文件系统中的图像之后,我已经以BLOB()的形式将图像移动到数据库(MySQL).
因此,我正在<p:dataTable>
如下显示图像(从这里公然复制:)).
<p:column headerText="Header">
<p:graphicImage value="#{bannerBean.image}" height="200" width="200">
<f:param name="id" value="#{row.bannerId}"/>
</p:graphicImage>
<p:column>
Run Code Online (Sandbox Code Playgroud)
检索图像的bean如下所示.
@ManagedBean
@ApplicationScoped
public …
Run Code Online (Sandbox Code Playgroud) 在我的JSF 2.0 Facelets应用程序中,我有一个光荣的模板,我希望所有页面都可以使用.它位于web-app的根目录中,伪装成名称template.xhtml.因此它按照您的预期引用:
<ui:composition template="./template.xhtml">
Run Code Online (Sandbox Code Playgroud)
但是我现在导航到子目录中的客户端文件.由于权限级别不同,以这种方式组织它们很有用.这些子目录中的facelets将引用相同的模板,如下所示:
<ui:composition template="../template.xhtml">
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但是在模板的标题中我像这样拉入css:
<link href="./resources/css/default.css" rel="stylesheet" type="text/css" />
<link href="./resources/css/tableLayout.css" rel="stylesheet" type="text/css" />
<link href="../resources/css/default.css" rel="stylesheet" type="text/css" />
<link href="../resources/css/tableLayout.css" rel="stylesheet" type="text/css" />
Run Code Online (Sandbox Code Playgroud)
冗余引用的原因是我还没有找到任何其他方法来使模板从根目录或子目录的上下文中工作.除非您像这样将应用程序名称放在其中,否则以/开头的路径名不起作用
/TheApp-Ver1_0/resources/css/default.css
Run Code Online (Sandbox Code Playgroud)
这个问题是绝对路径名以变量开头,而不是常量.该变量取决于应用程序在容器中的部署方式.有没有解决这个问题的干净方法?
我做了一些搜索来找到这个问题.诚实.然而,我怀疑这是另一个 BalusC俯冲中提供了一个链接到我错过的某个地方广泛讨论的令人眼花缭乱的明显解决方案.