Browse Source

[java] Add hserver and hserver-business (#9405)

* hserver framework submit

* hserver framework submit

* lowercase fix

* Required response header missing: Date fix

* Date format fix

* update hserver version

* update hserver threadPool

* update hserver

* update hserver

* update hserver query

* update hserver query

* Update README.md

* update hserver query

* update hserver query

* update hserver query

* update hserver query

* update hserver query

* update hserver query

* Optimal configuration of hserver framework

* Optimal configuration of hserver framework

* Optimal configuration of hserver framework

* Upgrade hserver Framework version and optimize configuration

* Upgrade hserver Framework version and optimize configuration

* Upgrade hserver Framework version and optimize configuration

* Upgrade hserver Framework version and optimize configuration

* Upgrade hserver Framework version and optimize configuration

* Upgrade hserver Framework version and optimize configuration

* Upgrade hserver Framework version and optimize configuration

* Upgrade hserver Framework version and optimize configuration

* Upgrade hserver Framework version and optimize configuration

* Upgrade hserver Framework version and optimize configuration

* Upgrade hserver Framework version and optimize configuration

* Upgrade hserver Framework version and optimize configuration

* Upgrade hserver Framework version and optimize configuration

* Upgrade hserver Framework version and optimize configuration

* Upgrade hserver Framework version and optimize configuration

* Update pom.xml

Upgrade dependencies, optimize performance.

* Upgrade hserver Framework version and optimize configuration

* Upgrade hserver Framework version and optimize configuration and Optimize log printing

* Update pom.xml

* Update StartApp.java

* 1

* 1

* 1

* update jdk version

* update version

* update version

* update version

* Update app.properties

* Update config.toml

* Update benchmark_config.json

* Update benchmark_config.json

* Update config.toml

* Upgrade hserver Framework version and optimize configuration

* Upgrade hserver Framework version and optimize configuration

* Upgrade hserver Framework version and optimize configuration

* update version

* add hserver-business test

---------

Co-authored-by: 黑小马 <[email protected]>
黑小马 8 months ago
parent
commit
22d66743e2
22 changed files with 552 additions and 16 deletions
  1. 39 0
      frameworks/Java/hserver-business/README.md
  2. 31 0
      frameworks/Java/hserver-business/benchmark_config.json
  3. 17 0
      frameworks/Java/hserver-business/config.toml
  4. 13 0
      frameworks/Java/hserver-business/hserver.dockerfile
  5. 52 0
      frameworks/Java/hserver-business/pom.xml
  6. 18 0
      frameworks/Java/hserver-business/src/main/java/com/test/hserver/StartApp.java
  7. 24 0
      frameworks/Java/hserver-business/src/main/java/com/test/hserver/bean/Fortune.java
  8. 13 0
      frameworks/Java/hserver-business/src/main/java/com/test/hserver/bean/Message.java
  9. 24 0
      frameworks/Java/hserver-business/src/main/java/com/test/hserver/bean/World.java
  10. 136 0
      frameworks/Java/hserver-business/src/main/java/com/test/hserver/controller/TestController.java
  11. 25 0
      frameworks/Java/hserver-business/src/main/java/com/test/hserver/db/DataSourceConfig.java
  12. 57 0
      frameworks/Java/hserver-business/src/main/java/com/test/hserver/db/PostgresConfig.java
  13. 15 0
      frameworks/Java/hserver-business/src/main/java/com/test/hserver/task/TimeAdd.java
  14. 25 0
      frameworks/Java/hserver-business/src/main/java/com/test/hserver/util/DateUtil.java
  15. 18 0
      frameworks/Java/hserver-business/src/main/java/com/test/hserver/util/Util.java
  16. 6 0
      frameworks/Java/hserver-business/src/main/resources/app.properties
  17. 20 0
      frameworks/Java/hserver-business/src/main/resources/template/fortunes.ftl
  18. 5 5
      frameworks/Java/hserver/benchmark_config.json
  19. 3 3
      frameworks/Java/hserver/config.toml
  20. 3 3
      frameworks/Java/hserver/hserver.dockerfile
  21. 1 1
      frameworks/Java/hserver/pom.xml
  22. 7 4
      frameworks/Java/hserver/src/main/java/com/test/hserver/controller/TestController.java

+ 39 - 0
frameworks/Java/hserver-business/README.md

@@ -0,0 +1,39 @@
+# HServer Benchmarking Test
+This is the HServer portion of a [benchmarking test suite](../) comparing a variety of web development platforms.
+
+### Tests
+* [JSON test source](src/main/java/com/test/hserver/controller/TestController.java)
+* [Plaintext test source](src/main/java/com/test/hserver/controller/TestController.java)
+* [Data-Store test source](src/main/java/com/test/hserver/controller/TestController.java)
+* [Data-Update test source](src/main/java/com/test/hserver/controller/TestController.java)
+* [Fortunes test source](src/main/java/com/test/hserver/controller/TestController.java)
+
+## Infrastructure Software Versions
+
+* [HServer](https://gitee.com/HServer/HServer)
+* [Java OpenJDK 1.8](http://openjdk.java.net/)
+
+## Test URLs
+
+### JSON Encoding Test
+
+http://localhost:8888/json 
+
+### Plain Text Test
+
+http://localhost:8888/plaintext
+
+### Data-Store/Database Mapping Test
+
+http://localhost:8888/db?queries=2
+
+### Update Test
+
+http://localhost:8888/updates?queries=2
+
+### Fortunes Test
+
+http://localhost:8888/fortunes
+
+### Query Test
+http://localhost:8888/queries?queries=2

+ 31 - 0
frameworks/Java/hserver-business/benchmark_config.json

@@ -0,0 +1,31 @@
+
+{
+  "framework": "hserver",
+  "tests": [
+    {
+      "default": {
+        "db_url": "/db",
+        "fortune_url": "/fortunes",
+        "plaintext_url": "/plaintext",
+        "json_url": "/json",
+        "query_url": "/queries?queries=",
+        "update_url": "/updates?queries=",
+        "port": 8888,
+        "approach": "Realistic",
+        "classification": "Fullstack",
+        "database": "Postgres",
+        "framework": "hserver",
+        "language": "Java",
+        "flavor": "None",
+        "orm": "Full",
+        "platform": "hserver",
+        "webserver": "hserver",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "hserver-business",
+        "notes": "",
+        "versus": "hserver"
+      }
+    }
+  ]
+}

+ 17 - 0
frameworks/Java/hserver-business/config.toml

@@ -0,0 +1,17 @@
+[framework]
+name = "hserver-business"
+
+[main]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+urls.db = "/db"
+urls.query = "/queries?queries="
+urls.update = "/updates?queries="
+urls.fortune = "/fortunes"
+approach = "Realistic"
+classification = "Fullstack"
+os = "Linux"
+orm = "Full"
+platform = "hserver"
+webserver = "hserver"
+versus = "hserver"

+ 13 - 0
frameworks/Java/hserver-business/hserver.dockerfile

@@ -0,0 +1,13 @@
+FROM maven:3.8.4-openjdk-17-slim as maven
+WORKDIR /hserver
+COPY pom.xml pom.xml
+COPY src src
+RUN mvn package
+
+FROM openjdk:17.0.2
+WORKDIR /hserver
+COPY --from=maven /hserver/target/hserver-1.0.jar app.jar
+
+EXPOSE 8888
+
+CMD ["java", "-jar", "app.jar"]

+ 52 - 0
frameworks/Java/hserver-business/pom.xml

@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.test.hserver</groupId>
+    <artifactId>hserver</artifactId>
+    <version>1.0</version>
+
+    <parent>
+        <artifactId>hserver-parent</artifactId>
+        <groupId>cn.hserver</groupId>
+        <version>3.6.0</version>
+    </parent>
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <version.hikaricp>3.3.1</version.hikaricp>
+        <version.postgres>42.7.2</version.postgres>
+    </properties>
+
+    <dependencies>
+        <!--    核心依赖-->
+        <dependency>
+            <artifactId>hserver</artifactId>
+            <groupId>cn.hserver</groupId>
+        </dependency>
+        <!--    web框架 -->
+        <dependency>
+            <artifactId>hserver-plugin-web</artifactId>
+            <groupId>cn.hserver</groupId>
+        </dependency>
+        <dependency>
+            <groupId>com.zaxxer</groupId>
+            <artifactId>HikariCP</artifactId>
+            <version>${version.hikaricp}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+            <version>${version.postgres}</version>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>hserver-plugin-maven</artifactId>
+                <groupId>cn.hserver</groupId>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 18 - 0
frameworks/Java/hserver-business/src/main/java/com/test/hserver/StartApp.java

@@ -0,0 +1,18 @@
+package com.test.hserver;
+
+
+import cn.hserver.HServerApplication;
+import cn.hserver.core.ioc.annotation.HServerBoot;
+import cn.hserver.core.server.context.ConstConfig;
+
+
+/**
+ * @author hxm
+ */
+@HServerBoot
+public class StartApp {
+
+    public static void main(String[] args) {
+        HServerApplication.run(StartApp.class, 8888, args);
+    }
+}

+ 24 - 0
frameworks/Java/hserver-business/src/main/java/com/test/hserver/bean/Fortune.java

@@ -0,0 +1,24 @@
+package com.test.hserver.bean;
+
+public final class Fortune implements Comparable<Fortune> {
+  public final int id;
+
+  public final String message;
+
+  public Fortune(int id, String message) {
+    this.id = id;
+    this.message = message;
+  }
+  @Override
+  public int compareTo(Fortune other) {
+    return message.compareTo(other.message);
+  }
+
+  public int getId() {
+    return id;
+  }
+
+  public String getMessage() {
+    return message;
+  }
+}

+ 13 - 0
frameworks/Java/hserver-business/src/main/java/com/test/hserver/bean/Message.java

@@ -0,0 +1,13 @@
+package com.test.hserver.bean;
+
+public class Message {
+    private String message = "Hello, World!";
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+}

+ 24 - 0
frameworks/Java/hserver-business/src/main/java/com/test/hserver/bean/World.java

@@ -0,0 +1,24 @@
+package com.test.hserver.bean;
+
+public class World implements Comparable<World> {
+  private final int id;
+
+  private final int randomNumber;
+
+  public World(int id, int randomNumber) {
+    this.id = id;
+    this.randomNumber = randomNumber;
+  }
+
+  public int getId() {
+    return id;
+  }
+
+  public int getRandomNumber() {
+    return randomNumber;
+  }
+
+  @Override public int compareTo(World o) {
+    return id - o.id;
+  }
+}

+ 136 - 0
frameworks/Java/hserver-business/src/main/java/com/test/hserver/controller/TestController.java

@@ -0,0 +1,136 @@
+package com.test.hserver.controller;
+
+import cn.hserver.core.ioc.annotation.Autowired;
+import cn.hserver.plugin.web.annotation.Controller;
+import cn.hserver.plugin.web.annotation.GET;
+import cn.hserver.plugin.web.interfaces.HttpRequest;
+import cn.hserver.plugin.web.interfaces.HttpResponse;
+import com.test.hserver.bean.Fortune;
+import com.test.hserver.bean.Message;
+import com.test.hserver.bean.World;
+import com.test.hserver.util.DateUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.*;
+
+import static com.test.hserver.util.Util.getQueries;
+import static com.test.hserver.util.Util.randomWorld;
+
+/**
+ * @author hxm
+ */
+@Controller
+public class TestController {
+    private static final String HELLO = "Hello, World!";
+    private static final String SELECT_WORLD = "select * from world where id=?";
+
+    @Autowired
+    private DataSource dataSource;
+
+    @GET("/json")
+    public Message json(HttpResponse response) {
+        response.setHeader("Date", DateUtil.getTime());
+        return new Message();
+    }
+
+    @GET("/plaintext")
+    public String plaintext(HttpResponse response) {
+        response.setHeader("Date", DateUtil.getTime());
+        return HELLO;
+    }
+
+    @GET("/db")
+    public void db(HttpResponse response) throws SQLException {
+        World result;
+        try (Connection conn = dataSource.getConnection()) {
+            try (final PreparedStatement statement = conn.prepareStatement(SELECT_WORLD)) {
+                statement.setInt(1, randomWorld());
+                try (ResultSet rs = statement.executeQuery()) {
+                    rs.next();
+                    result = new World(rs.getInt("id"), rs.getInt("randomNumber"));
+                }
+            }
+        }
+        response.setHeader("Date", DateUtil.getTime());
+        response.sendJson(result);
+    }
+
+    @GET("/queries")
+    public void queries(HttpRequest request,HttpResponse response) throws Exception {
+        World[] result = new World[getQueries(request.query("queries"))];
+        try (Connection conn = dataSource.getConnection()) {
+            for (int i = 0; i < result.length; i++) {
+                try (final PreparedStatement statement = conn.prepareStatement(SELECT_WORLD)) {
+                    statement.setInt(1, randomWorld());
+                    try (ResultSet rs = statement.executeQuery()) {
+                        rs.next();
+                        result[i] = new World(rs.getInt("id"), rs.getInt("randomNumber"));
+                    }
+                }
+            }
+        }
+        response.setHeader("Date", DateUtil.getTime());
+        response.sendJson(result);
+    }
+
+
+    @GET("/updates")
+    public void updates(HttpRequest request,HttpResponse response) throws Exception {
+        World[] result = new World[getQueries(request.query("queries"))];
+        StringJoiner updateSql = new StringJoiner(
+                ", ",
+                "UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES ",
+                " ORDER BY 1) AS temp(id, randomNumber) WHERE temp.id = world.id");
+
+        try (Connection connection = dataSource.getConnection()) {
+            try (PreparedStatement statement = connection.prepareStatement(SELECT_WORLD)) {
+                for (int i = 0; i < result.length; i++) {
+                    statement.setInt(1, randomWorld());
+                    try (ResultSet rs = statement.executeQuery()) {
+                        rs.next();
+                        result[i] = new World(rs.getInt("id"), randomWorld());
+                    }
+                    // prepare update query
+                    updateSql.add("(?, ?)");
+                }
+            }
+
+            try (PreparedStatement statement = connection.prepareStatement(updateSql.toString())) {
+                int i = 0;
+                for (World world : result) {
+                    statement.setInt(++i, world.getRandomNumber());
+                    statement.setInt(++i, world.getRandomNumber());
+                }
+                statement.executeUpdate();
+            }
+        }
+        response.setHeader("Date", DateUtil.getTime());
+        response.sendJson(result);
+    }
+
+    @GET("/fortunes")
+    public void fortunes(HttpResponse response) throws Exception {
+        List<Fortune> fortunes = new ArrayList<>();
+        try (Connection connection = dataSource.getConnection()) {
+            try (PreparedStatement stt = connection.prepareStatement("select * from fortune")) {
+                try (ResultSet rs = stt.executeQuery()) {
+                    while (rs.next()) {
+                        fortunes.add(new Fortune(rs.getInt("id"), rs.getString("message")));
+                    }
+                }
+            }
+        }
+        fortunes.add(new Fortune(0, "Additional fortune added at request time."));
+        Collections.sort(fortunes);
+        response.setHeader("Date", DateUtil.getTime());
+        Map<String,Object> data=new HashMap<>();
+        data.put("data",fortunes);
+        response.sendTemplate("fortunes.ftl",data);
+    }
+}

+ 25 - 0
frameworks/Java/hserver-business/src/main/java/com/test/hserver/db/DataSourceConfig.java

@@ -0,0 +1,25 @@
+package com.test.hserver.db;
+
+import cn.hserver.core.ioc.annotation.Autowired;
+import cn.hserver.core.ioc.annotation.Bean;
+import cn.hserver.core.ioc.annotation.Configuration;
+import com.zaxxer.hikari.HikariDataSource;
+
+import javax.sql.DataSource;
+
+@Configuration
+public class DataSourceConfig {
+
+    @Autowired
+    private PostgresConfig postgresConfig;
+
+    @Bean
+    public DataSource initDataSource() {
+        HikariDataSource ds = new HikariDataSource();
+        ds.setJdbcUrl(postgresConfig.getJdbcUrl());
+        ds.setUsername(postgresConfig.getUsername());
+        ds.setPassword(postgresConfig.getPassword());
+        ds.setMaximumPoolSize(postgresConfig.getMaximumPoolSize());
+        return ds;
+    }
+}

+ 57 - 0
frameworks/Java/hserver-business/src/main/java/com/test/hserver/db/PostgresConfig.java

@@ -0,0 +1,57 @@
+package com.test.hserver.db;
+
+
+import cn.hserver.core.ioc.annotation.ConfigurationProperties;
+
+@ConfigurationProperties
+public class PostgresConfig {
+    private String jdbcUrl;
+    private String username;
+    private String password;
+    private int maximumPoolSize;
+
+    public PostgresConfig() {
+    }
+
+    public String getJdbcUrl() {
+        return jdbcUrl;
+    }
+
+    public void setJdbcUrl(String jdbcUrl) {
+        this.jdbcUrl = jdbcUrl;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public int getMaximumPoolSize() {
+        return maximumPoolSize;
+    }
+
+    public void setMaximumPoolSize(int maximumPoolSize) {
+        this.maximumPoolSize = maximumPoolSize;
+    }
+
+    @Override
+    public String toString() {
+        return "PostgresConfig{" +
+                "jdbcUrl='" + jdbcUrl + '\'' +
+                ", username='" + username + '\'' +
+                ", password='" + password + '\'' +
+                ", maximumPoolSize=" + maximumPoolSize +
+                '}';
+    }
+}

+ 15 - 0
frameworks/Java/hserver-business/src/main/java/com/test/hserver/task/TimeAdd.java

@@ -0,0 +1,15 @@
+package com.test.hserver.task;
+
+import cn.hserver.core.ioc.annotation.Bean;
+import cn.hserver.core.ioc.annotation.Task;
+import com.test.hserver.util.DateUtil;
+
+@Bean
+public class TimeAdd {
+
+    @Task(name = "时间计算", time = "1000")
+    public void add() {
+        DateUtil.time = DateUtil.getNow();
+    }
+
+}

+ 25 - 0
frameworks/Java/hserver-business/src/main/java/com/test/hserver/util/DateUtil.java

@@ -0,0 +1,25 @@
+package com.test.hserver.util;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
+
+/**
+ * @author hxm
+ */
+public class DateUtil {
+    private static final DateTimeFormatter GMT_FMT = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
+    private static final ZoneId zoneId = ZoneId.of("GMT");
+    public static String getNow() {
+        return GMT_FMT.format(LocalDateTime.now().atZone(zoneId));
+    }
+    public static String time;
+    public static String getTime(){
+        if (time==null){
+            time=getNow();
+            return time;
+        }
+        return time;
+    }
+}

+ 18 - 0
frameworks/Java/hserver-business/src/main/java/com/test/hserver/util/Util.java

@@ -0,0 +1,18 @@
+package com.test.hserver.util;
+
+import java.util.concurrent.ThreadLocalRandom;
+
+public class Util {
+  public static int randomWorld() {
+    return 1 + ThreadLocalRandom.current().nextInt(10000);
+  }
+
+  public static int getQueries(String queries) {
+    try {
+      int count = Integer.parseInt(queries);
+      return Math.min(500, Math.max(1, count));
+    } catch (Exception e) {
+      return 1;
+    }
+  }
+}

+ 6 - 0
frameworks/Java/hserver-business/src/main/resources/app.properties

@@ -0,0 +1,6 @@
+jdbcUrl= jdbc:postgresql://tfb-database:5432/hello_world
+username= benchmarkdbuser
+password= benchmarkdbpass
+maximumPoolSize= 256
+
+log=info

+ 20 - 0
frameworks/Java/hserver-business/src/main/resources/template/fortunes.ftl

@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <title>Fortunes</title>
+</head>
+<body>
+<table>
+  <tr>
+    <th>id</th>
+    <th>message</th>
+  </tr>
+  <#list data as fortune>
+    <tr>
+      <td>${fortune.id?html}</td>
+      <td>${fortune.message?html}</td>
+    </tr>
+  </#list>
+</table>
+</body>
+</html>

+ 5 - 5
frameworks/Java/hserver/benchmark_config.json

@@ -5,11 +5,11 @@
     {
     {
       "default": {
       "default": {
         "db_url": "/db",
         "db_url": "/db",
-        "query_url": "/queries?queries=",
         "fortune_url": "/fortunes",
         "fortune_url": "/fortunes",
         "plaintext_url": "/plaintext",
         "plaintext_url": "/plaintext",
-        "update_url": "/updates?queries=",
         "json_url": "/json",
         "json_url": "/json",
+        "query_url": "/queries?queries=",
+        "update_url": "/updates?queries=",
         "port": 8888,
         "port": 8888,
         "approach": "Realistic",
         "approach": "Realistic",
         "classification": "Fullstack",
         "classification": "Fullstack",
@@ -18,8 +18,8 @@
         "language": "Java",
         "language": "Java",
         "flavor": "None",
         "flavor": "None",
         "orm": "Full",
         "orm": "Full",
-        "platform": "None",
-        "webserver": "None",
+        "platform": "hserver",
+        "webserver": "hserver",
         "os": "Linux",
         "os": "Linux",
         "database_os": "Linux",
         "database_os": "Linux",
         "display_name": "hserver",
         "display_name": "hserver",
@@ -28,4 +28,4 @@
       }
       }
     }
     }
   ]
   ]
-}
+}

