2011-11-08 38 views
0

这是如此基本,我不能相信我已经花了整整一天。Struts2 freemarker不提交表格字段

好吧,这是我的freemarker页面

bla bla bla 
<form name="message" action="[@s.url action="login"/]" onsubmit="return detectJavaScript();" method="post"> 
    <fieldset> 
     <legend>To begin, type your Graduation Report ID and password</legend> 
     <ol> 
      <li> 
       [@requiredInstruction /] 
       <label for="username" accesskey="U"> 
        [@requiredField /] <strong>Graduation Report ID:</strong> 
       </label> 
       <input id="username" name="username" size="10" tabindex="1" type="text" value="${username!''}" 
        [@errorStyle show=(fieldErrors?exists && fieldErrors["username"]?exists)/] /> 
       [@showFieldError field="username" /] 
      </li> 
      <li> 
       <label for="password" accesskey="P"> 
        [@requiredField /] <strong>Password:</strong> 
       </label> 
       <input id="password" name="password" size="10" tabindex="2" type="password" value="${password!''}" 
        [@errorStyle show=(fieldErrors?exists && fieldErrors["password"]?exists)/] /> 
       [@showFieldError field="password" /] 
      </li> 
bla bla bla 

和我的动作类

public class SubmitLoginAction { 
    public String username; 
    public String password; 


    private static Logger logger = Logger.getLogger(SubmitLoginAction.class); 

    public void validate() { 
     logger.debug("validate fired"); 

     logger.debug("username returned: " + username); 
     logger.debug("password returned: " + password); 

和我的支柱文件

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
    "http://struts.apache.org/dtds/struts-2.0.dtd"> 

<struts> 
    <!-- <include file="com/paritysys/util/struts.xml" /> --> 

    <constant name="struts.url.includeParams" value="none" /> 
    <constant name="struts.action.extension" value="html,action" /> 

    <package name="public" extends="struts-default"> 
     <interceptors> 
      <interceptor name="websiteOnline" 
       class="parity.action.website.OnlineInterceptor" /> 
      <interceptor name="websiteLogin" 
       class="parity.action.website.LoginInterceptor" /> 

      <interceptor-stack name="appStack"> 
       <interceptor-ref name="validation"> 
        <param name="excludeMethods">input,back,cancel,browse</param> 
       </interceptor-ref> 
       <interceptor-ref name="workflow"/> 
       <interceptor-ref name="modelDriven"/> 
       <!-- <interceptor-ref name="paritySessionStack"/> --> 
       <interceptor-ref name="websiteOnline" /> 
       <interceptor-ref name="websiteLogin" /> 
      </interceptor-stack> 
     </interceptors> 

     <default-interceptor-ref name="appStack" /> 

     <global-results> 
      <result name="login" type="redirectAction"> 
       <param name="actionName">index</param> 
      </result> 
      <result name="exception" type="freemarker">/public/error.html.ftl</result> 
      <result name="error" type="freemarker">/public/error.html.ftl</result> 
      <result type="freemarker" name="maintenance">/public/maintenance.html 
      </result> 
      <result type="freemarker" name="pre-offline">/public/pre-offline.html 
      </result> 
      <result type="freemarker" name="post-offline">/public/post-offline.html 
      </result> 
     </global-results> 

     <action name="index" class="parity.action.website.LoginAction"> 
      <result type="freemarker" name="success">/public/index.html.ftl</result> 
     </action> 

     <action name="login" class="parity.action.website.SubmitLoginAction"> 
      <result type="freemarker" name="success">/public/questionnaire.html.ftl 
      </result> 
      <result type="freemarker" name="input">/public/index.html.ftl</result> 
     </action> 

     <action name="submit" class="parity.action.website.SubmitQuestionnaireAction"> 
      <result type="freemarker" name="success">/public/thanks.html.ftl 
      </result> 
      <result type="freemarker" name="input">/public/questionnaire.html.ftl 
      </result> 
     </action> 

     <action name="whereIsMyId" class="parity.action.website.LoginAction"> 
      <result type="freemarker" name="success">/public/whereIsMyId.html.ftl 
      </result> 
     </action> 

     <action name="loadCollegeFinder" class="parity.action.website.LoadCollegeFinderAction"> 
      <result type="freemarker" name="success">/public/college_finder.html.ftl 
      </result> 
     </action> 

     <action name="findCollege" class="parity.action.website.FindCollegeAction"> 
      <result type="freemarker" name="success">/public/college_finder.html.ftl 
      </result> 
      <result type="freemarker" name="input">/public/college_finder.html.ftl 
      </result> 
     </action> 
    </package> 
</struts> 

不管我做什么它保持返回null了用户和传递。我试图与getter和setter,没有,似乎没有任何工作。

我认为这是一个开箱即用的struts。

回答

0

这是,但你已经从箱子中删除它,并将其位移动。

你已经从默认拦截器堆栈中删除了“params”拦截器。 “params”拦截器是设置动作参数的参数。我在my answer to your previous post中提到过。

(除了无需继续键入“freemarker的”。)

(在一个侧面说明,我真的不推荐的公共属性,但它会工作,这取决于你Struts--版本IIRC的OGNL版本颠簸之一改变了。)

+0

是啊,我重读那篇文章,并意识到我做了什么。我重构了拦截器并将strutsdefault添加到了它。那些带来的东西我甚至没有意识到没有工作(或存在)回到网上。实际上非常有趣。这是对现有项目的修改,所以我必须遵循与以前的供应商相同的设计风格。不能等到我能摆脱这件事并彻底改变后端。 – scphantm

+0

@scphantm是的,很多(大部分)功能都包含在拦截器中 - 我很早就学会了先检查它们以确保我正在做我认为我是的:/ –