使用来自 JavaBean 的数据填充 JSP 页面中的复选框

Posted

技术标签:

【中文标题】使用来自 JavaBean 的数据填充 JSP 页面中的复选框【英文标题】:Populating checkboxes in JSP page with data from a JavaBean 【发布时间】:2013-01-28 19:10:39 【问题描述】:

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

现在在编辑用户 Skill 时,我想从表格中取出逗号分隔的值并填充 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>

但我确信这不是正确的使用方式。

【问题讨论】:

所有这些代码都需要提问吗? 在复选框的值中使用这个 $account 并查看 所以我应该写 if 条件并且如果 $account 存在则选择应该正确 SO 不是别人代替你做作业的地方。请查看about 文章 对不起,我明白了 【参考方案1】:

检查您的示例,这里有一些注释。

1) 与您的 技能 变量相关。 在 Java 中,局部变量、实例变量和类变量按照惯例用 CamelCase 首字母小写编写。

阅读Java naming conventions 的***文章。 另请参阅Code Conventions for the Java™ Programming Language 中有关命名约定的第 9 章。

所以这样会更好:

List&lt;UserDetails&gt; <b>skills</b> = new ArrayList&lt;UserDetails&gt;();

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

List&lt;UserDetails&gt; <b>userDetailsList</b> = new ArrayList&lt;UserDetails&gt;();

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

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

pstmt = conn.prepareStatement(strSQL); 

回答您的问题是的,当然您可以使用JSTL 中的&lt;c:forLoop&gt;,例如遍历列表所有用户并输出每个用户的相关详细信息。这是一种常见的做法。

你的问题不是很清楚,但让我猜一下。 在您的示例中,您只有有限的技能列表,我的意思是只有 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&lt;String, Boolean&gt; 实现的属性skills。它有 getter 和 setter(如 public Map&lt;String, Boolean&gt; getSkills()public void setSkills(Map&lt;String, Boolean&gt; 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&lt;User&gt; 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&nbsp;
                </c:when>
                <c:otherwise>
                    <input type="checkbox" name="chkSkills" value="$skill">$skill&nbsp;
                </c:otherwise>
            </c:choose>
        </c:forEach>
    </c:forEach>
</body>
</html>

或者更紧凑的变体使用&lt;c:if&gt;标签: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&nbsp;
        </c:forEach>
    </c:forEach>
</body>
</html>

注意: 要在 JSP 中注释 JSP 特定的代码部分,最好使用 &lt;%-- Some comment --%&gt; 形式的 JSP cmets。与 HTML cmets(&lt;!-- Some comment --&gt; 的形式)不同,JSP cmets 在发送给客户端的结果页面中不可见。


希望这对您有所帮助并提供一些有用的想法。

【讨论】:

非常感谢您的所有努力非常感谢 @informatik01 这是我见过的最好的答案之一。它解释得很好,也很详细。脱帽致敬。 @Pippi 谢谢你,很高兴你觉得它有用))

以上是关于使用来自 JavaBean 的数据填充 JSP 页面中的复选框的主要内容,如果未能解决你的问题,请参考以下文章

JSP+Servlet+javabean+oracle实现页面多条件模糊查询

JSP页面如何使用JavaBean?JavaBean的访问范围有几种

javabean 如何清除已经填充了的属性

JSP+Servlet+javabean实现页面多条件模糊查询

JSP+Servlet+javabean+mysql实现页面多条件模糊查询(转载)

servlet怎么从javabean得到表格数据 然后再传给jsp