Java 客户端后台使用HTTP POST传递对象参数到服务器端

       最近公司要求为系统做个离线版,在此之前,我已经提交辞职申请准备离开公司了。临走之际先把工作做好,这是对自己的工作负责。所以,也算是在这告诫大家,就算提交辞职报告了,也尽量把该做的工作做好,不要去说爱做不做之类的,大家好聚好散。好了,接下来进入正题。

       近期公司想弄一个离线版系统,以便客户在断网状态下仍可使用系统某些功能。

       首先,打包好离线版项目、Tomcat、JRE和迷你SQL2000等,然后创建自解压文件,添加一键安装注释,最后双击发布运行。

       1、使用工具:Tomcat、JRE、迷你SQL2000
       2、离线版制作步骤

[2.1]将Tomcat和JRE运行环境放到离线版文件夹下,修改初始化.bat文件注册Java环境变量      

@echo off
cls
color 2f
echo.
echo **********************************************
echo.
echo 一键安装 Java SE Development Kit 到 C 盘
echo.
echo 安装请按任意键,退出直接关闭窗口
echo.
echo **********************************************
echo.
pause
set myjavapath=C:\BJCAROOT\jre1.8.0_161
set nowpath=%~dp0
IF EXIST %myjavapath%\bin\java.exe (
echo. 自动配置java环境变量—
echo. 
echo 在 C 盘发现java程序,注册环境变量请按任意键
echo.
echo 退出直接关闭窗口
echo.
pause
goto SETENV
)

echo.
echo 正在安装jdk,请不要执行其他操作
echo.
::echo 请稍等......这个时间大约需要二、三分钟
echo.
::start /WAIT %nowpath%jdk-7u79-windows-i586.exe /s /norestart /v /qn INSTALLDIR=C:\Java\jdk
echo 程序安装完毕,正在注册环境变量
echo.
goto SETENV

:SETENV
setx JAVA_HOME %myjavapath%
setx CLASSPATH .;%myjavapath%\lib
setx PATH %myjavapath%\bin
echo.
echo JDK环境变量设置成功 
echo.
echo 安装完毕,JDK版本为:
echo.
call %myjavapath%\bin\java.exe -version
echo.

if %errorlevel% == 0 (
echo 祝贺您成功安装了Java SE Development Kit !
echo.
goto END
)
echo 貌似安装不成功,您得自己想办法了,请联系QQ客服12121212!
echo.
goto END

:END
pause
       这里注意绿色高亮的部分,由于是自解压模式,所以我们要把JRE解压到我们自定义的文件夹下,用于环境变量设置。这里jre的版本是在电脑安装解压后拷贝到离线版根目录下的。

[2.2]修改Tomcat bin目录下的startup.bat文件,添加迷你SQL2000随着Tomcat启动

SET JAVA_HOME=C:\BJCAROOT\jre1.8.0_161
SET CATALINA_HOME=C:\BJCAROOT\XXXweb\Tomcat 8.0
@echo off
setlocal

rem Guess CATALINA_HOME if not defined
set "CURRENT_DIR=%cd%"
set b=%cd%
start /min "" "%b%\SQL2000\Sql2k.exe"
if not "%CATALINA_HOME%" == "" goto gotHome
set "CATALINA_HOME=%CURRENT_DIR%"
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
cd ..
set "CATALINA_HOME=%cd%"
cd "%CURRENT_DIR%"
:gotHome
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
echo The CATALINA_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program
goto end
:okHome
注意绿色高亮部分,在startup.bat文件开头设置好Tomcat的java环境变量和Tomcat的环境变量,防止Tom启动时运行用户电脑的Tomcat环境。迷你SQL2000的文件夹放在bin根目录下。

[2.3]创建自解压文件


前面两句是解压到的文件夹,后面是发送Tomcat启动bat文件和系统URL到桌面

URL代码:

