Jav*_*ner 6 java jsp servlets jstl javabeans
我有一个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;
Run Code Online (Sandbox Code Playgroud)
现在我需要填充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);
}
Run Code Online (Sandbox Code Playgroud)
如何使用我在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>
Run Code Online (Sandbox Code Playgroud)
但我确信这不是使用它的正确方法.
inf*_*k01 13
检查你的例子,这里有一些注意事项.
1)与您的技能变量相关.
在Java中,按惯例的变量,实例变量和类变量都是用CamelCase编写的,并带有小写的第一个字母.
阅读维基百科有关Java命名约定的文章.
另请参阅第9章关于Java™编程语言的代码约定中的命名约定.
所以这会更好:
List<UserDetails> skills = new ArrayList<UserDetails>();
2)再次与您的技能变量相关.
你把它命名为技能,虽然从你的代码很显然,技巧只是一个对的属性的UserDetails对象.我正在做一个假设,但UserDetails类只是关于用户技能?如果是,那么最好以某种方式在类名中反映这一点,例如UserSkills.否则,如果技能只是用户详细信息之一,那么这样的事情会更好:
List<UserDetails> userDetailsList = new ArrayList<UserDetails>();
同样,强烈建议使用有意义的变量名称.阅读上面的命名约定.
3)调用Connection.prepareStatement()方法时,不需要强制转换为PreparedStatement,因为它已经返回PreparedStatement对象.所以这样做:
pstmt = conn.prepareStatement(strSQL);
Run Code Online (Sandbox Code Playgroud)
作为一个回答你的问题,是的,当然你也可以使用<c:forLoop>从JSTL,例如迭代通所有用户和输出相关的细节每个用户的列表.这是一种常见的做法.
你的问题不太清楚,但让我猜一下.
在您的示例中,您只有有限的技能列表,我的意思是只有PHP,Java,MySQL,JavaScript,jQuery,Node.js,并且对于每个用户,如果用户具有相应的技能,您需要检查相关的复选框.
如果上述假设是正确的,那么这是可能的解决方案之一.
设置包含数组的属性或所需技能的列表.
考虑到列表仅限于预定义值这一事实,您可以将该列表存储在其中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) {
}
}
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
在某个地方,在一个处理通过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);
...
Run Code Online (Sandbox Code Playgroud)
这样你就不会硬编码技能的名字,否则你可以这样做:
...
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
...
Run Code Online (Sandbox Code Playgroud)
现在在一些servlet中,获取所有用户,例如a 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>
Run Code Online (Sandbox Code Playgroud)
或者使用tag:users.jsp的更紧凑的变体<c:if>
<%@ 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>
Run Code Online (Sandbox Code Playgroud)
注意:
要在JSP中注释JSP特定的代码部分,最好以形式使用JSP注释<%-- Some comment --%>.与HTML注释(以形式<!-- Some comment -->)不同,JSP注释在将发送到客户端的结果页面中不可见.
希望这会对你有所帮助,并给出一些有用的想法.