上次(中间隔了很久)做了一个用post请求获取数据库中的数据给ECharts使用的Demo,这次写一个用Action实现的。两种方法的转换很简单,只是多了Struts框架!

1.创建数据表

在上次创建的test数据库中新建line表,如下:

CREATE TABLE `line` (                                
          `day` varchar(20) DEFAULT NULL COMMENT '日期',`num` int(11) DEFAULT NULL COMMENT '出游人数'  
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8

2.导入Struts相关包

在上次创建的echarts_demo项目中,导包,分别是:

commons-logging-1.0.4.jar

freemarker-2.3.8.jar

ognl-2.6.11.jar

struts2-core-2.0.14.jar

xwork-2.0.7.jar

3.创建Bean对象

在com.lgw.bean中创建Line对象,代码如下:

package com.lgw.bean;

public class Line {
	private String day;	//日期
	private int num;	//出游人数

	public String getDay() {
		return day;
	}
	public void setDay(String day) {
		this.day = day;
	}
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	
}

4.创建DAO

在com.lgw.dao中新建LineDao对象,作用是取MysqL中的数据,代码如下:

package com.lgw.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.sqlException;
import java.util.ArrayList;

import com.lgw.bean.Line;

public class LineDao {

	/**
	 * @author wen
	 * 
	 * 查询所有出游人数数据
	 * @return 存放所有数据的线性表
	 */
	public ArrayList<Line> query() {
		ArrayList<Line> lineArr = new ArrayList<Line>();
		try {
			//JDBC方式连接MysqL数据库
			Class.forName("com.MysqL.jdbc.Driver");
			Connection conn = DriverManager.getConnection(
					"jdbc:MysqL://localhost:3306/test?characterEncoding=utf8","root","");
			PreparedStatement stmt = conn.prepareStatement("SELECT * FROM line");
			ResultSet rs = stmt.executeQuery();
			//将line表中的数据存储到线性表中
			while(rs.next()) {
				Line line = new Line();
				line.setDay(rs.getString("day"));
				line.setNum(rs.getInt("num"));
				lineArr.add(line);
			}
			//关闭连接
			conn.close();
		} catch (sqlException e) {
			e.printstacktrace();
		} catch (ClassNotFoundException e) {
			e.printstacktrace();
		}
		return lineArr;
	}
}

5.创建action

新建com.lgw.action包,在包中创建Action对象,代码如下:

package com.lgw.action;

import java.util.ArrayList;

import com.lgw.bean.Line;
import com.lgw.dao.LineDao;
import com.lgw.util.Toolkit;
import com.opensymphony.xwork2.ActionSupport;

public class LineAction extends ActionSupport {

	private String day;
	private String num;
	
	public String getDay() {
		return day;
	}

	public void setDay(String day) {
		this.day = day;
	}

	public String getNum() {
		return num;
	}

	public void setNum(String num) {
		this.num = num;
	}

	@Override
	public String execute() throws Exception {
		LineDao lineDao = new LineDao();
		ArrayList<Line> lineArr = lineDao.query();

		ArrayList<String> dayArr = new ArrayList<>();
		ArrayList<Integer> numArr = new ArrayList<>();
		
		for(int i=0; i<lineArr.size(); i++) {
			dayArr.add(lineArr.get(i).getDay());
			numArr.add(lineArr.get(i).getNum());
		}
		this.day = Toolkit.convertStringArray(dayArr);
		this.num = numArr.toString();
		
		return lineArr!=null && !lineArr.equals("") ? SUCCESS : ERROR;
	}
}

在JSP中,一切皆为字符串。在JavaScript中,ECharts的构建使用的数据是字符串,即可以在JSP中通过获取request对象中的字符串来构建图表。因此,这里在Action中定义两个字符串day和num。例如,day字符串的值为:['2016-11-01','2016-11-02','2016-11-03','2016-11-04','2016-11-05','2016-11-06','2016-11-07','2016-11-08','2016-11-09','2016-11-10'],num字符串的值为:[2000,1500,1000,500,2000,2500,3000,3500,4000,5000]。但是注意,构建字符串的ArrayList数组中的元素如果也是字符串,那么应该给数组元素加单引号,经过测试如果不加单引号,则JavaScript会将其解析成你不希望的数据,所以,我还定义了一个工具类,新建com.lgw.utils.Toolkit.java,代码如下:
package com.lgw.util;

import java.util.ArrayList;

public class Toolkit {

	public static String convertStringArray(ArrayList<String> str) {
		StringBuffer result = new StringBuffer();
		result.append("[");
		int i;
		for(i=0; i<str.size()-1; i++) {
			result.append("'"+str.get(i)+"',");
		}
		result.append("'"+str.get(i)+"']");
		return result.toString();
	}
}

6.配置struts

在src目录下,新建struts.xml,为上面创建的Action做配置,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
	<package name="default" extends="struts-default">
		<action name="lineAction" class="com.lgw.action.LineAction">
			<result name="success">/test_line.jsp</result>
			<result name="error">/test_line.jsp</result>
		</action>
	</package>
</struts>

7.配置web.xml

不用忘了为Struts添加过滤器,与上次Servlet整合之后的web.xml代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<welcome-file-list>
		<welcome-file>test_line.jsp</welcome-file>
	</welcome-file-list>

	<!-- 注册servlet -->
	<servlet>
		<servlet-name>barService</servlet-name>
		<servlet-class>com.lgw.servlet.BarService</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>barService</servlet-name>
		<url-pattern>/bar.do</url-pattern>
	</servlet-mapping>
	
	<!-- Struts配置 -->
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>
			org.apache.struts2.dispatcher.Filterdispatcher
		</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

8.创建页面

创建test_line.jsp,展示我们的ECharts图表,代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%
	String path = request.getcontextpath();
	String basePath = request.getScheme() + "://" + request.getServerName()
			+ ":" + request.getServerPort()	+ path + "/";
	String day = (String)request.getAttribute("day");
	String num = (String)request.getAttribute("num");
%>
<!DOCTYPE>
<head>
	<Meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>Hello ECharts</title>
	<!-- 使用单文件引入的方式使用ECharts.JS -->
	<script src="echarts-all.js"></script>
	<script src="jquery.js"></script>
</head>
<body>
	<form action="lineAction.action" method="post">
		<input type="submit" value="查看折线图" />
	</form>
	<!-- DOM用来设置展示ECharts图表的区域 -->
	<div id="myDiv" style="height: 400px"></div>
	<script type="text/javascript">
		var myChart = echarts.init(document.getElementById('myDiv'),'macarons');
		var data_x = <%=day%>;
		var data_y = <%=num%>;
		var option = {
			tooltip : {
				show : true
			},legend : {
				data : [ '出游人数' ]
			},xAxis : [ {
				type : 'category',data : data_x
			} ],yAxis : [ {
				type : 'value',} ],series : [ {
				name : '出游人数',type : 'line',data : data_y
			} ]
		};
		//设置option
		myChart.setoption(option);
	</script>
</body>

9.部署项目到tomcat

在tomcat中运行echarts_demo项目,在浏览器中输入http://localhost:8080/echarts_demo,运行结果如下:


这次不上传代码了···

不使用AJAX向ECharts送入MySQL中的数据2:action方式的更多相关文章

  1. iOS:用于填充异步提取数据的设计模式

    我正在开发一个从Web获取数据并将其显示给用户的应用程序.假设数据是餐馆的评论,并且在一个视图上显示一个评论.用户可以向左或向右滑动以转到上一个/下一个评论.数据是异步提取的.这是问题陈述–假设已经提取了5条评论,并且用户正在查看当前的第3条评论.现在,第6次审核被提取,我想将其显示为用户的第4次审核.我的模型类应该如何通知视图控制器?除上述3之外的其他建议值得欢迎!

  2. ios – 1天后firebase crashlytics报告中没有数据

    解决方法对于那些仍然有问题的人.检查您的podfile中是否还有pod’Firebase/Crash’.当我删除旧的Firebase崩溃报告时,我的问题已修复.

  3. 将AWS DynamoDB表中的数据加载到iOS上的UITableView

    我的iOS应用程序中使用Swift编写的一个屏幕是UITableView.在这个UITableView中,我想从AWSDynamoDB表中加载名为Books的数据.目前,这是我在故事板上的原型单元格:在表格中我有3个属性:“名称”,“价格”和“ISBN”.我想要的是扫描“书籍”表,并过滤结果,因此结果的“ISBN”属性将包含数字“9”.在我筛选结果后,我想将它们应用到UITableView,因此“

  4. ios – 未为测试目标生成核心数据类

    我使用CoreData的自动生成的类.除测试目标外,我的项目还有3个目标.对于每个目标,正确生成CoreData类,我通过检查DerivedData文件夹进行验证.但是,尽管在核心数据模型文件中打勾,但不会为测试目标生成类.当我尝试引用测试目标中的一个CoreData类时,这会导致“未声明的标识符”和“使用未声明的类型”错误.我该如何解决这个问题?

  5. ios – NSURLCache和数据保护

    我正在尝试保护存储在NSURLCache中的敏感数据.我的应用程序文件和CoreDatasqlite文件设置为NSFileProtectionComplete.但是,我无法将NSURLCache文件数据保护级别更改为NSFileProtectionCompleteUntilFirstUserAuthentication以外的任何其他级别.这会在设备锁定时暴露缓存中的任何敏感数据.我需要缓存响应,以

  6. ios – 领域:如何获取数据库的当前大小

    是否有RealmAPI方法使用RealmSwift作为数据存储来获取我的RealmSwift应用程序的当前数据库大小?

  7. 核心数据 – 核心数据NSPersistentStore问题

    我正在开发一个分阶段推出的应用程序.对于每个sprint,都有数据库更改,因此已实现核心数据迁移.到目前为止,我们已经有3个阶段发布.每当连续升级时,应用程序运行正常.但每当我尝试从版本1升级到版本3时,都会发生’无法添加持久存储’错误.有人可以帮我解决这个问题吗?

  8. iOS Swift在哪里存储用户登录数据或OAuth令牌?

    事情并不像在用户手机上存储登录数据的最佳做法那样清晰.有人建议将userID=123和loggedIn=true类型数据等数据存储在NSUSerDefaults数据中.然而根据我的理解,根据这篇文章https://www.andyibanez.com/nsuserdefaults-not-for-sensitive-data/,这些数据可以很容易地被操作所以问题是:当用户浏览各种屏幕时,持久登录数

  9. ios – Swift – 使用字典数组从字典访问数据时出错

    我有一个非常简单的例子,说明我想做什么基本上,我有一个字典,其值包含[String:String]字典数组.我把数据填入其中,但当我去访问数据时,我收到此错误:Cannotsubscriptavalueoftype‘[([String:String])]?’withanindexoftype‘Int’请让我知道我做错了什么.解决方法您的常量数组是可选的.订阅字典总是返回一个可选项.你必须打开它.更

  10. ios – React native error – react-native-xcode.sh:line 45:react-native:command not found命令/ bin/sh失败,退出代码127

    尝试构建任何(新的或旧的)项目时出现此错误.我的节点是版本4.2.1,react-native是版本0.1.7.我看过其他有相同问题的人,所以我已经更新了本机的最新版本,但是我仍然无法通过xcode构建任何项目.解决方法要解决此问题,请使用以下步骤:>使用节点版本v4.2.1>cd进入[你的应用]/node_modules/react-native/packager>$sh./packager.s

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部