SpringBootWeb 篇-深入了解请求响应(服务端接收不同类型的请求参数的方式)

🔥博客主页: 【小扳_-优快云博客】
❤感谢大家点赞👍收藏⭐评论✍

文章目录

        1.0 请求响应概述

        1.1 简单参数

        1.2 实体参数

        2.3 数组集合参数

        2.4 日期参数

        2.5 json 参数

        2.6 路径参数

        3.0 完整代码


        1.0 请求响应概述

        当客户端发送不同的请求参数到服务端,服务端就需要进行不同的方法方式来接收请求参数。一般的请求参数的类型包括:简单参数、实体参数、数组集合参数、日期参数、json 参数、路径参数。

        1.1 简单参数

        客户端无论通过 get 或者是 post 方式来发送请求,对应发送简单请求参数来说,是通过键值对的方式来发送到服务端。

        1)方法一:服务端可以用到 HttpServletRequest 类对象来接收简单参数请求,再通过对象名.getParam("请求参数名") 方法来获取值。

代码演示:

    //接收简单参数方法一:使用 HttpServletRequest 类来获取客户端发送过来的请求参数
    //通过对象名.get
    //这里注解为:请求路径
    @RequestMapping("/simpleParam")
    public String simpleParam(HttpServletRequest request){
        String name = request.getParameter("name");
        String age = request.getParameter("age");

发送的请求参数:

        通过 GET 方式来发送请求,请求参数有两个 name 和 age,send 发送给服务端后,服务端给客户端返回 "OK" 。

服务器输出的结果:

        服务端成功接收请求参数且返回数据到客户端。

        2)方法二:可以直接用一一对应的方式来接收请求参数,必须要注意保持请求的参数名与服务端需要接收的变量名保持一致。

代码演示:

    //接受简单参数方法二:直接用对应请求参数的变量名称来接收,一一对应的方式
    @RequestMapping("/simpleParam1")
    //需要注意的是,参数名称与客户端发送过来的名称要一一对应,且接收后的数据会自动识别转换类型
    public String simpleParam1(String name,Integer age){
        System.out.println(name + " : " + age);
        return "OK";
    }

发送的请求:

        这次发送的请求方式为 post 方式,请求参数在请求体中。

服务器输出的结果:

        3)对方法 2 的升级,万一有需求:接收请求参数的变量名与请求参数不一致,那么可以通过变量名与请求参数进行绑定的形式。

代码演示:

    //如果方法中的参数名与请求参数名不一致,就需要进行绑定参数
    @RequestMapping("/simpleParam2")
    public String simpleParam2(@RequestParam(name = "name" ,required = false) String userName,Integer age){
        System.out.println(userName + " : " + age);
        return "OK";
    }

发送的请求:

        通过用注解 RequestParam 来绑定 name 与 userName ,也可以理解为将 name 映射到 userName 。注解中还有一个参数,该参数的作用,将 required 设置 false 时,不要求请求参数 name 一定有,但是 requider 默认为 true ,必须要求请求参数 name 必须存在。

服务端输出的结果:

        1.2 实体参数

        可以用类对象(实体)的方式来接收请求参数,类中的成员变量必须保持跟请求参数名一致。

代码演示:

public class User {
    private String name;
    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public User() {
    }

    public User(String name, String age) {
        this.name = name;
        this.age = age;
    }


    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}
    //接受实体参数方法三:当客户端发送过来的数据,服务端可以用对象来接受,对象中的变量要跟传输过来的参数名要保持一致
    @RequestMapping("/complexParam")
    //用一个类对象来接收
    public String complexParam(User user){
        //这样 user 就可以接收到请求参数了
        System.out.println(user);
        return "OK";
    }

发送的请求:

服务端输出的结果:

        2.3 数组集合参数

        当客户端发送的请求参数中有多个参数名是一致的且值不相同时,服务端就可以用到数组来接收这些相同参数的值了,接收参数值的数组名一定要跟该多个参数名保持一致。

