【问题标题】:how to load values in dropdown using jstl如何使用jstl在下拉列表中加载值
【发布时间】:2015-09-19 17:46:19
【问题描述】:

我正在寻找一种使用 jstl 填充下拉列表的方法。我需要在页面加载时执行此操作。我尝试了一些代码。但它不起作用。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
 <select>
         <c:forEach items="${requestScope.personList}"  var="person">
         <option value="${person.getId()}">${person.getName()}
         </option>
         </c:forEach>
 </select>

这是我的控制器 servlet 代码。

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    try {
        CasualLeaveService service1 = new CasualLeaveServiceImpl();
        List<Person> personList = service1.searchName();
        request.setAttribute("personList", personList);
        RequestDispatcher rd = getServletContext().getRequestDispatcher("/casual");
        rd.forward(request, response);
    } catch (Exception e) {
        e.printStackTrace();
    }
}



这是我的服务器类代码。

public List<Person> searchName() {
    List<Person> list = null;
    try (DaoSession session = DaoSessionFactory.createSession()) {
        EmployeeDao emp = session.getEmployeeDao();
        list = emp.findAllPersons();
        if (!list.isEmpty()) {
            System.out.println("My list is :"+list);
        } else {
            System.out.println("Error in list");
        }
    }
    return list;
}


我的人物类

    public class Person {

private int id;
private String employeeNo;
private String name;

@ValidNo(message = "Must be a number between 1 to 999")
private Integer epfNo;

public Person() {
}

/**
 *
 * @param id
 * @param employeeNo
 * @param name initials + surname
 * @param epfNo
 */
public Person(int id, String employeeNo, String name, Integer epfNo) {
    this.id = id;
    this.employeeNo = employeeNo;
    this.name = name;
    this.epfNo = epfNo;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getEmployeeNo() {
    return employeeNo;
}

public void setEmployeeNo(String employeeNo) {
    this.employeeNo = employeeNo;
}

/**
 *
 * @return initials + surname
 */
public String getName() {
    return name;
}

/**
 *
 * @param name initials + surname
 */
public void setName(String name) {
    this.name = name;
}

public Integer getEpfNo() {
    return epfNo;
}

public void setEpfNo(Integer epfNo) {
    this.epfNo = epfNo;
}

@Override
public int hashCode() {
    int hash = 7;
    hash = 67 * hash + this.id;
    return hash;
}

@Override
public boolean equals(Object obj) {
    if (obj == null) {
        return false;
    }
    if (getClass() != obj.getClass()) {
        return false;
    }
    final Person other = (Person) obj;
    return this.id == other.id;
}

}


我的 Web.xml 是这样映射的。

<servlet>
    <jsp-file>/WEB-INF/views/leave/CasualLeave.jsp</jsp-file>
    <servlet-name>casualLeave</servlet-name>
</servlet>

<servlet-mapping>
    <servlet-name>casualLeave</servlet-name>
    <url-pattern>/casual</url-pattern>
</servlet-mapping>

我可以保证服务类运行良好。因为我只是把这个服务类方法直接调用到jsp,输出就完美了。问题是使用 jstl 这种方法不起作用。
你能告诉我什么是错误。因为我不喜欢在 jsp html 代码中使用 scriptlet 标记。我听说这是不好的做法。
谢谢。

【问题讨论】:

  • 您是否收到任何错误,或者只是没有呈现&lt;option&gt;?无论如何,我会先使用&lt;option value="${person.id}"&gt;${person.name}&lt;/option&gt;(而不是getId()getName())。
  • @JozefChocholacek 仍然没有输出。我怀疑jstl在页面加载事件中不起作用

标签: jsp servlets model-view-controller jstl


【解决方案1】:

这几乎是正确的,但是你必须写像${person.id} 这样的属性名而不是像${person.getId()} 这样的方法,因为当你写${person.id} 时,它会自动调用person bean 的getId() 方法。所以尝试使用下面的代码:

 <select>
     <c:forEach items="${personList}"  var="person">
         <option value="${person.id}">${person.name}</option>
     </c:forEach>
 </select>

【讨论】:

  • 您是否添加了正确的&lt;%@taglib&gt; 部分?
  • 哦.好的..添加你的Person类。
  • 没有错误。只是没有输出
  • 那么问题出在别的地方。检查您的列表是否包含在 jsp 中。
  • 当我直接从 jsp 列表中调用服务类时工作正常
【解决方案2】:

要在 jsp 中加载列表,您需要首先从 servlet 传递请求,然后您的 jsp 将在请求中获得 personList,并且由于您已经从 servlet 分派请求,因此您的 jsp 将在下拉列表中打开值,因此无需运行直接用jsp。

要了解如何打开 servlet,请先查看 Session attribute is null at first load

或者假设您从锚链接调用CasualLeave.jsp

<a href="CasualLeave.jsp">Show form</a>

所以改为将 jsp 名称放入 servlet URL 模式

<a href="servletURLpattern">Show form</a>

希望这会有所帮助:)

【讨论】:

  • 其实我在web.xml中映射了这个jsp url。真实路径是WEB-INF/leave/CasualLeave.jsp。映射的很随意
  • 好的,你的searchName()方法打印列表了吗?
  • 对不起?我不明白
  • 在你写过if (!list.isEmpty()) 的地方有This is my server class code. 的问题,这个if-else 是否打印列表?
  • 没有东西打印出来亲爱的。不是如果或不是。这就是为什么我猜 jsp 没有调用控制器类的原因
【解决方案3】:

我发现自己缺少了一部分。
当 jsp 调用“通过单击按钮或单击链接”时,您应该首先到达控制器,然后控制器将重定向 jsp。
谢谢大家的支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多