使用来自JavaBean的数据在JSP页面中填充复选框
| 
                         我有一个JSP页面,其中包含 HTML表单中的复选框,如下所示 现在,在编辑用户技能时,我想从表中获取逗号分隔值,并填充JSP中的复选框.以下代码从数据库表中提供CSV技能. List<UserDetails> Skills = new ArrayList<UserDetails>();
      pstmt = (PreparedStatement) conn.prepareStatement(strSQL);
      rs    = pstmt.executeQuery();       
      String strSkills = rs.getString("Skills");
      List<String> items = Arrays.asList(strSkills.split("s*,s*"));
      objUserDetails.setSkills(items.toArray(new String[0]));
      Skills.add(objUserDetails);
      return Skills; 
 现在我需要填充JSP中的复选框,并选中相应的技能.我使用了Request getAttribute()方法,我将传递给JSP,如下所示 protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException 
{
   dbUtil objdbUtil     = new dbUtil();
   List<UserDetails> Skills = objdbUtil.getSkills();
   request.setAttribute("arrSkills",Skills);
   RequestDispatcher rqst = request.getRequestDispatcher("Skills.jsp");
   rqst.forward(request,response);
} 
 如何使用我在arrSkills数组中获得的技能并填充复选框.我试过用 <c:forEach var="account" items="${arrUsersList}">
    <input type="checkbox" name="chkSkills" id="chkPHP" value="PHP"/>PHP
    <input type="checkbox" name="chkSkills" id="chkJava" value="Java"/>Java
    <input type="checkbox" name="chkSkills" id="chkMySQL" value="MySQL"/>MySQL
    <input type="checkbox" name="chkSkills" id="chkJavascript" value="Javascript"/>Javascript
    <input type="checkbox" name="chkSkills" id="chkJQuery" value="JQuery"/>JQuery
    <input type="checkbox" name="chkSkills" id="chkNode" value="Node"/>Node Js
</c:forEach> 
 但我确信这不是使用它的正确方法. 解决方法检查你的例子,这里有一些注意事项.1)与您的技能变量相关. 阅读维基百科的文章Java naming conventions. 所以这会更好: 列表与LT;&的UserDetails GT; skills = new ArrayList< UserDetails>(); 2)再次与您的技能变量相关. 列表与LT;&的UserDetails GT; userDetailsList = new ArrayList< UserDetails>(); 同样,强烈建议使用有意义的变量名称.阅读上面的命名约定. 3)调用Connection.prepareStatement()方法时不需要强制转换为PreparedStatement,因为它已经返回PreparedStatement对象.所以这样做: pstmt = conn.prepareStatement(strSQL); 作为您问题的答案,是的,您当然可以使用< c:forLoop>例如,从JSTL开始迭代所有用户的列表并输出每个用户的相关详细信息.这是一种常见的做法. 你的问题不太清楚,但让我猜一下. 如果上述假设是正确的,那么这是可能的解决方案之一. 设置包含数组的属性或所需技能的列表. 考虑到列表仅限于预定义值,您可以将该列表存储在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) {
    }
} 
 NB!为了接收这些通知事件(contextInitialized,contextDestroyed),实现类必须在Web应用程序的部署描述符中声明,使用WebListener注释,或者通过ServletContext上定义的addListener方法之一注册.这里我使用了@WebListener注释. 我没有时间深入到建筑细节,但是对于这个例子,我假设有一个类User,其中包含用户相关信息.其中包含以Map< String,Boolean>实现的属性技能.它有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>();
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>用户,在请求范围中设置一个属性,如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> tag: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> 
 注意: 希望这会对你有所帮助,并给出一些有用的想法. (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  
