如何使用jstl在下拉列表中加载值

时间:2015-07-02 09:17:13

标签: jsp servlets model-view-controller jstl

我正在寻找一种使用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标签。我听说这是不好的做法。
谢谢。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

要在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>

希望这会有所帮助:)

答案 2 :(得分:0)

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