java用JavaBean中的数据填充JSP页面中的复选框
我在HTML表单中有一个带有复选框的JSP页面,如下所示
现在,在编辑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)与你的技能变量相关
在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对象。所以只要做:
作为对你的问题的回答,是,当然你可以使用JSTL中的
<c:forLoop>
,例如来遍历所有用户的列表,并输出每个用户的相关细节。这是一种常见的做法你的问题不太清楚,但让我猜猜
在您的示例中,您只有有限的技能列表,我的意思是只有PHP、Java、MySQL、JavaScript、jQuery和Node。对于每个用户,如果用户具有相应的技能,则希望选中相关复选框
如果上述假设是正确的,那么这里是一个可能的解决方案
设置一个属性,该属性包含数组或所需技能的列表
考虑到列表仅限于预定义的值,您可以将该列表存储在
ServletContext
中,以便整个应用程序都可以使用它。最好在实现ServletContextListener的类中设置这样的全局对象示例:AppContextListener。java:
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
在某个地方,在处理通过doPost()方法中的某个HTML表单提交的数据的servlet中,填充了用户技能和其他细节。类似于以下内容(简化示例):
这样你就不用硬编码技能的名字,否则你可以这样做:
现在在一些servlet中,获取所有用户,例如,一个
List<User> users
,在请求范围中设置一个属性,比如request.setAttribute("users", users)
来存储用户列表,并转发到某个视图(JSP页面),该视图将输出与所有用户相关的数据输出用户相关数据的JSP页面的简单示例:用户。jsp
或者使用
<c:if>
标记:用户,使用更紧凑的变体。jsp注意:
注释内部特定于JSP的代码部分JSP,最好以
<% Some comment %>
的形式使用JSP注释。与HTML注释(以<! Some comment >
的形式)不同,JSP注释在发送给客户端的结果页面中不可见希望这将帮助你,并提供一些有用的想法