Spring MVC 控制器如何绑定到 JSP 页面?

Posted

技术标签:

【中文标题】Spring MVC 控制器如何绑定到 JSP 页面?【英文标题】:How are Spring MVC Controllers being bound to JSP pages? 【发布时间】:2013-06-18 08:52:43 【问题描述】:

您好,我是 spring 新手,我正在尝试开发一个简单的 portlet,它接受用户的名字和姓氏,并使用 hibernate 将其保存到 db。

基本上我无法弄清楚 jsps 和控制器是如何通信的;我在这里遗漏了一些内容。

这是我第一个需要调用的控制器(我在哪里提到?)

    package codes.controller;

    import javax.portlet.RenderResponse;

    import codes.base.User;
    import codes.service.UserService;

    @Controller(value="SimpleUserController")
    @RequestMapping(value = "VIEW")
    public class SimpleUserController 

    // -- auto-wiring of service dependency
    @Autowired
    @Qualifier("userService")
    private UserService userService;

    // --maps the incoming portlet request to this method
    @RenderMapping
    public String showUsers(RenderResponse response) 
        return "home";
    

    @ExceptionHandler( Exception.class )
    public String handleException() 
        return "errorPage";
    

    // -- @ModelAttribute here works as the referenceData method
    @ModelAttribute(value="user")
    public User getCommandObject() 
        return new User();
    

最初我正在显示一个 home.jsp,它将显示带有两个输入框和一个提交按钮的表单。

<%@include file="include.jsp" %> 

<portlet:actionURL var="addUserActionUrl">
    <portlet:param name="myaction" value="addUser" />
</portlet:actionURL>

<form:form name="home" commandName="user" method="post"
    action="$addUserActionUrl">

    <table>
        <tr>
            <td>First Name:<font style="color: #C11B17;">*</font></td>
            <td><form:input path="firstname" /></td>
        </tr>
        <tr>
            <td>Last Name:<font style="color: #C11B17;">*</font></td>
            <td><form:input path="lastname" /></td>
        </tr>

        <table align="right">
        <tr>
            <td>&nbsp;</td>
            <td><input type="submit" value="SUBMIT" /></td>
        </tr>
        </table>
    </table>

</form:form>

这个JSP应该调用AddUserController.java中的action方法:

package codes.controller;

import javax.portlet.ActionResponse;
import javax.portlet.RenderResponse;

import codes.base.User;
import codes.service.UserService;  

@Controller(value = "AddUserController")
@RequestMapping(value = "VIEW")
public class AddUserController 

  @Autowired
  @Qualifier("userService")
  private UserService userService;

  @RenderMapping(params = "myaction=addUser")
  public String showRegisterPage(Model model) 
    model.addAttribute("user", new User());
    model.addAttribute("users", getUsers());
    return "addUser";
  

  public List<User> getUsers() 
    return userService.getAllUsers();
  

  @ActionMapping(params = "myaction=addUser")
  public void addBook(@ModelAttribute(value = "user") User user,
        BindingResult bindingResult, ActionResponse response,
        SessionStatus sessionStatus) 
    if (!bindingResult.hasErrors()) 
        userService.addUser(user);
        response.setRenderParameter("myaction", "users");
        sessionStatus.setComplete();
     else 
        response.setRenderParameter("myaction", "addUser");
    
  

这一次,这个名字+姓氏应该保存在数据库中,并且屏幕应该刷新以显示一个新表单,该表单将有一个下拉列表,其中包含数据库中当前用户的姓名以及另一个名字和姓氏表单字段。如果您从下拉列表中选择用户名,则会填充表单字段,您可以编辑这些值并单击更新按钮将值保存在数据库中。否则,您可以使用提交按钮向数据库添加新用户。

addUser.jsp:

<%@include file="include.jsp" %> 

<portlet:actionURL var="addUserActionUrl">
<portlet:param name="myaction" value="addUser" />
</portlet:actionURL>
<portlet:renderURL var="homeUrl">
<portlet:param name="myaction" value="Users" />
</portlet:renderURL>
<script type="text/javascript" src="js/userRelated.js"></script>

<form:form name="addUser" commandName="user" method="post"
action="$addUserActionUrl">
<form:select path="model">
<form:option value="NONE" label="--- Select ---" id="userList" onchange="showHide()"/>
<form:options items="$users" />
</form:select>

<table>
    <tr>
        <td>First Name:<font style="color: #C11B17;">*</font></td>
        <td><form:input path="firstname" /></td>

    </tr>
    <tr>
        <td>Last Name:<font style="color: #C11B17;">*</font></td>
        <td><form:input path="lastname" /></td>

    </tr>

    <table align="right">
    <tr>
        <td>&nbsp;</td>
        <td><input type="submit" id="submit" value="SUBMIT" />SUBMIT</td>
    </tr>
        <tr>
        <td>&nbsp;</td>
        <td><input type="submit" id="update"  value="SUBMIT" />UPDATE</td>
    </tr>
    </table>        
</table>

</form:form>

我正在使用下拉菜单的 onchange 隐藏和取消隐藏提交/更新按钮。如何根据可用按钮调用 addUsercontroller 中的不同函数?

【问题讨论】:

有一个很酷的人,他对你的问题有很多答案。试试看他的博客mkyong.com/tutorials/spring-mvc-tutorials 完全成为这方面的专家,阅读 Spring MVC 的实现和 FrontController 的概念 【参考方案1】:

通过javascript更新表单元素的action属性

【讨论】:

我应该这样说吗:
动作应该是你想“调用”的任何请求映射 可以像 addUser.jsp 那样在提交时将一个表单映射到 2 个不同的函数吗?

以上是关于Spring MVC 控制器如何绑定到 JSP 页面?的主要内容,如果未能解决你的问题,请参考以下文章

spring mvc如何在jsp页面和后台control之间实现集合对象的绑定?

如何指定一个请求参数绑定到某个控制器方法参数而不是Spring MVC中的模型属性?

如何在Spring MVC控制器类中处理两个jsp表单页面

如何在spring mvc中将嵌套列表元素传递给控制器

ModelAndView没有将模型返回到spring mvc中的JSP

JSON - Spring MVC:如何将 json 数据发布到 Spring MVC 控制器