+ 3 - 3
frameworks/Java/hserver/config.toml

@@ -12,6 +12,6 @@ approach = "Realistic"
 classification = "Fullstack"
 classification = "Fullstack"
 os = "Linux"
 os = "Linux"
 orm = "Full"
 orm = "Full"
-platform = "None"
-webserver = "None"
-versus = "hserver"
+platform = "hserver"
+webserver = "hserver"
+versus = "hserver"

+ 3 - 3
frameworks/Java/hserver/hserver.dockerfile

@@ -1,13 +1,13 @@
-FROM maven:3.6.3-openjdk-8-slim as maven
+FROM maven:3.8.4-openjdk-17-slim as maven
 WORKDIR /hserver
 WORKDIR /hserver
 COPY pom.xml pom.xml
 COPY pom.xml pom.xml
 COPY src src
 COPY src src
 RUN mvn package
 RUN mvn package
 
 
-FROM openjdk:8u275-jdk-slim
+FROM openjdk:17.0.2
 WORKDIR /hserver
 WORKDIR /hserver
 COPY --from=maven /hserver/target/hserver-1.0.jar app.jar
 COPY --from=maven /hserver/target/hserver-1.0.jar app.jar
 
 
 EXPOSE 8888
 EXPOSE 8888
 
 
-CMD ["java", "-jar", "app.jar"]
+CMD ["java", "-jar", "app.jar"]

