例を調べると、いくつかの注意があります。
1)あなたのスキルに関連する変数。
Javaローカル変数、インスタンス変数、およびクラス変数では、キャメルケースに小文字の最初の文字「」が書かれています。
Java naming conventionsのWikipedia記事を読む。
Code Conventions for the Java™ Programming Languageの命名規則については、第9章も参照してください。
だから、これは良いだろう:
あなたのスキル変数に再び関連
List<UserDetails> skills = new ArrayList<UserDetails>();
2)。
あなたのコードから、スキルがちょうど UserDetailsオブジェクトのプロパティであることは明らかであるが、あなたは、それスキル命名。私は前提をしていますが、UserDetailsクラスはユーザースキルについてのみですか? がの場合は、たとえば、UserSkillsのように、何らかの形でこれをクラス名に反映する方がよいでしょう。 スキルは、このようなものが良いだろう、ただ1ユーザー詳細のであればそうでない場合は、:
再び
List<UserDetails> userDetailsList = new ArrayList<UserDetails>();
、非常に意味のある変数名を使用することをお勧めします。上記の命名規則を読んでください。
3)あなたはそれがすでにのPreparedStatementオブジェクトを返すためConnection.prepareStatement()メソッドを呼び出すときにのPreparedStatementにキャストする必要はありません。だから行います
あなたの質問に
答えとして pstmt = conn.prepareStatement(strSQL);
、はい、もちろんあなたは、すべてのユーザーと出力のリストを通して反復処理する例ため、JSTLから<c:forLoop>
を使用することができます各ユーザーの関連情報。それは一般的な習慣です。
あなたの質問からはそれほど明確ではありませんでしたが、推測させてください。
あなたの例では、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) {
}
}
NB!これらの通知イベント(contextInitialized、contextDestroyed)を受け取るには、実装クラスをWebアプリケーションのデプロイメント記述子で宣言するか、WebListenerで注釈を付けるか、ServletContextで定義されたaddListenerメソッドの1つを介して登録する必要があります。ここで私は@WebListener
注釈を使用しました。
私は建築の詳細を深める時間がありませんが、この例ではユーザーの関連情報を含むユーザークラスがあると仮定しています。とりわけ、プロパティスキルがMap<String, Boolean>
として実装されています。ゲッターとセッターがあります(public Map<String, Boolean> getSkills()
とpublic void setSkills(Map<String, Boolean> skills)
など)。
例:User.javaのdoPost()メソッドで一部のHTMLフォームを通して送信されたデータを処理するサーブレットの一つで
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
}
そしてどこか、、ユーザーのスキルを投入しますその他の詳細。この(単純化の例)のようなもの:
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);
...
あなたはハードコードスキルの名前をしません。この方法で、そうでなければ、次のように行うことができます。get、いくつかのサーブレットで今
...
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
...
たとえば、List<User> users
などのすべてのユーザーは、ユーザーリストを格納し、すべてのユーザーに関連するデータを出力する一部のビュー(JSPページ)に転送するように、request.setAttribute("users", users)
のように要求スコープに属性を設定します。
ユーザに関連するデータを出力するJSPページの簡単な例: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>
<%-- 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>
またはよりコンパクトバリアント: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>
注::
toコメントJSP内のコードのJSP固有の部分、より良い使用JSPのコメントの形で
<%-- Some comment --%>
の形で。 HTMLコメント(<!-- Some comment -->
の形式)とは異なり、JSPコメントはクライアントに送信される結果ページには表示されません。
希望すると便利なアイデアがあります。
はすべて質問に必要なコードですか? – bsiamionau
はこの$ {account}を使用しています。 – Thihara
を参照してください。もし条件が成り立っていれば、$ {account}がそこにあると選択されなければなりません。 –