2013-02-13 7 views
6

のJavaBeanからデータをJSPページ内のチェックボックスを取り込みテーブルからチェックボックスを選択し、JSPのチェックボックスに入力します。次のコードは、CSVスキルをデータベーステーブルから取得します。私はユーザーが<em>スキル</em>を編集中</p> <p><img src="https://i.stack.imgur.com/Ftsbx.jpg" alt="enter image description here"></p> <p>は、今私はカンマ区切りをしたい以下のようにHTMLフォーム内のチェックボックスでのJSPページを持っている

 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; 

これで、チェックされたチェックボックスにそれぞれのスキルがチェックされている必要があります。私はリクエストgetAttribute()メソッドを使用して、私はどのように私はarrSkills配列になったスキルを使用すると、チェックボックスを移入する

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); 
} 

次のようにJSPに渡しています。試してみました

<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

はすべて質問に必要なコードですか? – bsiamionau

+0

はこの$ {account}を使用しています。 – Thihara

+0

を参照してください。もし条件が成り立っていれば、$ {account}がそこにあると選択されなければなりません。 –

答えて

13

例を調べると、いくつかの注意があります。

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}&nbsp; 
       </c:when> 
       <c:otherwise> 
        <input type="checkbox" name="chkSkills" value="${skill}">${skill}&nbsp; 
       </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}&nbsp; 
     </c:forEach> 
    </c:forEach> 
</body> 
</html> 

注:
toコメントJSP内のコードのJSP固有の部分、より良い使用JSPのコメントの形で
<%-- Some comment --%>の形で。 HTMLコメント(<!-- Some comment -->の形式)とは異なり、JSPコメントはクライアントに送信される結果ページには表示されません。


希望すると便利なアイデアがあります。

+1

お世話になりましたありがとうございましたありがとうございました –

+0

@JavaBeginnerようこそ! – informatik01

関連する問題

 関連する問題