我正在寻找一种使用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标签。我听说这是不好的做法。
谢谢你。
这几乎是正确的,但是不像${人. 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。
感谢大家的支持。