我可以在<%...%>块中使用与<jsp:forward page ="..."/>等效的纯Java吗?
例如,我目前有一个这样的JSP页面:
<%
String errorMessage = SomeClass.getInstance().doSomething();
if (errorMessage != null) {
session.setAttribute("error", errorMessage);
%>
<jsp:forward page="error.jsp" />
<%
} else {
String url = response.encodeRedirectURL("index.jsp");
response.sendRedirect(url);
}
%>
Run Code Online (Sandbox Code Playgroud)
必须打破<%...%>块以使用jsp:forward是丑陋的,并且由于缩进等原因使得更难阅读.
那么,我可以在不使用JSP标记的情况下在Java代码中进行转发吗?
这样的事情是理想的:
<%
String errorMessage = SomeClass.getInstance().doSomething();
if (errorMessage != null) {
session.setAttribute("error", errorMessage);
someObject.forward("error.jsp");
} else {
String url = response.encodeRedirectURL("index.jsp");
response.sendRedirect(url);
}
%>
Run Code Online (Sandbox Code Playgroud) 如果我做:
<% pageContext.setAttribute("foo", "bar"); %>
<custom:myTag/>
Run Code Online (Sandbox Code Playgroud)
好像我应该能做到:
<%= pageContext.getAttribute("foo") %>
Run Code Online (Sandbox Code Playgroud)
在myTag.tag内...但当然我不能,因为标签文件无法访问pageContext(相反它可以访问jspContext ...它与调用页面没有相同的属性pageContext中).
现在,您可以通过ELScript访问pageContext:
${pageContext}
Run Code Online (Sandbox Code Playgroud)
但这没有用,因为ELScript无法传递参数,所以你不能这样做:
${pageContext.getAttribute("foo")}
Run Code Online (Sandbox Code Playgroud)
但是,ELscript可以访问页面上下文的事实,以及标记可以访问各种变量(如jspContext)这一事实,标记必须有一些方法才能访问(以scriptlet/Java逻辑方式,而不仅仅是ELScript)来自调用JSP的pageContext的属性.
在那儿?
我想编写一个自定义JSP标记,其输出包括其他JSP标记,这些标记本身也应该被动态评估.但显然我的TagSupport子类所写的所有内容pageContext.getOut()都直接发送给客户端而没有任何进一步的评估.
我觉得这应该很简单,因为它似乎是人们想要使用自定义标签的第一件事:封装和重用其他自定义标签,避免代码重复.
如何使以下代码执行它显然想做的事情?:
public class MyTag extends TagSupport {
public int doStartTag() throws JspException {
try {
pageContext.getOut().println(
"The output from this tag includes other tags " +
"like <mypackage:myOtherTag>this one</mypackage:myOtherTag> " +
"which should themselves be evaluated and rendered."
)
} catch (IOException e) {
throw new JspException(e);
}
return SKIP_BODY;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我的特定用例的一些背景,如果它有帮助.我有一个自定义标签<user>,它以对我的应用程序有用的方式动态呈现用户名(鼠标悬停在名字,姓氏,电话号码等).我现在正在编写另一个<comment>用于显示用户注释的标记,我想使用我现有的<user>标记在<comment>标记的输出中呈现用户名.
我目前用我的.tag文件声明:
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
Run Code Online (Sandbox Code Playgroud)
标记文件路径的示例:
/WEB-INF/tags/test.tag
Run Code Online (Sandbox Code Playgroud)
我这样使用它们:
<t:test oneAttributeKey="oneAttributeValue">
some content...
</t:test>
Run Code Online (Sandbox Code Playgroud)
我的问题:我不想把我的所有标签文件都放在一个文件夹"/ WEB-INF/tags"中.
我宁愿把它们放在不同的子目录中:
/ WEB-INF /标签/用户/
/ WEB-INF /标签/ widgetsA /
/ WEB-INF /标签/ widgetsB /
(......)
这是否可行,而不为每个人和每个人创建不同的taglib前缀?
我想避免的例子:
<%@taglib prefix="t_users" tagdir="/WEB-INF/tags/users" %>
<%@taglib prefix="t_widgetsA" tagdir="/WEB-INF/tags/widgetsA" %>
<%@taglib prefix="t_widgetsB" tagdir="/WEB-INF/tags/widgetsB" %>
Run Code Online (Sandbox Code Playgroud)
我希望使用单个"t"前缀的示例:
<t:users/onetag oneAttributeKey="oneAttributeValue">
some content...
</t:users/onetag>
Run Code Online (Sandbox Code Playgroud)
是否存在类似的解决方案?
更新:BalusC表明,通过在单个.tld中定义所有标记文件,可以只使用一个前缀.我想我的问题还不够明确:我想知道是否可以在多个子目录中使用标记文件,而不必在任何地方指定路径,除非在使用它们的元素中(例如: <T:用户/ onetag")!
我不喜欢JSP标签的是它们的行为与普通的JSP文件非常不同,即使它们实际上共享非常相似的内容.事实上,我甚至决定将所有jsp文件放在/ WEB-INF/tags /文件夹中,因此它们与标记文件并排(我必须选择/ WEB-INF/tags /,因为这文件夹对于标记文件是必需的,由于某种原因)!我不明白为什么我的一些包含HTML的文件会放在/ WEB-INF/jsp /和其他一些/ WEB-INF/tags/!!
我希望能够将jsp和标记文件分组到目录中,具体取决于它们的相关内容!示例:
/WEB-INF/tags/users/userProfileLayout.tag
/WEB-INF/tags/users/employeeProfile.jsp
/WEB-INF/tags/users/employerProfile.jsp
/WEB-INF/tags/widgetsA/widgetALayout.tag
/WEB-INF/tags/widgetsA/oldWidgetA.jsp
/WEB-INF/tags/widgetsA/newWidgetA.jsp
Run Code Online (Sandbox Code Playgroud)
但这迫使我在多个@tablib或.tld中声明每个子目录的路径,我觉得这有点不方便.我会忍受它,但我认为它可以改进.
我有代码(现在在github中),如:
my.jsp(一个通用的jsp - 所有我的jspS或多或少都遵循这个模式):
<%@ include file="include/top.jsp" %>
<title>THE TITLE</title>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="include/head.jsp" %>
<%@ include file="include/no_menu.jsp" %>
CONTENT
<%@ include file="include/bottom.jsp" %>
Run Code Online (Sandbox Code Playgroud)
其中:
top.jsp:
<%@ page session="false"%>
<%@ include file="tag_libs.jsp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Run Code Online (Sandbox Code Playgroud)
head.jsp:
<link href="${pageContext.request.contextPath}/css/twoColFixLtHdr.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="container"><!-- closes in bottom -->
<div class="header"><!-- closes in menu -->
<p>
<a href="home"> …Run Code Online (Sandbox Code Playgroud) 我正在为我的一个练习项目实现一个树标记,在那里我将以树的形式(递归地)显示目录的内容.在JSP2.0之前的几天里,我已经在Java中实现了类似于Java的自定义标记.处理目录需要递归(处理子目录)!是否可以将其编码为标记文件,并且可以以递归方式使用它们吗?
我正在尝试从自定义jsp标记传递一个java变量(我在这里使用struts2来从java类中获取变量).这是我得到的错误.
javax.servlet.ServletException: /pages/editBidForm.jsp(51,8) According to TLD or attribute directive in tag file, attribute parentId does not accept any expressions
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:515)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)
....
Run Code Online (Sandbox Code Playgroud)
这是我的jsp页面(部分)
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib uri="/WEB-INF/taglib.tld" prefix="custom" %>
...
...
<table>
<tr>
<%
String bidformoid=null;
bidFormOid=request.getParameter("bidFormOid");
%>
<td> <custom:zorancustomtag parentType = "BIDFORM" parentId = "<%= pageContext.getAttribute("bidFormOid") %>" /></td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
我无法正确传递parentId参数.我能够正确传递parentType参数,因为它只涉及传递字符串
这是taglib文件.
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag
Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>custom</shortname>
<tag>
<name>zorancustomtag</name>
<tagclass>com.zoran.action.CustomizedTag</tagclass>
<bodycontent>JSP</bodycontent> …Run Code Online (Sandbox Code Playgroud) 有没有办法,通过配置,升级或插件来获得JSP EL表达式的内容辅助?
例如
$ { CTRL+ SPACE...
要么
$ {pageContext中.CTRL+ SPACE...
等等...
我刚刚从Spring Security 3.0.5升级到3.1.0.RC3
现在,以下JSP代码给了我 java.lang.ClassNotFoundException: org.springframework.security.taglibs.authz.AuthorizeTag
<security:authorize access="not hasRole('ROLE_ANONYMOUS')">
Welcome <%= request.getUserPrincipal().getName() %>
</security:authorize>
Run Code Online (Sandbox Code Playgroud)
我看一下Spring Security Reference Documentation 3.1,看起来<security:authorize>标签应该可行.但是,当我在目录org.springframework.security.taglibs.authz中查看时,我看spring-security-taglibs-3.1.0.RC3.jar不到任何内容AuthorizeTag.class.
这有什么不对?
谢谢!
我在JSTL上看过一些关于日期比较的帖子,但我仍然无法让它发挥作用.
我有一个日期字段,我想测试是否在01-01-1970之后.
<c:if test="${user.BirthDate > whatGoesHere}">
<doSomeLogic/>
</c:if>
Run Code Online (Sandbox Code Playgroud)
}
也许应该使用豆子?
谢谢 !