java web(struts2)+python+mysql 的简单实践

本文章主要演示如何通过struts2中的动作类将表单的数据传递给python脚本文件,再通过脚本插入mysql数据库中。

主要文件包括:py_form.jsp(输入表单数据)、py_success.jsp(操作成功提示)、struts.xml(struts2核心控制器配置)、web.xml(过滤器配置)、pyAction.class(动作类,用于响应表单提交)、form.py(表单数据处理)、struts2及操作python脚本所需的jar包,接下来贴出详细代码及相关文件:

struts.xml(struts2核心控制器配置)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "struts-2.1.7.dtd" >
<struts>
    <package name="hello" extends="struts-default">
        <!-- pyAction -->
        <action name="python" class="cn.itcast.action.pyAction">
            <result name="success">/py_success.jsp</result>
            <result name="error">/py_error.jsp</result>
        </action>
    </package>
</struts>

 

web.xml(过滤器配置)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>chapter</display-name>
  <filter>
      <filter-name>struts2</filter-name>
      <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

 

pyAction.class(动作类,用于响应表单提交)

package cn.itcast.action;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import com.opensymphony.xwork2.ActionSupport;
public class pyAction extends ActionSupport {

    private String name;
    
    public String getName() { return name; }

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

    public String execute() throws Exception {
        String username = name;
        System.out.println("start...");
        System.out.println("调用py脚本连接mySQL数据库...");
        String[] args1 = new String[]{"python", "D:\\form.py", username};
        Process pr = Runtime.getRuntime().exec(args1);
        BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
        
        //打印脚本中的print()的内容
        String line;
        while((line = in.readLine()) != null){
            System.out.println(line);
        }
        in.close();
        /*waitFor():导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止。
        如果已终止该子进程,此方法立即返回。如果没有终止该子进程,调用的线程将被阻塞,直到退出子进程,
        根据惯例,0 表示正常终止*/
        pr.waitFor();
        System.out.println("操作结束!");
        return SUCCESS;
    }
}

 

form.py(表单数据处理)

from sqlalchemy import create_engine
import pandas as pd
import sys

# sys.argv[]:一个从程序外部获取参数的桥梁,从外部取得的参数可以是多个,所以获得的是一个列表(list),。其第一个元素是程序本身,随后才依次是外部给予的参数。
test = sys.argv[1]

engine = create_engine(r'mysql+pymysql://root:root@localhost:3306/test?charset=utf8')
print("连接成功,正在插入数据到数据表test2...")
data = pd.DataFrame({'name': [test]})
data.to_sql('test2', con=engine, if_exists = 'append')
print("插入数据成功...")

 

struts2及操作python脚本所需的jar包(由于当前信号较差,几次上传附件失败,故仅截图)

 

py_form.jsp(输入表单数据)

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>My JSP 'py_form.jsp' starting page</title>
  </head>
  
  <body>
    <form action='python' method='post'>
        <input type='text' name='name' />
        <input type='submit' value='提交' />
    </form>
  </body>
</html>

 

 

py_success.jsp(操作成功提示)

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'py_success.jsp' starting page</title>
  </head>
  
  <body>
    ${name }  登录成功
  </body>
</html>

 

 

运行成功后在myeclipse控制台输出如下

 

posted @ 2019-03-10 16:24  袖白、  阅读(401)  评论(0编辑  收藏  举报