检查您的示例,这里有一些注释。
1) 与您的 技能 变量相关。
在 Java 中,局部变量、实例变量和类变量按照惯例用 CamelCase 首字母小写编写。
阅读Java naming conventions 的维基百科文章。
另请参阅Code Conventions for the Java™ Programming Language 中有关命名约定的第 9 章。
所以这样会更好:
List<UserDetails> <b>skills</b> = new ArrayList<UserDetails>();
2) 再次与您的技能变量相关。
您将其命名为 skills,尽管从您的代码中可以清楚地看出,skills 只是 UserDetails 对象的属性中的一个。我在做一个假设,但 UserDetails 类是否仅与用户技能有关?如果是,那么最好在类名中反映这一点,例如UserSkills。
否则,如果技能只是用户详细信息之一,那么这样的东西会更好:
List<UserDetails> <b>userDetailsList</b> = new ArrayList<UserDetails>();
再次,强烈建议使用有意义的变量名。阅读上面的命名约定。
3) 调用Connection.prepareStatement() 方法时不需要强制转换为PreparedStatement,因为它已经返回PreparedStatement 对象。所以就这样做吧:
pstmt = conn.prepareStatement(strSQL);
回答您的问题,是的,当然您可以使用JSTL 中的<c:forLoop>,例如遍历列表所有用户并输出每个用户的相关详细信息。这是一种常见的做法。
你的问题不是很清楚,但让我猜一下。
在您的示例中,您只有有限的技能列表,我的意思是只有 PHP、Java、MySQL、JavaScript、jQuery、Node.js,并且您希望为每个用户检查相关复选框 if 用户具有相应的技能。
如果上述假设是正确的,那么这是可能的解决方案之一。
设置一个包含你需要的所有技能的数组或列表的属性。
考虑到列表仅限于预定义值这一事实,您可以将该列表存储在ServletContext 中,以便整个应用程序都可以使用它。最好在实现ServletContextListener的类中设置这样的全局对象。
示例:AppContextListener.java:
package com.example.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class AppContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
String[] skills = {"PHP", "Java", "MySQL", "JavaScript", "jQuery", "Node.js"};
event.getServletContext().setAttribute("skills", skills);
}
@Override
public void contextDestroyed(ServletContextEvent event) {
}
}
注意! 为了接收这些通知事件(contextInitialized、contextDestroyed),实现类必须在 Web 应用程序的部署描述符中声明、使用 WebListener 进行注释或通过以下方式之一注册ServletContext 上定义的 addListener 方法。这里我使用了@WebListener注解。
我没有时间深入了解架构细节,但对于这个示例,我假设有一个类 User,其中包含与用户相关的信息。其中,它包含作为Map<String, Boolean> 实现的属性skills。它有 getter 和 setter(如 public Map<String, Boolean> getSkills() 和 public void setSkills(Map<String, Boolean> skills))。
示例:User.java
package com.example.model;
import java.util.Date;
import java.util.Map;
public class User {
private String fisrtName;
private String lastName;
private Date birthday;
...
private Map<Sting, Boolean> skills;
// getters and setters here
}
在某处,在处理通过 doPost() 方法中的某些 HTML 表单提交的数据的 servlet 中,您填充了用户技能和其他详细信息。像这样的东西(简化示例):
User user = new User();
// set the user related data like first name or something like that
...
// get the list of available skills from ServletContext
String[] skills = (String[]) getServletContext().getAttribute("skills");
Map<String, Boolean> userSkills = new HashMap<String, Boolean>();
// Set the appropriate skills
for (String skill: skills) {
if (request.getParameter(skill) != null) {
userSkills.put(skill, true);
} else {
userSkills.put(skill, false);
}
}
...
// Set user skills
user.setSkills(userSkills);
...
这样你就不会硬编码技能名称,否则你可以这样做:
...
Map<String, Boolean> userSkills = new HashMap<String, Boolean>();
if (request.getParameter("PHP") != null) {
userSkills.put("PHP", true);
} else {
userSkills.put("PHP", false);
}
// the same way for Java, MySQL and others
...
现在在一些 servlet 中,获取所有用户,例如 List<User> users,在请求范围内设置一个属性,如 request.setAttribute("users", users) 来存储用户列表并转发到将输出数据的某个视图(JSP 页面)与所有用户相关。
输出用户相关数据的JSP页面简单示例:users.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<title>Test Page</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<%-- We iterate thru all the users --%>
<c:forEach items="${users}" var="user">
<!-- Outputting different user related data -->
...
<!-- Now outputting the user skills -->
<h3>User skills</h3>
<%-- In the inside loop, we iterate thru all the available skills, stored in the ServletContext --%>
<c:forEach items="${skills}" var="skill">
<c:choose>
<%-- If the user has the appropriate skill, the related checkbox will be checked. Otherwise unchecked. --%>
<%-- Note: using skill as a key in the map of user skills --%>
<c:when test="${user.skills[skill] == true}">
<input type="checkbox" name="chkSkills" value="${skill}" checked="checked">${skill}
</c:when>
<c:otherwise>
<input type="checkbox" name="chkSkills" value="${skill}">${skill}
</c:otherwise>
</c:choose>
</c:forEach>
</c:forEach>
</body>
</html>
或者更紧凑的变体使用<c:if>标签:users.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<title>Test Page</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<c:forEach items="${users}" var="user">
...
<h3>User skills</h3>
<c:forEach items="${skills}" var="skill">
<%-- Note: here <c:if> tag is used right inside <input> tag --%>
<input type="checkbox" name="chkSkills" value="${skill}" <c:if test="${user.skills[skill]}">checked="checked"</c:if>>${skill}
</c:forEach>
</c:forEach>
</body>
</html>
注意:
要在 JSP 中注释 JSP 特定的代码部分,最好使用
<%-- Some comment --%> 形式的 JSP cmets。与 HTML cmets(<!-- Some comment --> 的形式)不同,JSP cmets 在发送给客户端的结果页面中不可见。
希望这对您有所帮助并提供一些有用的想法。