アプリ版:「スタンプのみでお礼する」機能のリリースについて

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%" >
</td>
<td class="login">
ユーザID
</td>
<td width="20%"">
<html:text property="userId"/>
</td>
<td width="20%">
</td>
</tr>
<tr>
<td width="25%" >
</td>
<td class="login">
パスワード
</td>
<td width="20%"">
<html:password property="password" />
</td>
<td width="20%">
</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");
}
}
}

A 回答 (4件)

document.forms[0].submit()

この回答への補足

ありがとうございます。

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

補足日時:2010/01/25 18:11
    • good
    • 0

> Formの値(画面入力値)が取得できていないようです


いくつか原因が考えられるわ。

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

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

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

この回答への補足

リクエスト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%" >
</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%" >
</td>
</tr>
<tr>
<td width="25%" >
</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%" >
</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
    • good
    • 0

ああ


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

ありがとうございます!

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

お礼日時:2010/01/27 11:50

正確には


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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!