本文章主要演示如何通过struts2中的动作类将表单的数据传递给python脚本文件,再通过脚本插入mysql数据库中。
主要文件包括:py_form.jsp(输入表单数据)、py_success.jsp(操作成功提示)、struts.xml(struts2核心控制器配置)、web.xml(过滤器配置)、pyAction.class(动作类,用于响应表单提交)、form.py(表单数据处理)、struts2及操作python脚本所需的jar包,接下来贴出详细代码及相关文件:
struts.xml(struts2核心控制器配置)
/py_success.jsp
/py_error.jsp
web.xml(过滤器配置)
chapter
struts2
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
struts2
/*
pyAction.class(动作类,用于响应表单提交)
packagecn.itcast.action;importjava.io.BufferedReader;importjava.io.InputStreamReader;importcom.opensymphony.xwork2.ActionSupport;public class pyAction extendsActionSupport {privateString name;public String getName() { returnname; }public void setName(String name) { this.name =name; }public String execute() throwsException {
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(newInputStreamReader(pr.getInputStream()));//打印脚本中的print()的内容
String line;while((line = in.readLine()) != null){
System.out.println(line);
}
in.close();/*waitFor():导致当前线程等待,如有必要,一直要等到由该 Process 对象表示的进程已经终止。
如果已终止该子进程,此方法立即返回。如果没有终止该子进程,调用的线程将被阻塞,直到退出子进程,
根据惯例,0 表示正常终止*/pr.waitFor();
System.out.println("操作结束!");returnSUCCESS;
}
}
form.py(表单数据处理)
from sqlalchemy importcreate_engineimportpandas as pdimportsys#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(输入表单数据)
My JSP 'py_form.jsp' starting pagepy_success.jsp(操作成功提示)
My JSP 'py_success.jsp' starting page ${name } 登录成功运行成功后在myeclipse控制台输出如下