代码演示:

    //接收数组参数方法:当客户端发送的参数名都是一样且值不一样的时候,就可以用到数组来接收了
    //需要注意的是,请求参数名需要跟接收的数组名保持一致
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby){
        System.out.println(Arrays.toString(hobby));
        return "OK";
    }

发送的请求:

服务端输出的结果:

        服务端成功用数组接收请求参数所应对的值。

        除了数组这个容器之外,还可以用集合容器来接收请求参数,通过注解 @RequestParam 来绑定该集合来接收请求参数。

代码演示:

    //用集合来接收请求参数
    @RequestMapping("/listParam")
    //这里的注解:映射,默认用数组接收,若改变用集合来接收请求参数,就需要进行关系上的绑定
    //一定要注意,请求参数的名称 hobby 一定要与以下方法集合名称保持一致
    public String listParam(@RequestParam List<String> hobby){
        System.out.println(hobby);
        return "OK";
    }

发送的请求:

服务端输出的结果:

        2.4 日期参数

        若客户端发送给服务端的请求参数是日期格式,服务端可以用 LocalDateTime 类型的对象来接收该日期格式的请求参数,由于日期格式是不确定的,所以需要自定义日期格式,通过 @DateTimeFormat 注解中的 pattern 参数来定义日期格式。

代码演示:

    //当客户端的请求参数是日期的格式,那么就需要用到LocalDateTime类型来接收
    @RequestMapping("/dateTimeParam")
    //这里的注释:规定日期格式
    //需要注意,方法中的参数名必须要跟请求参数的名保持一致
    public String dateTimeParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime localDateTime){
        System.out.println(localDateTime);
        return "OK";
    }

发送的请求:

        需要注意的是:05 不能只写 5 ,会因为格式不对,导致报错,报错码为:400,客户端格式错误,语法错误。

服务端输出的结果:

        2.5 json 参数

        客户端用 post 方式来发送请求,请求的参数是 json 格式的参数,在请求体中。简单理解为,由于 json 格式与类的格式很像,所以用类对象来接收 json 参数,通过注解 @RequestBody 将类对象与请求 json 格式的参数进行绑定。

代码演示:

    //当客户端的请求参数是一个 json 格式,需要进行参数绑定
    //json 格式的数据可以简单理解认为就是用类对象来接收的,因为格式很相识
    @RequestMapping("/jsonParam")
    public String jsonParam(@RequestBody User user){
        System.out.println(user);
        return "OK";
    }

发送的请求:

服务端输出的结果:

        这样服务端就完成了对客户端发送过来的 json 格式的请求参数接收完毕,且成功给客户端响应 "OK" 。

        2.6 路径参数

        当客户端发送的路径中就含有参数时,服务端该如何接收呢?

        使用 Spring 框架的 Java 应用程序,可以使用 @PathVariable 注解来接收客户端发送的带有参数的路径。

        在请求路径上的参数需要用 {} 进行封装

代码演示:

    //当客户端的请求参数就是路径参数
    @RequestMapping("/Path/{id}/{name}")
    public String pathParam(@PathVariable String id,@PathVariable String name){
        System.out.println(id + " : " + name);
        return "OK";
    }

发送的请求:

服务端输出的结果:

        3.0 完整代码

demo1 类:

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

@RestController
public class demo1 {

    //接收简单参数方法一:使用 HttpServletRequest 类来获取客户端发送过来的请求参数
    //通过对象名.get
    //这里注解为:请求路径
    @RequestMapping("/simpleParam")
    public String simpleParam(HttpServletRequest request){
        String name = request.getParameter("name");
        String age = request.getParameter("age");

        //类型转化:
        int age1 = Integer.parseInt(age);
        System.out.println(name + " : " + age1);

        //给客户端返回
        return "OK";
    }


    //接受简单参数方法二:直接用对应请求参数的变量名称来接收,一一对应的方式
    @RequestMapping("/simpleParam1")
    //需要注意的是,参数名称与客户端发送过来的名称要一一对应,且接收后的数据会自动识别转换类型
    public String simpleParam1(String name,Integer age){
        System.out.println(name + " : " + age);
        return "OK";
    }

