【问题标题】:How to set/retrieve an applicationScope attribute in a jsp simple tag?如何在 jsp 简单标签中设置/检索 applicationScope 属性?
【发布时间】:2014-02-28 13:17:11
【问题描述】:

我正在练习Head First Servlets and JSP 书中的例子。

书中有一个例子讨论了简单标签来创建一个动态的 html 选择标签。参考页码:542。

我收到以下异常。

org.apache.jasper.JasperException: java.lang.NullPointerException

我不知道如何将optionList 属性值设置/传递给标记处理程序的setter 方法。我想这就是我收到NullPointerException. tld 没有问题的原因。

选择啤酒.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="my" uri="http://example.com/tags/forms" %>
<!DOCTYPE html>
<html>
<head>
<title>Select Beer</title>
</head>
<body>
<form action="select.do" method="POST">
<p>Select Beer Characteristics: </p>
Color:
<my:select optionList="${applicationScope.colorList}" name="color" size="1"/>
<br><br>
<input type="submit" value="Submit"/>
</form>
</body>
</html>

标签处理程序代码:

public class SelectTagHandler extends SimpleTagSupport {
private String name;
private String size;
private String[] optionList;
private static final String ATTR_TEMPLATE = "%s='%s'";
private static final String OPTION_TEMPLATE = "<option value='1$s'>%1$s</option>";

public void setName(String name) {
    this.name = name;
}

public void setSize(String size) {
    this.size = size;
}

public void setOptionList(String[] optionList) {
   this.optionList = optionList;
}

@Override
public void doTag() throws JspException, IOException {
JspWriter out = getJspContext().getOut();
out.print("<select");
out.print(String.format(ATTR_TEMPLATE, "name", this.name));
out.print(String.format(ATTR_TEMPLATE, "size", this.size));
out.println('>');

for (Object option : this.optionList) {
String optionTag = String.format(OPTION_TEMPLATE, option.toString());
out.println(optionTag);
}
}
}

堆栈跟踪

18:38:34,039 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/jee_war_exploded].[jsp]] (http--127.0.0.1-8000-1) Servlet.service() for servlet jsp threw exception: java.lang.NullPointerException
    at com.jstl.select.SelectTagHandler.doTag(SelectTagHandler.java:40) [classes:]
    at org.apache.jsp.select_002dbeer_jsp._jspx_meth_my_005fselect_005f0(select_002dbeer_jsp.java:101)
    at org.apache.jsp.select_002dbeer_jsp._jspService(select_002dbeer_jsp.java:68)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) [jbossweb-7.0.13.Final.jar:]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369) [jbossweb-7.0.13.Final.jar:]
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:326) [jbossweb-7.0.13.Final.jar:]
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:253) [jbossweb-7.0.13.Final.jar:]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:]
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:]
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
    at java.lang.Thread.run(Thread.java:724) [rt.jar:1.7.0_25]

【问题讨论】:

  • 发布异常的堆栈跟踪。它准确地告诉了异常发生的位置。并显示创建选项列表并将其设置为应用程序范围属性的代码。
  • 添加了堆栈跟踪。谢谢。
  • 现在是第 40 行吗?
  • for (Object option : this.optionList) 是行。
  • 我认为属性 optionList 的标签处理程序的 setter 方法无法将其设置为有效的非空列表。如何让 setter 接收一个不为 null 的有效参数?

标签: java jsp servlets


【解决方案1】:

您的标签处理程序循环遍历 optionList 数组,默​​认情况下该数组为空。所以如果你不把这个数组设置为非空值,你的标签就会失败。

您正在尝试使用

设置此值
<my:select optionList="${applicationScope.colorList}" name="color" size="1"/>

这将从 servlet 上下文中检索属性 colorList 并将其设置在您的标签处理程序中。

为此,您需要在 servlet 上下文中具有String[] 类型的属性colorList。因此,在执行 JSP 之前,必须执行以下代码行:

servletContext.setAttribute("colorList", someNonNullStringArray);

代码行的放置位置取决于您和您的要求。由于它对应用程序来说是全局的,因此将它放在部署应用程序时调用的 ServletContextListener 中是有意义的。但是对于测试,您还可以使用在 JSP 之前调用的 servlet。 servlet 上下文可从 servlet 请求中获得:

ServletContext servletContext = request.getServletContext();

【讨论】:

  • 非常感谢。我在项目中添加了另一个 servlet,它将请求转发到 current-jsp。 servlet 设置 applicationScoped 属性。现在它工作正常。非常感谢。
  • 为了作为 html 选择标记,我的自定义简单标记是否必须包含选择 html 标记的所有属性? (不仅仅是选项列表,名称和大小)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 2012-03-17
  • 1970-01-01
相关资源
最近更新 更多