[DEFAULT]
BASEURL=http://localhost:8080/xxx/
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
URL=http://localhost:8080/xxx/
IDList=
3、离线端代码
[3.1]离线端service代码
   //ServiceImpl代码:
   //服务器接口地址
    public static final String httpURL = "http://localhost:8090/offLine.do?";
	
    //核心代码:	
	
	//调用传参代码
	 result = doUpload(httpURL + "uploadNID",array);  //返回json字符串
	 
   /**
     * @details 发送请求到服务器并返回结果
     * @param url 请求地址
     * @param array 发送参数 JSONArray类型
     * @author src
     * @Date 2018-03-02
     */
    public String doUpload(String url , JSONArray array)throws IOException{
        HttpURLConnection httpURLConnection = null;
        OutputStream out = null; //写
        InputStream in = null;   //读
        int responseCode = 0;    //远程主机响应的HTTP状态码
        String result="";
        try{
            URL sendUrl = new URL(url);
            httpURLConnection = (HttpURLConnection)sendUrl.openConnection();
            //post方式请求
            httpURLConnection.setRequestMethod("POST");
            //设置头部信息
            httpURLConnection.setRequestProperty("headerdata", "ceshiyongde");
            //一定要设置 Content-Type 要不然服务端接收不到参数
            httpURLConnection.setRequestProperty("Content-Type", "application/Json; charset=UTF-8");
            //指示应用程序要将数据写入URL连接,其值默认为false(是否传参)
            httpURLConnection.setDoOutput(true);

            httpURLConnection.setUseCaches(false);
            httpURLConnection.setConnectTimeout(30000); //30秒连接超时
            httpURLConnection.setReadTimeout(30000);    //30秒读取超时
            //传入参数
            out = httpURLConnection.getOutputStream();
            out.write(array.toString().getBytes());
            out.flush(); //清空缓冲区,发送数据
            out.close();
            responseCode = httpURLConnection.getResponseCode();
            //获取请求的资源
            BufferedReader br = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(),"UTF-8"));
            result =br.readLine();
        }catch(Exception e) {
            HashMap map = new HashMap();
            map.put("status","500");
            map.put("detail","抱歉,服务器内部错误!");
            result = JSONObject.fromObject(map).toString();
            e.printStackTrace();
        }
        return result;
    }
[3.2]离线端js代码
   /**
     * @details 上传问卷
     * @author src
     * @Date 2018-03-02
     */
    function upLoadQue(){
        //[1] 获取要上传的问卷id
        var options = $('#dg').datagrid('getSelections');
        var ids = "";
        for(var i in options){
            if(i==options.length-1){
                ids += options[i].id+",";
            }else{
                ids += options[i].id;
            }
        }
//        alert(JSON.stringify(ids));
        //[2]将id数组传至后台
        $.ajax({
            url:"offLineController.do?uploadNID",
            type:"POST",
            data:{
                ids:ids
            },
            success: function (data) {
                //[3]当返回状态码为200时,删除离线版本地问卷报表数据
            }
        });
    }
4、服务器端代码

[4.1]控制器代码

   /**
     * @details 接收离线版客户端传递的数据
     * @author src
     * @Date 2018-03-03
     */
    @RequestMapping(params = "getOffLine")
    public JSONArray getOffLine(HttpServletRequest request) throws Exception {
        request.setCharacterEncoding("UTF-8");
        BufferedReader br=new BufferedReader(new InputStreamReader(request.getInputStream(), "GB2312"));
        String line="";
        String res="";
        while(null!=(line=br.readLine())){
            res+=line;
        }
        JSONArray array=JSONArray.fromObject(res);
        return array;
    }

    /**
     * @details 返回状态到离线版客户端
     * @param result 带状态码的结果
     * @author src
     * @Date 2018-03-03
     */
    @RequestMapping(params = "responseToOffLine")
    public void responseToOffLine(HttpServletResponse response ,String result ) throws IOException {
        response.setCharacterEncoding("utf-8");
        response.getWriter().append(result);
    }
