提问者:小点点

如何使用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个答案

匿名用户

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

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

匿名用户

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

要了解如何打开servlet,请首先查看Session属性在第一次加载时为空

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

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

所以把jsp名称放在servletURL模式

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

希望这有助于:)

匿名用户


当jsp调用“通过单击按钮或单击链接”时,您应该首先访问控制器,然后控制器将重定向jsp。
感谢大家的支持。