+ 1 - 1
frameworks/Java/hserver/pom.xml

@@ -11,7 +11,7 @@
     <parent>
     <parent>
         <artifactId>hserver-parent</artifactId>
         <artifactId>hserver-parent</artifactId>
         <groupId>cn.hserver</groupId>
         <groupId>cn.hserver</groupId>
-        <version>3.5.M2</version>
+        <version>3.6.0</version>
     </parent>
     </parent>
     <properties>
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

+ 7 - 4
frameworks/Java/hserver/src/main/java/com/test/hserver/controller/TestController.java

@@ -3,11 +3,14 @@ package com.test.hserver.controller;
 import cn.hserver.core.ioc.annotation.Autowired;
 import cn.hserver.core.ioc.annotation.Autowired;
 import cn.hserver.plugin.web.annotation.Controller;
 import cn.hserver.plugin.web.annotation.Controller;
 import cn.hserver.plugin.web.annotation.GET;
 import cn.hserver.plugin.web.annotation.GET;
+import cn.hserver.plugin.web.interfaces.HttpRequest;
 import cn.hserver.plugin.web.interfaces.HttpResponse;
 import cn.hserver.plugin.web.interfaces.HttpResponse;
 import com.test.hserver.bean.Fortune;
 import com.test.hserver.bean.Fortune;
 import com.test.hserver.bean.Message;
 import com.test.hserver.bean.Message;
 import com.test.hserver.bean.World;
 import com.test.hserver.bean.World;
 import com.test.hserver.util.DateUtil;
 import com.test.hserver.util.DateUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 
 import javax.sql.DataSource;
 import javax.sql.DataSource;
 import java.sql.Connection;
 import java.sql.Connection;