[4.2]service层代码
   /**
     * @details 队列上报问卷
     * @author src
     * @Date 2018-03-02
     */
    public String uploadNID(HttpServletRequest request , JSONArray array){
        HashMap<String,Object> map = new HashMap<>();
        try{
            for(int i=0;i<array.size();i++){
                JSONObject list = array.getJSONObject(i);
                List<Map<String,Object>> list1 = (List<Map<String,Object>>)list.get("renyxxList");
                List<Map<String,Object>> list2 = (List<Map<String,Object>>)list.get("renqkqkList");
                if(list.size()>0){
                    System.out.println("现住址是:" + list1.get(0).get("xianzz"));
                }
                if(list2.size()>0) {
                    System.out.println("所属队列:" + list2.get(0).get("suosdl"));
                }
            }
            map.put("status",ResultCodeUtil.CODE_404);
            map.put("detail",ResultCodeUtil.CODE_404_DETAIL);
        }catch (Exception e){
            map.put("status",ResultCodeUtil.CODE_500);
            map.put("detail",ResultCodeUtil.CODE_500_DETAIL);
            e.printStackTrace();
        }
        String jsonStr = JSONObject.fromObject(map).toString();//输出json字符串形式
        return jsonStr;
    }	
[4.3]状态码工具类
/**
 * @author src
 * @details json返回状态码工具类
 * @date 2018-03-03
 */
public class ResultCodeUtil {

    public static final String CODE_200 = "200";
    public static final String CODE_404 = "404";
    public static final String CODE_500 = "500";
    public static final String CODE_504 = "504";
    public static final String CODE_505 = "505";

    public static final String CODE_200_DETAIL = "恭喜您,请求成功!";
    public static final String CODE_404_DETAIL = "很抱歉,请求资源找不到了!";
    public static final String CODE_500_DETAIL = "很抱歉,服务器运行错误!";
    public static final String CODE_504_DETAIL = "很抱歉,数据返回为null!";
    public static final String CODE_505_DETAIL = "很抱歉,请求超时!";
}
5、调用结果


最后发布的时候,把离线版编译后的war包打包到离线版的Tomcat下,用户自解压的项目运行。下面送上自解压目录结构图

整体结构:


web目录


Tomcat和迷你SQL2000


好了,到这里离线版和服务器端就搭建好了,以后再需要到就回来复习复习。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是用 Java 实现一个简单的 HTTP 服务器,可以接收客户的 GET 和 POST 请求的代码示例: ```java import java.io.*; import java.net.*; public class HTTPServer { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(8080); // 创建一个服务器的Socket对象,监听口号为8080 System.out.println("Server is listening on port 8080..."); while (true) { Socket clientSocket = serverSocket.accept(); // 接收客户的请求 System.out.println("A new client is connected : " + clientSocket); // 读取客户发送的HTTP请求数据 BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) { if (inputLine.isEmpty()) break; // 当读取到空行时,表示HTTP请求头已经读取完毕 System.out.println(inputLine); } // 响应客户的请求 PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); out.println("HTTP/1.1 200 OK"); out.println("Content-Type: text/html"); out.println("\r\n"); out.println("<h1>Hello World!</h1>"); // 关闭流和Socket对象 in.close(); out.close(); clientSocket.close(); } } catch (IOException e) { e.printStackTrace(); } } } ``` 上面的代码会创建一个服务器的 Socket 对象,监听口号为 8080,然后通过 `accept()` 方法接收客户的连接请求。当客户连接成功后,服务器会读取客户发送的 HTTP 请求头数据,然后响应客户的请求,最后关闭连接。 如果客户发送的是 GET 请求,那么请求数据会包含在 HTTP 请求头的第一行中,例如: ``` GET / HTTP/1.1 Host: localhost:8080 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive Upgrade-Insecure-Requests: 1 ``` 如果客户发送的是 POST 请求,那么请求数据会包含在 HTTP 请求头的第二行后面,例如: ``` POST / HTTP/1.1 Host: localhost:8080 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Content-Type: application/x-www-form-urlencoded Content-Length: 13 Connection: keep-alive Upgrade-Insecure-Requests: 1 username=admin&password=123456 ``` 在上面的代码示例中,服务器只是简单地响应客户的请求,返回一个固定的字符串。如果需要根据客户的请求动态生成响应数据,可以在响应的代码中编写相应的逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值