• ベストアンサー
  • すぐに回答を!

html:linkでリンククリック時に画面入力値を取得してアクションへ渡す方法

  • 質問No.5621708
  • 閲覧数10311
  • ありがとう数1
  • 回答数4

お礼率 12% (6/48)

Strutsを使用したログイン画面を作成しています。ID・パスワードを入力して、html:linkをクリックしてログインするという処理を行いたいです。

そこで、リンクをクリックした際にJSPに記述しているhtml:textとhtml:passwordの値を取得して、Actionへ渡し、その情報を元にDBへの問い合わせを行いたいのですが、html:linkで複数パラメータを渡す方法が分からないので教えていただきたいです。

過去質も参考にしてみましたが、今回の質問に的を得た内容がなかったので質問させていただきました。

参考にした方法
(1)JavaScriptのonclickイベントでサブミットさせる
⇒例えばdocument.form.submit();と書けそうだが,html:formにはname属性がないため、formの指定ができない?!

(2)Mapを利用してパラメータを渡す
⇒JSP内にMap設定のロジックを書く。Map(name,value)の形式で、value部分(画面入力値)はどうやって取得するのか分からない。

【struts-config】
<action-mappings>
<action path="/login_Anken"
type="action.Login_Anken_Action"
name="login_Anken_Form"
validate="true"
input="/pages/Login_Anken.jsp"
scope="request">
<forward name="success" path="/pages/MainMenu.jsp"/>
<forward name="fail" path="/pages/Login_Anken.jsp"/>
</action>
【Login_Anken.jsp】
<html:form action="/login_Anken" >
<table border="0" width="100%" >
<tr>
<td class="pname" colspan="4" >
****システム
</td>
</tr>
<tr>
<td colspan="4">
<hr size="5" width="100%" noshade>
</td>
</tr>
<tr>
<td class="gname" colspan="4" >
ログイン
</td>
</tr>
<tr>
<td colspan="4" >
<hr size="5" width="100%" noshade>
</td>
</tr>
<tr>
<td width="25%" >&nbsp;
</td>
<td class="login">
ユーザID
</td>
<td width="20%"">
<html:text property="userId"/>
</td>
<td width="20%">&nbsp;
</td>
</tr>
<tr>
<td width="25%" >&nbsp;
</td>
<td class="login">
パスワード
</td>
<td width="20%"">
<html:password property="password" />
</td>
<td width="20%">&nbsp;
</td>
</tr>
<tr>
<td width="10%" align="center" colspan="4" >
<html:link action="/login_Anken" name="map">ログイン
</html:link>
</td>
</tr>
</table>
</html:form>

【Login_Anken_Action.java】
public class Login_Anken_Action extends Action {
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
ActionMessages errors = new ActionMessages();
//画面入力値を取得
Login_Anken_Form loginAnkenForm = (Login_Anken_Form) form;
boolean isSuccess = false;
Login_Anken_Business business =
new Login_Anken_Business();
String userName = null;
userName =
business.getLoginUserName (loginAnkenForm.getUserId(),
loginAnkenForm.getPassword());

//ユーザが存在すればログインOK
isSuccess = (userName != null);
if (isSuccess) {
//TODO
HttpSession session = request.getSession();
session.setAttribute("name", userName);
return mapping.findForward("success");
} else {
errors.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage("errors.login"));
saveErrors(request, errors);
return mapping.findForward("fail");
}
}
}

質問者が選んだベストアンサー

  • 回答No.3
  • ベストアンサー

ベストアンサー率 35% (1453/4147)

ああ
このHTML見て一目でわかったわ。
<a href="~"
のhrefにリクエストが飛んでいるだけね。
<a href="javascript:return false"
<a href="#"
とかにしないとonclickが正常に働かないわよ。
お礼コメント
kouji1351

お礼率 12% (6/48)

ありがとうございます!

html:link href="#" としたところ、無事ログインに成功することができ、画面も遷移しました。href="#"としないとJavascriptが動作しないのは、変更前はJSP上でhtml:link action="~"となっており、リンククリック時はリンクタグのアクションへリクエストが飛んでしまい、フォームタグがサブミットされない(onclickイベントが動作しない)という理解で良いのですよね。
投稿日時:2010/01/27 11:50

その他の回答 (全3件)

  • 回答No.4

ベストアンサー率 35% (1453/4147)

正確には
どっちのイベントも発行される
だわ。
今回の場合は先にパラメータのないほうが実行されたため
そこでエラーになって終わってしまったのね。
  • 回答No.2

ベストアンサー率 35% (1453/4147)

> Formの値(画面入力値)が取得できていないようです
いくつか原因が考えられるわ。

まずは、生成されたあとのHTMLを見なさい

1.formタグが複数ある
 [0]は1つ目のformタグの範囲だから、その範囲内に何もなければ何も送信されない
 [1]とかやってみるのもひとつの手ね

2.html:formのmethodをgetにしてやってみて
  リクエストURLに送信パラメータがぞろぞろつけばOK
  ~/login_Anken?userId=xxxx&password=xxx
  こんな感じね。
  つかない場合はsubmit()対象のformタグが間違っている可能性大よ
  ついているのに取得できないのならFormクラスの定義が間違っているのかもね
補足コメント
kouji1351

お礼率 12% (6/48)

リクエストURLはhtt★://loalhost:8080/app/login_Anken.doとなっており、パラメータは付いてないです。以下が生成されたHTMLですが、formタグに特におかしい箇所はない気がするのですが・・・。

<html>
<head>
<link rel="stylesheet" href="/app/css/styles.css" type="text/css" />
<title>ログイン画面</title>
</head>
<body>


<table border="0" width="100%" >
<form name="login_Anken_Form" method="GET" action="/app/login_Anken.do">
<tr>
<td class="pname" colspan="4" >
****システム
</td>
</tr>
<tr>
<td colspan="4">
<hr size="5" width="100%" noshade>
</td>
</tr>
<tr>
<td class="gname" colspan="4" >
ログイン
</td>
</tr>
<tr>
<td colspan="4" >
<hr size="5" width="100%" noshade>
</td>
</tr>
<tr>
<td width="25%" >&nbsp;
</td>
<td class="login">
ユーザID
</td>
<td width="20%" >
<input type="text" name="userId" maxlength="10" size="20" value="" style="width:100px; height=20px; font-size:10pt;" class="ime_disabled">
</td>
<td width="20%" >&nbsp;
</td>
</tr>
<tr>
<td width="25%" >&nbsp;
</td>
<td class="login">
パスワード
</td>
<td width="20%" >
<input type="password" name="password" maxlength="10" size="20" value="" style="width:100px; height=20px; font-size:10pt;" class="ime_disabled">
</td>
<td width="20%" >&nbsp;
</td>
</tr>
<tr>
<td width="10%" align="center" colspan="4" >
<a href="/app/login_Anken.do" style="font-size:10pt;" onclick="document.forms[0].submit();">ログイン</a>
</td>
</tr>
</form>
</table>
</body>
</html>
投稿日時:2010/01/26 14:27
  • 回答No.1

ベストアンサー率 35% (1453/4147)

document.forms[0].submit()
補足コメント
kouji1351

お礼率 12% (6/48)

ありがとうございます。

html:linkのonclickイベントにdocument.forms[0].submit()と書いてみましたが、処理自体はActionへ渡っているようですが、Formの値(画面入力値)が取得できていないようです。リンクのクリックは検知できたけど、サブミットはされていないということなんでしょうか?
投稿日時:2010/01/25 18:11
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