    //如果方法中的参数名与请求参数名不一致,就需要进行绑定参数
    @RequestMapping("/simpleParam2")
    public String simpleParam2(@RequestParam(name = "name" ,required = false) String userName,Integer age){
        System.out.println(userName + " : " + age);
        return "OK";
    }



    //接受实体参数方法三:当客户端发送过来的数据,服务端可以用对象来接受,对象中的变量要跟传输过来的参数名要保持一致
    @RequestMapping("/complexParam")
    //用一个类对象来接收
    public String complexParam(User user){
        //这样 user 就可以接收到请求参数了
        System.out.println(user);
        return "OK";
    }


    //接收数组参数方法:当客户端发送的参数名都是一样且值不一样的时候,就可以用到数组来接收了
    //需要注意的是,请求参数名需要跟接收的数组名保持一致
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby){
        System.out.println(Arrays.toString(hobby));
        return "OK";
    }

    //用集合来接收请求参数
    @RequestMapping("/listParam")
    //这里的注解:映射,默认用数组接收,若改变用集合来接收请求参数,就需要进行关系上的绑定
    //一定要注意,请求参数的名称 hobby 一定要与以下方法集合名称保持一致
    public String listParam(@RequestParam List<String> hobby){
        System.out.println(hobby);
        return "OK";
    }

    //当客户端的请求参数是日期的格式,那么就需要用到LocalDateTime类型来接收
    @RequestMapping("/dateTimeParam")
    //这里的注释:规定日期格式
    //需要注意,方法中的参数名必须要跟请求参数的名保持一致
    public String dateTimeParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime localDateTime){
        System.out.println(localDateTime);
        return "OK";
    }


    //当客户端的请求参数是一个 json 格式,需要进行参数绑定
    //json 格式的数据可以简单理解认为就是用类对象来接收的,因为格式很相识
    @RequestMapping("/jsonParam")
    public String jsonParam(@RequestBody User user){
        System.out.println(user);
        return "OK";
    }


    //当客户端的请求参数就是路径参数
    @RequestMapping("/Path/{id}/{name}")
    public String pathParam(@PathVariable String id,@PathVariable String name){
        System.out.println(id + " : " + name);
        return "OK";
    }



}

User 类:

public class User {
    private String name;
    private String age;
    private Hobby hobby;


    public User() {
    }

    public User(String name, String age, Hobby hobby) {
        this.name = name;
        this.age = age;
        this.hobby = hobby;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public Hobby getHobby() {
        return hobby;
    }

    public void setHobby(Hobby hobby) {
        this.hobby = hobby;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", hobby=" + hobby +
                '}';
    }
}

Hobby 类:

public class Hobby {
    private String name1;
    private String name2;

    public Hobby() {
    }

    public Hobby(String name1, String name2) {
        this.name1 = name1;
        this.name2 = name2;
    }

    public String getName1() {
        return name1;
    }

    public void setName1(String name1) {
        this.name1 = name1;
    }

    public String getName2() {
        return name2;
    }

    public void setName2(String name2) {
        this.name2 = name2;
    }

