有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java用JavaBean中的数据填充JSP页面中的复选框

我在HTML表单中有一个带有复选框的JSP页面,如下所示

enter image description here

现在,在编辑userSkill时,我想从表中获取逗号分隔的值,并在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中的复选框。我使用了RequestgetAttribute()方法,并将其传递给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) 个答案

  1. # 1 楼答案

    检查一下你的例子,下面是一些注释

    1)与你的技能变量相关
    在Java中,按照惯例,局部变量、实例变量和类变量都是用小写字母写成的

    阅读维基百科上的Java naming conventions文章
    另请参见第9章关于Code Conventions for the Java™ Programming Language中的命名约定

    所以这会更好:

    List<UserDetails> skills = new ArrayList<UserDetails>();

    2)同样与你的技能变量有关
    您将其命名为skills,尽管从代码中可以清楚地看出skills只是UserDetails对象的属性之一。我在做一个假设,但是UserDetails课程只是关于用户技能的吗?如果,那么最好在类名中以某种方式反映这一点,例如用户技能。 否则,如果技能只是用户详细信息中的一个,那么这样做会更好:

    List<UserDetails> userDetailsList = new ArrayList<UserDetails>();

    同样,强烈建议使用有意义的变量名。阅读上面的命名约定

    3)调用Connection.prepareStatement()方法时,不需要强制转换为PreparedStatement,因为它已经返回PreparedStatement对象。所以只要做:

    pstmt = conn.prepareStatement(strSQL); 
    

    作为对你的问题的回答,,当然你可以使用JSTL中的<c:forLoop>,例如来遍历所有用户的列表,并输出每个用户的相关细节。这是一种常见的做法

    你的问题不太清楚,但让我猜猜
    在您的示例中,您只有有限的技能列表,我的意思是只有PHP、Java、MySQL、JavaScript、jQuery和Node。对于每个用户,如果用户具有相应的技能,则希望选中相关复选框

    如果上述假设是正确的,那么这里是一个可能的解决方案


    设置一个属性,该属性包含数组或所需技能的列表

    考虑到列表仅限于预定义的值,您可以将该列表存储在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)

    示例:用户。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页面的简单示例:用户。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}&nbsp;
                    </c:when>
                    <c:otherwise>
                        <input type="checkbox" name="chkSkills" value="${skill}">${skill}&nbsp;
                    </c:otherwise>
                </c:choose>
            </c:forEach>
        </c:forEach>
    </body>
    </html>
    

    或者使用<c:if>标记:用户,使用更紧凑的变体。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}&nbsp;
            </c:forEach>
        </c:forEach>
    </body>
    </html>
    

    注意
    注释内部特定于JSP的代码部分JSP,最好以
    <% Some comment %>的形式使用JSP注释。与HTML注释(以<! Some comment >的形式)不同,JSP注释在发送给客户端的结果页面中不可见


    希望这将帮助你,并提供一些有用的想法