7

以下のように、HTMLフォーム内にチェックボックスがあるJSPページがあります

ここに画像の説明を入力

ここで、ユーザー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 のチェックボックスにそれぞれのスキルがチェックされた状態で入力する必要があります。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 配列で取得した Skills の使用方法とチェック ボックスへの入力方法。使ってみた

<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>

しかし、これは正しい使い方ではないと確信しています。

4

1 に答える 1

14

あなたの例を調べて、ここにいくつかのメモがあります。

1)スキル変数に関連します。
Java のローカル変数、インスタンス変数、およびクラス変数は慣例により、最初の文字を小文字にしたキャメルケースで記述されます。

Java の命名規則については、ウィキペディアの記事を参照してください。Code Conventions for the Java™ Programming Language の
命名規則に関する第 9 章も参照してください。

したがって、これはより良いでしょう:

List<UserDetails> skills = new ArrayList<UserDetails>();

2) これもスキル変数に関連しています。
あなたはそれを Skills と名付けましたが、あなたのコードから、 skillsがUserDetailsオブジェクトのプロパティの1 つにすぎないことは明らかです。推測ですが、UserDetailsクラスはユーザースキルだけですか?yesの場合は、たとえばUserSkillsのようにクラス名に何らかの形で反映させた方がよいでしょう。それ以外の場合、スキルがユーザーの詳細の 1 つに過ぎない場合は、次のようなものが適しています。

List<UserDetails> userDetailsList = new ArrayList<UserDetails>();

ここでも、意味のある変数名を使用することを強くお勧めします。上記の命名規則をお読みください。

3) Connection.prepareStatement()メソッドを呼び出すときにPreparedStatementにキャストする必要はありません。既にPreparedStatementオブジェクトが返されているためです。だからただやってください:

pstmt = conn.prepareStatement(strSQL); 

あなたの質問への答えとして、はい、もちろん、 JSTL<c:forLoop>から使用できます。たとえば、すべてのユーザーのリストを繰り返し処理し、各ユーザーの関連する詳細を出力します。これは一般的な方法です。

あなたの質問からはあまり明確ではありませんでしたが、推測させてください。あなたの例では、スキルの有限リストしかありません。つまり、PHP、Java、MySQL、JavaScript、jQuery、Node.js のみを意味し、ユーザーが適切なスキルを持っている場合
は 、関連するチェックボックスをオンにする必要があります。 .

上記の仮定が正しけれ、考えられる解決策の 1つがここにあります。


必要なすべてのスキルの配列またはリストを含む属性を設定します。

リストが定義済みの値だけに制限されているという事実を考慮すると、そのリストを に保存して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 メソッドの 1 つを介して登録する必要があります。ここでは@WebListener注釈を使用しました。

アーキテクチャの詳細を掘り下げる時間はありませんが、この例では、ユーザー関連の情報を含むクラスUserがあると想定しています。とりわけ、 として実装されたプロパティスキルMap<String, Boolean>が含まれています。ゲッターとセッターがあります (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
}


そして、doPost() メソッドの HTML フォームから送信されたデータを処理するサーブレットのどこかに、ユーザーのスキルやその他の詳細を入力します。このようなもの(単純化された例):

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
...


ここで、一部のサーブレットで、たとえば a としてすべてのユーザーを取得し、ユーザー リストを保存して、すべてのユーザーに関連するデータを出力するビュー (JSP ページ) に転送するList<User> usersなど、リクエスト スコープに属性を設定します。request.setAttribute("users", users)

ユーザー関連データを出力する 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>

または、タグを使用したよりコンパクトなバリアント<c:if>: 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 固有の部分にコメントするには、 JSP コメントを の形式で使用することをお勧めします
<%-- Some comment --%>。HTML コメント (の形式<!-- Some comment -->) とは異なり、JSP コメントは、クライアントに送信される結果のページには表示されません。


これがあなたを助け、いくつかの有用なアイデアを与えることを願っています.

于 2013-02-16T01:24:51.257 に答える