表单数据未发布到弹簧控制器

时间:2017-10-15 07:22:55

标签: spring web-services extjs

表格数据:

form dat from UI developer tools
user.username:SS
user.email:SGFG@GMAIL.COM
user.firstName:WWW
user.lastName:FF
ext-gen1170:ENV_DEV
ext-gen1171:false
ext-gen1172:false
user.password:
userGroupPermissions:[{"userName":"SS","groupName":"ENV_DEV","permission":"*"}]

调度程序servlet的Web.xml:

<servlet-mapping>
  <servlet-name>user</servlet-name>
  <url-pattern>/spring/</url-pattern>
</servlet-mapping>

控制器:

@RequestMapping(value ="/createUser/", method = RequestMethod.POST)
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    @ResponseBody
    public String createUser(@RequestParam(value = "user.username", required = true) String username,
            @RequestParam(value = "user.email", required = true) String email,
            @RequestParam(value = "user.firstName", required = true) String firstName,
            @RequestParam(value = "user.lastName", required = true) String lastName,
            @RequestParam(value = "userGroupPermissions", required = true) UserGroupPermission userGroupPermissions,
            @RequestParam(value = "password", required = false) String password) throws IOException {

将添加以上详细信息以处理请求

控制台中没有错误,但是当我在控制器中保留断点时,没有命中断点。

我的代码是404.

EXTJS: var url ='/ spring / createUser';

1 个答案:

答案 0 :(得分:1)

有两种解决方法 - 更改将参数发送到Java或更改接收参数的方式。

只需更改Java

即可

为了简单起见,你应该改变Java。

  1. GET请求应该以您指定的方式在Spring控制器中使用@RequestParam个参数。
  2. POST / PUT请求应在Spring控制器中使用@RequestBody参数。
  3. 所以Spring控制器看起来应该是这样的:

        @RequestMapping(value ="/createUser/", method = RequestMethod.POST)
        @ResponseBody
        public String createUser(@RequestBody UserParams params)
    

    显然,如果你需要@Transactional部分,你也应该离开它。

    使用ExtJS

    发送各种请求

    以下是有关如何使用Ext.Ajax.request发送各种类型请求的一些示例。

    我已经在值中使用了波兰语,因此您还可以看到UTF-8文本的编码是如何工作的。

    查询字符串

    在查询字符串中发送意味着事件在?之后直接在URL中编码。例如。 /test?firstName=Imi%C4%99&lastName=Nazwisko

    // (Java/Spring can get this with `@RequestParam`)
    Ext.Ajax.request({
        url: '/test',
        method: 'GET',
        params: {
            firstName: 'Imię',
            lastName: 'Nazwisko'
        }
    });
    

    表格数据

    在以标准方式发送表单时使用。事物在请求正文中编码,但格式实际上与查询字符串相同(例如firstName=Imi%C4%99&lastName=Nazwisko)。

    // (Java/Spring can get this with `@RequestBody`)
    Ext.Ajax.request({
        url: '/test',
        method: 'PUT',
        params: {
            firstName: 'Imię',
            lastName: 'Nazwisko'
        }
    });
    

    请求有效负载

    这是一个JSON通信。事物在请求正文中编码,但采用JSON格式(例如{"firstName":"Imi\u0119","lastName":"Nazwisko"})。

    // (Java/Spring can get this with `@RequestBody`)
    Ext.Ajax.request({
        url: '/test',
        method: 'PUT',
        jsonData: {
            firstName: 'Imię',
            lastName: 'Nazwisko'
        }
    });
    

    查询字符串

    您可以欺骗ExtJS在URL中传递参数,而不是请求正文。如果params中存在jsonDataExt.Ajax.request,则必须将其中一个放入网址。

    所以要在查询字符串中传递params,请使用:

    Ext.Ajax.request({
        url: '/test',
        method: 'PUT',
        params: {
            firstName: 'Imię',
            lastName: 'Nazwisko'
        },
        jsonData: {}
    });
    

    请注意空jsonData。这将在请求正文中编码为{},并且可以在接收端简单地省略。在本例中为Java / Spring。

    所以这样你就可以在Spring控制器中收到所有参数作为@RequestParam参数。