我知道类似以下三行
<%= x+1 %>
<%= request.getParameter("name") %>
<%! counter++; %>
是一种老式的编码方式,在JSP版本2中存在一种避免JSP文件中出现Java代码的方法。什么是可选的JSP2行,这种技术叫什么?
我知道类似以下三行
<%= x+1 %>
<%= request.getParameter("name") %>
<%! counter++; %>
是一种老式的编码方式,在JSP版本2中存在一种避免JSP文件中出现Java代码的方法。什么是可选的JSP2行,这种技术叫什么?
当前回答
我的朋友,这些都不再使用了。我的建议是将视图(CSS、HTML、JavaScript等)与服务器分离。
在我的例子中,我使用Angular处理视图,并且使用REST服务从服务器获取所需的任何数据。
相信我,这将改变你的设计方式。
其他回答
JSTL为条件、循环、集合、get等提供标记。例如:
<c:if test="${someAttribute == 'something'}">
...
</c:if>
JSTL与请求属性一起工作——它们通常由Servlet在请求中设置,Servlet转发到JSP。
正如许多答案所说,使用JSTL或创建自己的自定义标记。下面是关于创建自定义标记的一个很好的解释。
经验表明,JSP有一些缺点,其中之一是很难避免将标记与实际代码混合。
如果可以,那么可以考虑使用专门的技术来完成您需要做的事情。在JavaEE6中有JSF2.0,它提供了许多不错的功能,包括通过#{bean.method(argument)}方法将Javabean与JSF页面粘合在一起。
学习使用JSTL自定义和编写自己的标记
注意,EL是EviL(运行时异常和重构)。
Wicket也可能是邪恶的(对于小型应用程序或简单的视图层来说,性能和费力)。
java2s示例
必须将其添加到web应用程序的web.xml中
<taglib>
<taglib-uri>/java2s</taglib-uri>
<taglib-location>/WEB-INF/java2s.tld</taglib-location>
</taglib>
在/WEB-INF中创建文件java2s.tld/
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<!-- A tab library descriptor -->
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>Java2s Simple Tags</short-name>
<!-- This tag manipulates its body content by converting it to upper case
-->
<tag>
<name>bodyContentTag</name>
<tag-class>com.java2s.BodyContentTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>howMany</name>
</attribute>
</tag>
</taglib>
将以下代码编译为WEB-INF\classes\com\java2s
package com.java2s;
import java.io.IOException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class BodyContentTag extends BodyTagSupport{
private int iterations, howMany;
public void setHowMany(int i){
this.howMany = i;
}
public void setBodyContent(BodyContent bc){
super.setBodyContent(bc);
System.out.println("BodyContent = '" + bc.getString() + "'");
}
public int doAfterBody(){
try{
BodyContent bodyContent = super.getBodyContent();
String bodyString = bodyContent.getString();
JspWriter out = bodyContent.getEnclosingWriter();
if ( iterations % 2 == 0 )
out.print(bodyString.toLowerCase());
else
out.print(bodyString.toUpperCase());
iterations++;
bodyContent.clear(); // empty buffer for next evaluation
}
catch (IOException e) {
System.out.println("Error in BodyContentTag.doAfterBody()" + e.getMessage());
e.printStackTrace();
} // End of catch
int retValue = SKIP_BODY;
if ( iterations < howMany )
retValue = EVAL_BODY_AGAIN;
return retValue;
}
}
启动服务器并在浏览器中加载bodyContent.jsp文件:
<%@ taglib uri="/java2s" prefix="java2s" %>
<html>
<head>
<title>A custom tag: body content</title>
</head>
<body>
This page uses a custom tag manipulates its body content.Here is its output:
<ol>
<java2s:bodyContentTag howMany="3">
<li>java2s.com</li>
</java2s:bodyContentTag>
</ol>
</body>
</html>
无论您如何努力避免,当您与其他开发人员合作时,他们中的一些人仍然会选择scriptlet,然后将邪恶代码插入到项目中。因此,如果您真的想要减少scriptlet代码,那么在第一个标志处设置项目是非常重要的。有几种方法可以克服这个问题(包括其他提到的几种框架)。但是,如果您喜欢纯JSP方式,那么可以使用JSTL标记文件。这样做的好处是,您还可以为项目设置母版页,这样其他页面就可以继承母版页
在WEB-INF/标记下创建一个名为base.tag的母版页,内容如下
<%@tag description=“总体页面模板”pageEncoding=“UTF-8”%><%@attribute name=“title”fragment=“true”%><html><head><标题><jsp:invokefragment=“title”></jsp:invoke></title></head><body><div id=“page header”>....</div><div id=“page body”><jsp:doBody/></div><div id=“page footer”>.....</div></body></html>
在这个主页面上,我创建了一个名为“title”的片段,这样在子页面中,我可以在主页面的这个位置插入更多代码。此外,标记<jsp:doBody/>将被子页面的内容替换
在WebContent文件夹中创建子页面(child.jsp):
<%@taglib prefix=“t”tagdir=“/WEB-INF/tags”%><t:基础><jsp:attribute name=“title”><bean:messagekey=“hello.world”/></jsp:attribute><jsp:body>[将您的孩子内容放在这里]</jsp:body></t:基础>
<t:base>用于指定要使用的母版页(此时为base.tag)。此处标记<jsp:body>中的所有内容将替换母版页上的<jsp:doBody/>。您的子页面还可以包含任何标记库,您可以像前面提到的其他页面一样正常使用它。但是,如果在这里使用任何scriptlet代码(<%=request.getParameter(“name”)%>…)并尝试运行此页面,您将得到一个JasperException,因为此处不允许脚本元素(<;%!,<;jsp:declaration,<!%=,<;jsp:expression,<:%,<,jsp:scriptlet)。因此,其他人无法将恶意代码包含到jsp文件中
从控制器调用此页面:
您可以从控制器轻松调用child.jsp文件。这也适用于struts框架