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