【问题标题】:How to get a form's data after the user submitted it with Spring MVC?用户使用 Spring MVC 提交表单后如何获取表单数据?
【发布时间】:2012-08-22 22:28:17
【问题描述】:

我收到一条错误消息: org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 java.lang.ClassCastException: java.lang.Object 不能转换为 com.crimetrack.business.Login

登录.java

public class Login {

    private String userName;
    private String password;
    private boolean loggedin;

    public Login(){};

    /**
     * @return the loggedin
     */
    public boolean isLoggedin() {
        return loggedin;
    }

    /**
     * @param loggedin the loggedin to set
     */
    public void setLoggedin(boolean loggedin) {
        this.loggedin = loggedin;
    }

    /**
     * @param userName
     * @param password
     */
    public Login(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }

    /**
     * @return the userName
     */
    public String getUserName() {
        return userName;
    }

    /**
     * @param userName the userName to set
     */
    public void setUserName(String userName) {
        this.userName = userName;
    }

    /**
     * @return the password
     */
    public String getPassword() {
        return password;
    }

    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = password;
    }

}

@Controller
public class AuthenticationController {

    private final Logger logger = Logger.getLogger(getClass());

    private AuthenticationManager authenticationManager;
    private Login login = new Login();

    String message = "Congrulations You Have Sucessfully Login";
    String errorMsg = "Login Unsucessful";

    @RequestMapping(value="login.htm")
    public ModelAndView onSubmit(Object command) throws ServletException {

        String userName = ((Login)command).getUserName();
        String password = ((Login)command).getPassword();

        login.setUserName(userName);
        login.setPassword(password);

        logger.info("Login was set");

        logger.info("the username was set to " + login.getUserName());
        logger.info("the password was set to " + login.getPassword());

        if (authenticationManager.Authenticate(login) == true){
            return new ModelAndView("main","welcomeMessage", message);
        }

        //return new ModelAndView("main","welcomeMessage", message);
        return new ModelAndView("login","errorMsg", "Error!!!");
    }

}

【问题讨论】:

  • 哪一行抛出异常?
  • String userName = ((Login)command).getUserName();字符串密码 = ((Login)command).getPassword();这两行

标签: java exception spring-mvc forms-authentication java.lang.class


【解决方案1】:

试试这个解决方案:

JSP

<form:form action="yourUrl" modelAttribute="login" method="POST">
<% ... %>
</form:form>

控制器

// your method that prints the form
public ModelAndView onGet(@ModelAttribute Login login) {
    // return ...
}

@RequestMapping(value="login.htm")
public ModelAndView onSubmit(@ModelAttribute Login login) {
    String userName = login.getUserName();
    String password = login.getPassword();
    // ...
}

说明

注解@ModelAttributemodel.addAttribute(String name, Object value) 完全相同。例如,@ModelAttribute Login loginmodel.addAttribute("login", new Login()); 相同。

也就是说,使用onGet 方法,您可以将这样的对象传递给您的视图。由于属性modelAttribute="login",标签&lt;form:form&gt; 将查看模型的属性列表以找到名称为login 的属性。如果没有找到,则抛出异常。

然后,这就是神奇的部分:使用标签 &lt;form:input path="userName" /&gt;,Spring MVC 将自动设置 modelAttribute="login" 属性中 bean 的属性 userName,即在您的情况下,login。如果你放了&lt;form:input path="wtf" /&gt; 之类的东西,它会抛出一个异常,因为Login bean 没有这样的属性。

所以,最后,在您的 onSubmit 方法上(再次感谢注解 @ModelAttribute),您可以访问之前由 Spring MVC 自动绑定的 login bean。

注意

我个人(几乎)从不使用ModelAndView 实例,但按以下步骤操作:

// the methods can have the name you want
// not only onGet, onPost, etc. as in servlets

@RequestMapping("url1.htm")
public String loadAnyJsp(@ModelAttribute Login login) {
    return "path/to/my/views/login";
}

@RequestMapping("url2.htm")
public String redirectToAnotherController(@ModelAttribute Login login) {
    return "redirect:url1.htm";
}

JSP 的路径在您的 web.xml 文件中指定,例如:

...
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" p:favorPathExtension="true" p:favorParameter="true" p:ignoreAcceptHeader="true" p:defaultContentType="text/html">
    <description>Depending on extension, return html with no decoration (.html), json (.json) or xml (.xml), remaining pages are decoracted</description>
    <property name="mediaTypes">
        <map>
            <entry key="xml" value="application/xml" />
            <entry key="json" value="application/json" />
            <entry key="html" value="text/html" />
            <entry key="action" value="text/html" />
        </map>
    </property>
    <property name="defaultViews">
        <list>
            <bean class="org.springframework.web.servlet.view.xml.MarshallingView" p:marshaller-ref="xstreamMarshaller" />
            <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
        </list>
    </property>
    <property name="viewResolvers">
        <list>
            <bean id="nameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
                <description>Maps a logical view name to a View instance configured as a Spring bean</description>
            </bean>
            <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/views/" p:suffix=".jsp" />
        </list>
    </property>
</bean>
...

您应该阅读the doc 以获取更多信息(参见 16.5 解决视图)。

【讨论】:

  • 好吧,这行得通,但你能告诉我,因为我不明白登录类如何获取用户输入的值。这对我来说是抽象的,我犯了很多错误,因为我不明白 pojos 是如何设置为用户输入的值的。请给我解释一下。
  • 是的,它确实有效,但是在了解如何使用用户 UI 中的值设置 pojo 时,我迷路了,我知道它会发生,但我认为我需要解释一下 spring 到底是如何发生的做到了。
  • 好的,很好的解释,我现在明白了很多
  • 还有一个小问题,您能告诉我何时使用 ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) 方法。我在其他应用程序中使用此方法来处理用户“发布”,现在我看到 spring 使用 onGet(@ModelAttribute)
  • @dev_darin 查看新的编辑。我解释的方式很常见,开发更容易。
【解决方案2】:

在您的“onSubmit”方法中,您将command 转换为Login

显然不是。

【讨论】:

  • 我做了一个演员表:Login login = (Login)command;还是一样的错误
  • 这是我的应用程序-servlet:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多