@@ -59,8 +62,8 @@ public class TestController {
     }
     }
 
 
     @GET("/queries")
     @GET("/queries")
-    public void queries(String queries,HttpResponse response) throws Exception {
-        World[] result = new World[getQueries(queries)];
+    public void queries(HttpRequest request,HttpResponse response) throws Exception {
+        World[] result = new World[getQueries(request.query("queries"))];
         try (Connection conn = dataSource.getConnection()) {
         try (Connection conn = dataSource.getConnection()) {
             for (int i = 0; i < result.length; i++) {
             for (int i = 0; i < result.length; i++) {
                 try (final PreparedStatement statement = conn.prepareStatement(SELECT_WORLD)) {
                 try (final PreparedStatement statement = conn.prepareStatement(SELECT_WORLD)) {
@@ -78,8 +81,8 @@ public class TestController {
 
 
 
 
     @GET("/updates")
     @GET("/updates")
-    public void updates(String queries,HttpResponse response) throws Exception {
-        World[] result = new World[getQueries(queries)];
+    public void updates(HttpRequest request,HttpResponse response) throws Exception {
+        World[] result = new World[getQueries(request.query("queries"))];
         StringJoiner updateSql = new StringJoiner(
         StringJoiner updateSql = new StringJoiner(
                 ", ",
                 ", ",
                 "UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES ",
                 "UPDATE world SET randomNumber = temp.randomNumber FROM (VALUES ",