    @Override
    public String toString() {
        return "Hobby{" +
                "name1='" + name1 + '\'' +
                ", name2='" + name2 + '\'' +
                '}';
    }
}

<think>好的,我需要帮助用户了解如何使用Spring BootJAX-WS创建Web Service接收端。首先,我要回忆一下JAX-WS的基本概念它在Java中的作用。JAX-WS是Java API for XML Web Services的缩写,主要用于构建SOAP-based的Web服务。用户提到想结合Spring Boot使用,所以需要找到将JAX-WS集成到Spring Boot项目中的方法。 接下来,我需要考虑Spring Boot的依赖管理。通常,Spring Boot提供了starter依赖来简化配置,但JAX-WS可能需要额外的库,比如javax.xml.ws的API实现。可能需要添加spring-boot-starter-web,以及像jaxws-rt这样的依赖。 然后,创建Web Service的端点接口实现类。JAX-WS通常使用@WebService注解来标记服务端点,并定义服务的方法。这里需要确保接口实现类正确配置,并指定服务名称端口名称。 接下来是发布服务。在传统的Spring MVC中,可能需要使用ServletRegistrationBean来注册服务端点。例如,使用Endpoint.publish()方法或者通过配置Servlet来暴露服务。同时,需要确保在Spring Boot的配置类中正确初始化这些Bean。 另外,需要考虑WSDL的生成访问。JAX-WS会自动生成WSDL,但需要确保发布的地址正确,并且可以通过浏览器或SOAP客户端访问。可能需要配置应用的上下文路径端口,确保服务端点正确映射。 用户可能还需要处理日志异常,所以建议添加日志配置,比如使用Logback或SLF4J,并在服务实现中加入适当的异常处理机制。此外,测试服务是否正常运行,可以使用工具如Postman或SOAPUI发送请求,验证响应是否正确。 还需要注意Spring Boot的自动配置可能会与JAX-WS的配置产生冲突,因此需要检查是否有必要排除某些自动配置,或者手动配置Servlet相关的参数。例如,设置DispatcherServlet的路径,避免与JAX-WS的服务端点路径冲突。 最后,整理步骤,提供一个清晰的示例教程,涵盖依赖配置、服务接口实现、服务发布、WSDL访问以及测试方法。确保代码示例正确,并解释每个步骤的作用,帮助用户理解整个流程。同时,参考提供的引用内容,尤其是引用[2]中提到的@ResponseBodySpring MVC的集成方式,可能需要调整以确保JAX-WS的服务端点正确处理请求,不与Spring MVC的控制器冲突。</think>### 使用Spring BootJAX-WS创建Web Service接收端分步教程 #### 1. 添加依赖 在`pom.xml`中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- JAX-WS实现 --> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-rt</artifactId> <version>2.3.3</version> </dependency> ``` #### 2. 定义服务接口实现类 **接口**:使用`@WebService`注解定义服务契约 ```java @WebService(name = "HelloService", targetNamespace = "http://example.com/ws") public interface HelloService { @WebMethod String sayHello(String name); } ``` **实现类**:通过`@WebService`绑定端点 ```java @WebService( serviceName = "HelloService", portName = "HelloPort", targetNamespace = "http://example.com/ws", endpointInterface = "com.example.HelloService" ) public class HelloServiceImpl implements HelloService { @Override public String sayHello(String name) { return "Hello " + name + " from JAX-WS!"; } } ``` #### 3. 配置服务端点发布 创建配置类注册服务端点: ```java @Configuration public class WebServiceConfig { @Bean public ServletRegistrationBean<MessageDispatcherServlet> jaxwsServlet() { MessageDispatcherServlet servlet = new MessageDispatcherServlet(); servlet.setTransformWsdlLocations(true); return new ServletRegistrationBean<>(servlet, "/ws/*"); } @Bean public Endpoint endpoint() { EndpointImpl endpoint = new EndpointImpl(new HelloServiceImpl()); endpoint.publish("/hello"); return endpoint; } } ``` #### 4. 配置应用属性 `application.properties`设置端口上下文: ```properties server.port=8080 server.servlet.context-path=/api ``` #### 5. 启动应用并测试 **访问WSDL**: ``` http://localhost:8080/api/ws/hello?wsdl ``` **SOAP请求示例**: ```xml <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://example.com/ws"> <soapenv:Header/> <soapenv:Body> <ws:sayHello> <name>Spring</name> </ws:sayHello> </soapenv:Body> </soapenv:Envelope> ``` #### 关键点说明 1. **依赖管理**:`jaxws-rt`提供JAX-WS运行时支持,需注意版本兼容性 2. **端点配置**:通过`Endpoint.publish()`发布服务时,需要与Servlet路径映射配合使用[^2] 3. **命名空间管理**:明确指定`targetNamespace`可避免WSDL生成冲突 4. **容器适配**:使用`MessageDispatcherServlet`适配Spring Boot嵌入式容器 #### 常见问题处理 - **端口冲突**:检查`server.port`是否被占用 - **WSDL无法访问**:确认Servlet映射路径与端点发布路径的拼接关系 - **依赖冲突**:排除Tomcat自带的JAX-WS API(通过`<exclusions>`配置)
评论 100
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小扳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值